Dnes se společně ponoříme do něčeho, co zní jako sci-fi, ale ve skutečnosti je to při správném vysvětlení docela jednoduché – do strojového učení.
Nebojte se složitých matematických vzorců. Celou lekci projdeme krok za krokem, vše si lidsky vysvětlíme a na konci budete mít svůj vlastní funkční program, který dokáže "myslet" a předpovídat budoucnost (no, alespoň hudební vkus).
Představte si rozdíl mezi klasickým programováním a strojovým učením asi takto:
Výsledek? Počítač se "naučí" chápat souvislosti a dokáže pak předpovídat výsledky i pro lidi, které nikdy předtím neviděl.
Abychom mohli začít, potřebujeme správné nástroje. Profesionálové v data science nepoužívají obyčejný textový editor, ale něco, čemu se říká Jupyter Notebook.
Proč? Protože nám umožňuje psát kód po malých kouscích (buňkách) a hned pod každým kouskem vidět výsledek – ať už je to tabulka, výpočet nebo graf. Je to jako interaktivní poznámkový blok.
Nejjednodušší způsob je nainstalovat balík zvaný Anaconda. Je to takový "švýcarský nůž" pro data science.
V Anacondě už máte předinstalované dvě knihovny, bez kterých bychom se neobešli:
Cílem našeho programu bude doporučit hudební žánr na základě věku a pohlaví.
Aby se počítač mohl učit, potřebuje data. Připravil jsem pro vás soubor music.csv. Je to
jednoduchá tabulka, kde každý řádek představuje jednoho člověka.
Tabulka vypadá zhruba takto:
| Age (Věk) | Gender (Pohlaví) | Genre (Žánr) |
|---|---|---|
| 20 | 1 (Muž) | HipHop |
| 23 | 1 (Muž) | HipHop |
| 25 | 0 (Žena) | Dance |
| 26 | 0 (Žena) | Acoustic |
| ... | ... | ... |
(Poznámka: V počítačovém světě se často používá 1 pro muže a 0 pro ženy, nebo naopak. Pro počítač jsou čísla vždy lepší než text.)
První věc, kterou musíme udělat, je dostat data do Pythonu. K tomu slouží knihovna Pandas.
import pandas as pd
# Načteme soubor csv
music_data = pd.read_csv('music.csv')
# Podíváme se na data
print(music_data)
Tohle je kritický krok. Aby model pochopil, co po něm chceme, musíme data rozdělit na dvě hromádky:
Proč to dělíme? Protože při učení modelu ukazujeme: "Tady máš věk a pohlaví (X) a tohle k tomu patří (y). Uč se souvislosti." Až bude model naučený, dáme mu už jen X (věk a pohlaví nového člověka) a budeme chtít, aby y (žánr) doplnil sám.
# X bude obsahovat všechno KROMĚ sloupce 'genre'
X = music_data.drop(columns=['genre'])
# y bude obsahovat JENOM sloupec 'genre'
y = music_data['genre']
Teď přichází ta magie. Použijeme algoritmus zvaný Rozhodovací strom (Decision Tree). Představte si ho jako sérii otázek ano/ne, které vedou k výsledku (např. "Je mu více než 30? Ano -> Je to muž? Ano -> Klasická hudba").
Knihovna scikit-learn (ve zkratce sklearn) nám to neuvěřitelně usnadňuje. Vytvoření umělé
inteligence jsou vlastně jen dva řádky kódu!
from sklearn.tree import DecisionTreeClassifier
# 1. Vytvoříme prázdný model (mozek, který zatím nic neumí)
model = DecisionTreeClassifier()
# 2. Natrénujeme ho! (Metoda .fit() znamená "napasuj data na model")
model.fit(X, y)
print("Model je natrénován!")
V tomto okamžiku (křemíkový) mozek projel naše data, našel v nich vzory a vytvořil si vnitřní logiku.
Teď, když je model chytrý, ho můžeme vyzkoušet. Zeptejme se ho na lidi, kteří v původní tabulce vůbec nebyli!
Například, co bude poslouchat:
- 21letý muž (předpokládáme HipHop)
- 22letá žena (předpokládáme Dance)
# Metoda .predict() slouží k předpovědi
# Vkládáme seznam seznamů [[věk, pohlaví], [věk, pohlaví]]
predictions = model.predict([ [21, 1], [22, 0] ])
print(predictions)
Pokud vše funguje, Python vám vypíše: ['HipHop' 'Dance']. Gratuluji! Právě jste vytvořili
svou první AI.
Když trénujete model, nemůžete mu věřit jen tak na slovo. Musíme ho otestovat.
Chyba začátečníků je, že model otestují na stejných datech, na kterých se učil. To je jako dát studentovi test, který obsahuje přesně ty stejné otázky, které byly v učebnici. Student by se je jen naučil nazpaměť.
Abychom zjistili, jestli model opravdu chápe souvislosti a nejen papouškuje, uděláme trik: Rozdělíme naše data na dvě části.
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Funkce train_test_split nám data náhodně rozhází a rozdělí
# test_size=0.2 znamená, že 20% dat si necháme na testování
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Vytvoříme nový model a naučíme ho JEN na trénovací sadě
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# Teď ho necháme hádat výsledky pro testovací sadu (kterou nikdy neviděl)
predictions = model.predict(X_test)
# A porovnáme jeho tipy (predictions) se skutečností (y_test)
score = accuracy_score(y_test, predictions)
print(f"Přesnost modelu je: {score}")
Výsledek 1.0 znamená 100% přesnost. Výsledek 0.5 znamená 50%.
Pozor: U našeho malého souboru dat se může stát, že přesnost bude skákat (někdy 1.0, někdy
0.75), protože náhoda hraje velkou roli. U velkých dat (miliony řádků) je to stabilnější.
Náš model se natrénuje za zlomek vteřiny. Ale představte si model v Google nebo Tesle – ten se může trénovat týdny na superpočítačích. Nechcete to dělat pokaždé, když spustíte skript.
Model můžeme "zmrazit" a uložit do souboru.
import joblib
# Uložíme natrénovaný model do souboru 'muj-prvni-model.joblib'
joblib.dump(model, 'muj-prvni-model.joblib')
print("Model uložen!")
A teď si představte, že píšete úplně nový program. Místo trénování stačí model načíst:
# V NOVÉM PROGRAMU:
import joblib
# Načteme hotový model
model = joblib.load('muj-prvni-model.joblib')
# A hned můžeme předpovídat
print(model.predict([[21, 1]]))
Rozhodovací stromy jsou skvělé v tom, že je lidem snadné pochopit, jak dospěly k závěru. Můžeme si vygenerovat obrázek jejich myšlenkové mapy.
from sklearn import tree
tree.export_graphviz(model,
out_file='music-recommender.dot',
feature_names=['age', 'gender'],
class_names=sorted(y.unique()),
label='all',
rounded=True,
filled=True)
Tento kód vytvoří soubor .dot. Když ho otevřete ve Visual Studio Code (s nainstalovaným
pluginem Graphviz) nebo na webu pro prohlížení DOT souborů, uvidíte přesný "strom" rozhodování.
Uvidíte bubliny jako: "Je gender <= 0.5?". Pokud ano (je to žena), jde doleva. Pokud ne (je to muž), jde doprava. Další bublina se ptá "Je věk <= 25.5?". A tak dále, až se dostane k výsledku "Dance".
Je úžasné vidět, jak počítač sám odvodil logiku, kterou my bychom museli složitě vymýšlet, že?
Nyní, když máme pevné teoretické základy, je čas si vše vyzkoušet v praxi. Níže najdeme odkazy na procvičování a kvíz, které nám pomohou upevnit znalosti.