Výuka IT

Programování umělé inteligence

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).

1. Co to vlastně je to "Strojové učení"?

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.

2. Co budeme potřebovat? (Instalace)

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.

Jak to nainstalovat?

Nejjednodušší způsob je nainstalovat balík zvaný Anaconda. Je to takový "švýcarský nůž" pro data science.

  1. Stáhněte si Anacondu z oficiálního webu a nainstalujte ji.
  2. Spusťte program "Anaconda Navigator".
  3. Tam klikněte na "Launch" u Jupyter Notebook.
  4. Otevře se vám prohlížeč s vašimi soubory. Vytvořte nový soubor (New -> Python 3).

V Anacondě už máte předinstalované dvě knihovny, bez kterých bychom se neobešli:

3. Náš projekt: Hudební doporučovač

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.)

Krok 1: Načtení dat

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)

Krok 2: Příprava dat (Úklid)

Tohle je kritický krok. Aby model pochopil, co po něm chceme, musíme data rozdělit na dvě hromádky:

  1. Otázky (Vstupní data): To jsou informace, které modelu dáváme. V našem případě Věk a Pohlaví. V matematice se to často značí jako velké X.
  2. Odpovědi (Výstupní data): To je to, co chceme, aby model uhodl. V našem případě Žánr. Značí se jako malé y.

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']

Krok 3: Vytvoření a trénování modelu

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.

Krok 4: Předpovídání budoucnosti

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.


4. Jak moc je náš model chytrý? (Měření přesnosti)

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.

  1. Trénovací sada (80 %): Na těchto datech se model bude učit.
  2. Testovací sada (20 %): Tato data před ním schováme. Až se doučí, dáme mu "test" z těchto dat a porovnáme jeho odpovědi s realitou.
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ší.


5. Ukládání modelu (Abychom nemuseli učit pořád dokola)

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]]))

6. Bonus: Jak model přemýšlí? (Vizualizace)

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?

Procvičování

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.