Zpět na blog
Vzdělávání

Úvod do Data Science a Machine Learning

Miroslav Beka
18.04.2020
5 minut čtení
Úvod do Data Science a Machine Learning
Na začátku, kdy člověk vstupuje do Data Science je velmi důležité pochopit, co se skrývá za různými označeními. Lidé si umějí některé pojmy mýlit a proto bych v tomto článku rád velmi zrychleně prošel přes některé základní součásti.

Data Science je proces

Za tímto výrazem se skrývá celá posloupnost úkolů, které musí datascience inženýr provést.

První fáze je silně propojena s byznysem. Používají se zde proto různé byznys výrazy (Business Intelligence). Jak efektivně umíme využít software k dosažení cílů firmy? Pracovat pro firmu jako data scientist vyžaduje pochopení potřeb byznysu. V této fázi je také velmi důležité odkomunikovat, jaké jsou možnosti Data Science a čeho lze reálně dosáhnout a co ne. Spousta manažerů totiž nerozumí technické stránce věci a ty jako datascience inženýr jsi tam na to, abys jim to vysvětlil lidskou řečí.

Druhá fáze je příprava dat. Nějaká data může mít firma již nasbíraná, jiná je třeba koupit nebo najít nový způsob jak sesbírat to, co potřebuješ. Takže tady se budeš hrabat v databázích, vytahovat různá data, spojovat všechno dohromady do nějakého smysluplného celku. Také musíš umět vizualizovat tato data, abys viděl, co máš na ruce. Třeba si ověřit, že data mají tu kvalitu, jakou očekáváš. Často se totiž stává, že data jsou vadná, nekvalitní, v jiných jednotkách a podobně. Na to si musíš dávat velký pozor.

Ve třetí fázi začneme pracovat na modelu. To, co jsme zjistili v předchozích krocích, musíme „přeložit“ do řeči machine learning. Jaký model použít (vzhledem k tomu, jaká máš data), jaké informace se z modelu umíme dozvědět a jak to souvisí s byznysem.

Čtvrtá fáze by nám měla vyplivnout hotový model připravený k používání. Tady všechny ty naše úvahy a předpoklady musíme přetavit do kódu a natrénovat model na datech. Zní to jednotuše, ale není to úplně easy. Hlavně to záleží na tom, jak kvalitní data máš k dispozici.

Pátá fáze se opět dotýká silně byznysu. V první řadě musíme umět zhodnotit, zda model skutečně řeší náš problém, který jsme chtěli vyřešit a zda je v tom dobrý. Zde zvykneme vytáhnout další data, která model ještě neviděl (testovací data) a otestovat úspěšnost modelu. Výstupem by měla být krásná prezentace se všelijakými grafy a vysvětlivkami, aby to ti "shora" pochopili a dali ti palec nahoru.

Machine Learning

Machine Learning je součástí Data Science a věnuje se algoritmům, programování a trénování modelu. Tento výraz si lidé zaměňují s umělou inteligencí. Abychom v tom měli jasno, umělá inteligence využívá techniky machine learning, aby napodobila lidskou inteligenci obecně. Umělá inteligence se zabývá také tím, jak lidé interagují s inteligentním agentem a aby se lidé cítili pohodlně, když interagují se strojem. Čili je tam toho zahrnuto mnohem více (např. i psychologie). Machine Learning je tady a nyní a dennodenně se používá. Jsou to pokročilé algoritmy a techniky, které zpracují nějaká data a vyplivují výsledek. Jsou úzce specializovány na jeden a jediný úkol. ML technik a algoritmů je mnoho a každý řeší určitý malinký podíl té umělé inteligence.

Slovník

Toto odvětví se jen tak hemží různými výrazy. Tyto stránky obsahují základní výrazy, na které určitě narazíš a je dobré vědět, co znamenají:

Datasety

Existuje několik stránek, které nabízejí svá data veřejně a zdarma. Jinak je většinou třeba za data tvrdě platit a kopec firem si na shromažďování dat vytvořily byznys.
Googlene jistě pomůže najít mnohé stránky, které nabízejí svá data. Zde je seznam několika populárních stránek:

Pokud chceš vědět více o Data Science a Machine Learningu, přihlas se do mého online kurzu Python Data Science.Pokud máš připomínky nebo dotazy k článku, směle se ptej v komentářích.

Miroslav Beka

Ahoj, volám sa Miro a som Pythonista. Programovať som začal na strednej. Vtedy frčal ešte turbo pascal. Potom prišiel matfyz, kadejaké zveriny ako Haskell, no najviac sa mi zapáčil Python.

Od vtedy v Pythone robím všetko. Okrem vlastných vecí čo si programujem pre radosť, som pracoval v ESETe ako automatizér testovania. Samozrejme, všetko v Pythone. Potom som skočil do inej firmy, tam taktiež Python na automatické testovanie aj DevOps. Viacej krát som účinkoval ako speaker na PyCon.sk, kde som odovzdával svoje skúsenosti.

Medzi moje obľúbené oblasti teda parí DevOps, Automatizovanie testovania a web development (hlavne backend).

Okrem programovania sa venujem hlavne hudbe 🤘

Mohlo by tě zajímat

Konstruktory v Javě
Vzdělávání
03.04.2020
Skillmea

Konstruktory v Javě

V tomto článku se podíváme, co je to konstruktor v Javě (constructor in java). K čemu se používá? Co je to? Třída slouží k popisu a výrobě objektů. Zkusme nyní popřemýšlet nad reálným objektem – například auto. Pokud chceme popsat auto do programu, tak k popisu auta použijeme třídu. Co má auto? Jaké vlastnosti? Má počet dveří, značku, RZ, objem kufru a dalších xy věcí. Ne všechny budeme používat. V našem projektu si vytvoříme novou třídu:[Image] Pojmenujeme ji Auto a napíšeme tam globální proměnné. public class Auto { int doorCount; String brand; String plateNumber; }Nyní si vytvoříme objekt typu Auto. K výrobě objektů budeme používat konstruktor. Konstruktor jako název naznačuje slouží ke zkonstruování nového objektu. Aniž bys ty sám napsal nějaký konstruktor, tak máš jeden dostupný automaticky. Tento se jmenuje – bezparametrický konstruktor – je to jakoby metoda, která na vstupu nemá parametry. Proto je možné vyrobit nový objekt pomocí new Auto(); public class Auto { int doorCount; String brand; String plateNumber; public static void main(String[] args) { Auto auto = new Auto(); } }V programu jsme použili new Auto() i když nic takového nemáme napsáno. Co můžeme udělat, je napsat si takový konstruktor sami. public class Auto { int doorCount; String brand; String plateNumber; public Auto() { } public static void main(String[] args) { Auto auto = new Auto(); } } Do nitra tohoto konstruktoru si nyní můžeme napsat libovolný kód. Konstruktory se nejčastěji využívají vedle výroby nového objektu ik nastavení dat. Například pokud chci vyrobit auto, které je značky Škoda, tak vyrobím nový – druhý konstruktor, jehož vstupní parametr bude právě počet dveří. Volat chceme Auto auto = new Auto(“Škoda”); public Auto(String brand) { }Co ale uděláme s touto proměnnou brand, kterou máme jako parametr? Pokud uvažujeme, tak chceme nastavit globální proměnnou brand pro tento nový objekt. Ale jak řeknu, že globální proměnná brand ať se rovná tomu, co je v parametru metody brand? Udělám to pomocí klíčového slova this. Slovo this se odkazuje na právě tento nový objekt, který konstruujeme. Tedy this se váže na nově vyrobený objekt ze třídy Auto. Po správnosti bych měl říci, že this odkazuje na instanci (instance) objektu. Pomocí konstruktoru vyrobíme novou instanci třídy Auto. Pokud vyrobím 5 objektů, tak jsem vyrobil 5 instancí třídy Auto. Takže this.brand ukazuje kam? Slovo this ukazuje na danou instanci objektu a přes tečku přistupuji k věcem dostupným v dané instanci auta. Co je tam k dispozici? Nyní jsou dostupné globální proměnné. Tak udělám: public Auto(String brand) { this.brand = brand; }public static void main(String[] args) { Auto auto = new Auto("Škoda"); }Po zavolání tohoto konstruktoru mám v proměnné auto odkaz na objekt Auto s nastevním brandem na Škoda. Takto si nyní můžu vytvářet nové instance typu Auto. public static void main(String[] args) { Auto auto = new Auto("Škoda"); Auto auto2 = new Auto("Škoda"); } Jsou tato dvě auta stejná? Ne, nejsou, i když mají stejný brand. Proč? Neboť voláme-li slovíčko new, tak se vytváří vždy zcela nový objekt v paměti. Ukázka konstruktoru, kde nastavujeme všechny globální proměnné. V IDEI stlač ALT+Insert a vyber konstruktor – následně označ všechny proměnné. Tyto proměnné se jinak nazývají také fieldy.[Image] public Auto(int doorCount, String brand, String plateNumber) { this.doorCount = doorCount; this.brand = brand; this.plateNumber = plateNumber; } public static void main(String[] args) { Auto auto = new Auto("Škoda"); Auto auto2 = new Auto("Škoda"); Auto auto3 = new Auto(4, "Opel", "CCdddDD"); }Nové objekty můžeš vytvářet kde chceš a kdy chceš. Teď jsem to dělal v metodě main přímo ve třídě Auto. To ale samozřejmě většinou dělat nebudeš. Více o konstruktorech v Javě a Java programování se dozvíš v našich online kurzech Java a OOP pro začátečníky a Java pro pokročilé. 
Kolekce v Javě
Vzdělávání
06.03.2020
Skillmea

Kolekce v Javě

V tomto úvodním článku do série pokročilá java se podíváme na zoubek kolekcím (collections in java). Kolekce jsou jako kontejnery, které v sobě drží další objekty. Jinak můžeme kolekce chápat také jako seznamy. Seznam telefonních čísel. Seznam osob. Seznam aut. Seznam souborů. Seznam čísel .... U kolekcí budeme hovořit o Rozhrání, Implementaci a Algoritmech. Java collection framework – Java sama o sobě poskytuje několik kolekcí. Poskytuje nám jejich implementace a také algoritmy pro vyhledávání, vkládání, třídění a podobně. Rozhraní kolekcí v tomto frameworku jsou generická. Tedy umožňují do nich vkládat různé typy objektů. Pamatujte, že Java je striktně typový jazyk a do proměnné typu String prostě int nedáš, musí tam jít pouze String. Ke generikám se ještě dostaneme v pozdějším článku.[Image] Seznam rozhraní Java collection frameworkuCollection – top v hierarchii, používá se k přesunu kolekce, manipulaci kde se požaduje aby tam přišla jakákoliv kolekce. Do Collection můžeš vložit jakýkoli typ kolekce, který tuto kolekci rozšiřuje. Set – nemůže obsahovat duplicity List – seznam, může obsahovat duplicity, pořadí elementů je zachováno pomocí indexů Queue – FIFO – first in first out, což přijde první do této kolekce tak z ní i první odejde, některé implementace mají výjimky Deque - FIFO i LIFO (last in first out) - elementy mohou být vkládány i vybírány z obou konců Map – object který mapuje objekty k jejich klíčům, nemůže obsahovat totožné klíče SortedSet a SortedMap – jsou vlastně seřazeny Map a Set Implementace (nejpoužívanější jsou zvýrazněny boldem): SetEnumSet, HashSet, LinkedHashSet, TreeSetListArrayList, LinkedList, Stack, VectorMapEnumMap, HashMap, LinkedHashMap, TreeMapSortedSet NavigableSetTreeSetSortedMap NavigableMapTreeMapQueueLinkedList, PriorityQueue  SetNeobsahuje duplicitní elementy – lépe řečeno nemůže obsahovat duplicitní elementy. HashSet – neuchovává pořadí v jakém byly elementy vloženy, ale pracuje nejrychleji LinkedHashSet – uchovává pořadí elementů v jakém byly vloženy TreeSet – pořadí elementů je seřazeno podle jejich hodnot, je pomalejší Mějme kolekci, která obsahuje elementy, které jsou duplicitní. Jak z ní nejrychleji získáme kolekci, která nemá duplicity? Collection<Type> noDups = new HashSet<Type>(c); Funguje to tak, že z kolekce se vytvoří Set. A Set už z definice nemůže obsahovat duplicity. Přidání elementů do Setu: Set<String> set1 = new HashSet<>(); String s = "e"; set1.add("element1"); set1.add("element2"); set1.add("element3"); set1.add("element4"); set1.add(s);Je element v kolekci?  System.out.println(set1.contains("e")); //true     Odstranění elementu z kolekce: set1.remove(s);Procházení přes Set: Iterator i = set1.iterator(); while (i.hasNext()){ System.out.println(i.next()); }for(String s : set1) { System.out.println(s); }Zeptám se, jestli všechny elementy ze set1 jsou iv set2 set1.containsAll(set2)); Odstraním z set1 všechny shodné elementy se set2 set1.removeAll(set2);Vše ze set2 přidám do set1 set1.addAll(set2);ListUchovává pořadí elementů. Elementy jsou přístupné i pomocí indexů. Je možné do již vytvořeného Listu přidat nové elementy i na indexy, které jsou obsazeny – elementy se posunou. Můžeme v nich vyhledávat indexOf a lastIndexOf. U dopisů si musíme dávat velký pozor na to, abychom neshodili program kvůli přístupu k neexistujícím elementům – respektive k neexistujícím indexům v listu. Například máš List se 4 elementy a chceš přistoupit k 6-tému elementu. Základní pomocné algoritmy, specifické ke List:  • sort — setřídí elementy v listu • shuffle — náhodně promíchá elementy v listu. • reverse — otočí pořadí elementů v Liste • rotate — otočí pořadí všech elementů od specifického indexu • swap — přehodí elementy z Listu na specifikovaných indexech • replaceAll — nahradí všechny výskyty specifikované hodnoty za druhou specifikovanou hodnotu • fill — přepíše všechny elementy v listu za specifikovanou hodnotu ArrayList – přizpůsobuje svou velikost, základní pole musela mít specifikovanou délku při vytvoření, nemohla růst nebo se zmenšovat LinkedList – jiná implementace, rozdílu jsou v časových zátěžích s různými operacemi nad Listy Přidání elementů do Listu: List<String> list = new ArrayList<>();          list.add("list1");          list.add("list2");          list.add("list3");          list.add("list4");          list.add("list5");  Výběr elementů z listu na indexy 1:         list.get(1);  Je prázdný?         list.isEmpty();  Přidej na pozici 2:         list.add(2,"list2b");  Odstraň element:         list.remove("list1");           list.remove(4);  Různé manipulace:         Collections.sort(list);          Collections.shuffle(list);          Collections.reverse(list);          Collections.rotate(list,2);          Collections.swap(list, 0, 1);          Collections.replaceAll(list, "list4", "new list4");          Collections.fill(list,"Jaro");  MapMapa obsahuje hodnoty vázané na klíč. Takže to máme anglicky key – value hodnoty. Klíče musí být unikátní. HashMap – nedrží si pořadí, náhodné uspořádání LinkedHashMap – drží pořadí Vložení do Mapy: Map<Integer,String> map = new HashMap<>();          map.put(10,"jaro");          map.put(1,"fero");          map.put(3,"duro");          map.put(4000,"karol");          map.put(4000,"peter"); // přepíše předchozí element Získáme a vypíšeme hodnotu elementu s klíčem 1:         System.out.println(map.get(1));  Přechod přes elementy Mapy:         for(Map.Entry m : map.entrySet()){              System.out.printf("key %d, value %s %n",m.getKey(),m.getValue());          }          for(Integer k : map.keySet()){              map.get(k);                  }
Kotlin vs. Java - méně kódu
Vzdělávání
06.01.2020
Skillmea

Kotlin vs. Java - méně kódu

Kotlin a Java jsou kompatibilní programovací jazyky. V tom smyslu, že pokud zkompilujeme Java kód, tak se vytvoří bytecode v souboru .class. Pokud zkompiluji Kotlin kód, tak se vytvoří bytecode v souboru .class. Tedy, jestli pracuješ v Kotlině nebo v Javě, tak nakonec budeš mít kód, který si bude rozumět a který dokáže běžet tam, kde dokáže běžet JVM – java virtual machine. V tomto článku vám chci ukázat to, proč byl Kotlin vytvořen – aby nám co nejvíce zjednodušil psaní kódu. Představ si, že chceš napsat třídu Auto. Ta má fieldy název a počet dveří. Tyto fieldy budou private a final – tedy po prvním nastavení je nemůžeš změnit. Přístup k těmto fieldům můžeš udělat jen přes public get metodu. Zároveň umíš sestrojit auto tak, že mu zadáš jen název. Pokud bude zadán jen název, tak počet dveří bude automaticky 4. Pokud zadáš název a počet dveří, tak se fieldy nastaví tak, jak jsme to zadali v konstruktoru. Kód v JavěTakto bude vypadat kód napsaný v Javě: public class Auto { private final String nazov; private final int pocetDveri; public Auto(String nazov) { this(nazov,4); } public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; } public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; } }Nejprve máme dva privátní final fieldy: private final String nazov; private final int pocetDveri;Pak konstruktor, pokud chci vytvořit objekt auto jen pomocí názvu: public Auto2(String nazov) { this(nazov,4); } Konstruktor, pokud chci vytvořit auto a nastavit název a počet dveří: public Auto2(String nazov, int pocetDveri) { this.nazov = nazov; this.pocetDveri = pocetDveri; }A nakonec get metody, abychom měli přístup k daným fieldům: public String getNazov() { return nazov; } public int getPocetDveri() { return pocetDveri; }Jak to udělám v Kotlině?Potřebuji tento kód: class Auto (val nazov: String, val pocetDveri: Int = 4) { }To je všechno, těch 20 řádků v Javě je jeden řádek kódu v Kotlině. Za Auto jsou závorky - to je primární konstruktor, ve kterém se nastavují takzvané property. První property je název, který je val – val znamená, že hodnota se nemůže později měnit. Druhá property má nastaveno = 4, to znamená, že pokud chci vytvořit auto jen zadáním názvu, tak se automaticky pocetDveři nastaví na 4. Takto vytvořím Auto zadáním obou property a pod tím je přístup k property přes tečku: val skoda = Auto("Skoda", 5) skoda.nazov skoda.pocetDveriVytvoření auta jen s názvem: val auticko = Auto("Skoda")Záver Líbí se ti tento přístup? Chceš vědět více o programovacím jazyce Kotlin? Sleduj Learn2Code a věřím, že najdeš co hledáš. Připravovaný kurz o Kotlině zveřejníme již brzy.

Nezmeškej info o nových kurzech a speciálních nabídkách