{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "toc_visible": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Kapitola 1: Úvod do umělé inteligence - Praktický sešit\n", "\n", "---\n", "\n", "## Přehled\n", "\n", "**V tomto sešitě se naučíte:**\n", "- Pracovat s Google Colab (vaše AI laboratoř v prohlížeči)\n", "- Vytvořit svůj první AI model - rozhodovací strom\n", "- Natrénovat model na datech\n", "- Použít model pro předpovědi\n", "\n", "**Prerekvizity:**\n", "- Prostudovaná Kapitola 1 (teorie)\n", "- Google účet pro přístup ke Colab\n", "- Žádné předchozí programátorské znalosti!\n", "\n", "**Časová náročnost:** 45-60 minut\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Část 1: Seznámení s Google Colab\n", "\n", "### Co je Google Colab?\n", "\n", "Google Colab je **bezplatná online laboratoř** pro programování a umělou inteligenci. Představte si ho jako Word dokument, kde můžete nejen psát text, ale i spouštět programy.\n", "\n", "**Výhody pro AI:**\n", "- Běží v prohlížeči - nemusíte nic instalovat\n", "- Nabízí **zdarma GPU** (grafickou kartu) pro rychlé učení AI\n", "- Všechny AI knihovny jsou předinstalované\n", "- Můžete sdílet své projekty jako Google Docs\n", "\n", "### Typy buněk\n", "\n", "V Colabu existují dva typy buněk:\n", "1. **Textové buňky** (jako tato) - pro vysvětlení a poznámky\n", "2. **Kódové buňky** (šedé) - pro spuštění Python kódu\n", "\n", "### Jak spustit kód?\n", "\n", "Klikněte na kódovou buňku a stiskněte:\n", "- **Shift + Enter** = spustí buňku a přejde na další\n", "- **Ctrl + Enter** = spustí buňku a zůstane na ní\n", "- Nebo klikněte na tlačítko ▶ vlevo od buňky" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Vaše první buňka - Hello AI World!\n", "\n", "Spusťte následující buňku pro ověření, že vše funguje:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Toto je váš první kód!\n", "# Řádky začínající # jsou komentáře - Python je ignoruje\n", "# Slouží pro vysvětlení, co kód dělá\n", "\n", "print(\"Ahoj, světe umělé inteligence!\")\n", "print(\"Právě jste spustili svůj první kód v Colabu.\")\n", "print(\"Gratulujeme!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Co se stalo?**\n", "- Funkce `print()` zobrazí text na obrazovku\n", "- Text v uvozovkách `\"...\"` je řetězec (string)\n", "- Každý řádek se provede postupně shora dolů\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Část 2: Váš první AI model - Rozhodovací strom\n", "\n", "### Co budeme vytvářet?\n", "\n", "Naučíme počítač rozpoznávat ovoce! Konkrétně:\n", "- **Vstup:** Váha ovoce (v gramech) a textura (hladká/hrbolatá)\n", "- **Výstup:** Je to jablko nebo pomeranč?\n", "\n", "### Proč rozhodovací strom?\n", "\n", "Rozhodovací strom je jako hra \"20 otázek\":\n", "1. Je ovoce těžší než 145g? → ANO/NE\n", "2. Je povrch hrbolatý? → ANO/NE\n", "3. → Odpověď: Jablko nebo Pomeranč\n", "\n", "Je to jeden z **nejsrozumitelnějších** AI algoritmů - proto s ním začínáme!\n", "\n", "### Krok 2.1: Import AI knihovny\n", "\n", "Nejprve načteme knihovnu `scikit-learn` - nejpopulárnější nástroj pro strojové učení v Pythonu." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Import knihovny pro strojové učení\n", "# sklearn = scikit-learn, zlatý standard pro ML v Pythonu\n", "# tree = modul obsahující rozhodovací stromy\n", "\n", "from sklearn import tree\n", "\n", "print(\"Knihovna scikit-learn úspěšně načtena!\")\n", "print(\"Nyní máme přístup k rozhodovacím stromům.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Krok 2.2: Příprava trénovacích dat\n", "\n", "Každý AI model se musí **naučit z příkladů**. Tyto příklady nazýváme **trénovací data**.\n", "\n", "**Naše data o ovoci:**\n", "\n", "| Váha (g) | Textura | Ovoce |\n", "|----------|---------|-------|\n", "| 140 | Hladká (0) | Jablko |\n", "| 130 | Hladká (0) | Jablko |\n", "| 150 | Hrbolatá (1) | Pomeranč |\n", "| 170 | Hrbolatá (1) | Pomeranč |\n", "\n", "**Slovníček:**\n", "- **Features (příznaky)** = vlastnosti, které popisují data (váha, textura)\n", "- **Labels (štítky)** = správné odpovědi (jablko, pomeranč)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# TRÉNOVACÍ DATA\n", "# ==============\n", "\n", "# Features (příznaky) = vlastnosti ovoce\n", "# Formát: [váha_v_gramech, textura]\n", "# Textura: 0 = hladká, 1 = hrbolatá\n", "\n", "features = [\n", " [140, 0], # Ovoce 1: 140g, hladké\n", " [130, 0], # Ovoce 2: 130g, hladké\n", " [150, 1], # Ovoce 3: 150g, hrbolaté\n", " [170, 1], # Ovoce 4: 170g, hrbolaté\n", "]\n", "\n", "# Labels (štítky) = správné odpovědi\n", "# 0 = jablko, 1 = pomeranč\n", "\n", "labels = [0, 0, 1, 1] # Jablko, Jablko, Pomeranč, Pomeranč\n", "\n", "print(\"Trénovací data připravena!\")\n", "print(f\"Počet příkladů: {len(features)}\")\n", "print(f\"Příznaky: váha (g), textura (0=hladká, 1=hrbolatá)\")\n", "print(f\"Štítky: 0=jablko, 1=pomeranč\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Krok 2.3: Vytvoření a trénování modelu\n", "\n", "Teď přichází **kouzlo strojového učení**!\n", "\n", "1. Vytvoříme prázdný rozhodovací strom\n", "2. \"Nakrmíme\" ho daty pomocí metody `.fit()`\n", "3. Model se **sám naučí** pravidla pro rozpoznávání ovoce\n", "\n", "**Analogie:** Je to jako učit dítě rozpoznávat zvířata - ukážete mu obrázky a řeknete \"tohle je pes, tohle je kočka\". Po chvíli je pozná samo." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# VYTVOŘENÍ A TRÉNOVÁNÍ MODELU\n", "# ============================\n", "\n", "# Krok 1: Vytvoříme prázdný rozhodovací strom\n", "# DecisionTreeClassifier = klasifikátor pomocí rozhodovacího stromu\n", "model = tree.DecisionTreeClassifier()\n", "\n", "print(\"Prázdný rozhodovací strom vytvořen.\")\n", "print(\"Zatím nic neumí - musíme ho natrénovat...\")\n", "print()\n", "\n", "# Krok 2: Natrénujeme model na našich datech\n", "# .fit() = \"nauč se z těchto dat\"\n", "# První argument: features (vstupní data)\n", "# Druhý argument: labels (správné odpovědi)\n", "model.fit(features, labels)\n", "\n", "print(\"Model úspěšně natrénován!\")\n", "print(\"Nyní umí rozpoznávat jablka a pomeranče.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Krok 2.4: Použití modelu pro předpovědi\n", "\n", "Model je natrénovaný! Teď ho můžeme použít pro **předpovědi** na nových datech, která nikdy neviděl.\n", "\n", "**Testovací ovoce:**\n", "- Váha: 160g\n", "- Textura: hrbolatá (1)\n", "\n", "Co si myslíte, že to bude? Jablko nebo pomeranč?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# PŘEDPOVĚĎ NA NOVÉM OVOCI\n", "# ========================\n", "\n", "# Nové ovoce, které model nikdy neviděl\n", "nove_ovoce = [[160, 1]] # 160g, hrbolaté\n", "\n", "# Zeptáme se modelu na předpověď\n", "# .predict() = \"co si myslíš, že to je?\"\n", "predikce = model.predict(nove_ovoce)\n", "\n", "print(\"PŘEDPOVĚĎ MODELU\")\n", "print(\"=\"*30)\n", "print(f\"Vstup: váha=160g, textura=hrbolatá\")\n", "print()\n", "\n", "# Převedeme číselnou odpověď na text\n", "if predikce[0] == 0:\n", " print(\"Výsledek: JABLKO\")\n", "else:\n", " print(\"Výsledek: POMERANČ\")\n", "\n", "print()\n", "print(\"Model se rozhodl na základě vzorů, které našel v trénovacích datech!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Část 3: Experimentování s modelem\n", "\n", "### Cvičení 3.1: Zkuste jiná ovoce\n", "\n", "Upravte hodnoty v buňce níže a zjistěte, co model předpoví:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CVIČENÍ: Zkuste různé kombinace!\n", "# ================================\n", "\n", "# Změňte tyto hodnoty a spusťte buňku znovu:\n", "vaha = 120 # Zkuste: 100, 120, 140, 160, 180\n", "textura = 0 # Zkuste: 0 (hladká) nebo 1 (hrbolatá)\n", "\n", "# Předpověď\n", "test_ovoce = [[vaha, textura]]\n", "vysledek = model.predict(test_ovoce)\n", "\n", "# Zobrazení výsledku\n", "textura_text = \"hladká\" if textura == 0 else \"hrbolatá\"\n", "ovoce_text = \"Jablko\" if vysledek[0] == 0 else \"Pomeranč\"\n", "\n", "print(f\"Váha: {vaha}g, Textura: {textura_text}\")\n", "print(f\"Předpověď: {ovoce_text}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cvičení 3.2: Přidejte více trénovacích dat\n", "\n", "Co se stane, když přidáme více příkladů? Model se může naučit přesnější pravidla!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ROZŠÍŘENÁ DATA\n", "# ==============\n", "\n", "# Více příkladů = lepší učení\n", "features_rozsirene = [\n", " # Jablka (label = 0)\n", " [140, 0], # Střední jablko, hladké\n", " [130, 0], # Menší jablko, hladké\n", " [150, 0], # Větší jablko, hladké\n", " [135, 0], # Střední jablko, hladké\n", " [145, 0], # Střední jablko, hladké\n", " \n", " # Pomeranče (label = 1)\n", " [150, 1], # Menší pomeranč, hrbolatý\n", " [170, 1], # Větší pomeranč, hrbolatý\n", " [160, 1], # Střední pomeranč, hrbolatý\n", " [165, 1], # Střední pomeranč, hrbolatý\n", " [155, 1], # Střední pomeranč, hrbolatý\n", "]\n", "\n", "labels_rozsirene = [0, 0, 0, 0, 0, # 5 jablek\n", " 1, 1, 1, 1, 1] # 5 pomerančů\n", "\n", "# Natrénujeme nový model\n", "model_lepsi = tree.DecisionTreeClassifier()\n", "model_lepsi.fit(features_rozsirene, labels_rozsirene)\n", "\n", "print(\"Nový model natrénován na 10 příkladech!\")\n", "print(f\"Počet jablek: 5\")\n", "print(f\"Počet pomerančů: 5\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Porovnání obou modelů\n", "test_ovoce = [[145, 0]] # 145g, hladké - hraniční případ\n", "\n", "predikce_puvodni = model.predict(test_ovoce)\n", "predikce_lepsi = model_lepsi.predict(test_ovoce)\n", "\n", "print(\"POROVNÁNÍ MODELŮ\")\n", "print(\"=\"*40)\n", "print(f\"Testovací ovoce: 145g, hladké\")\n", "print()\n", "print(f\"Původní model (4 příklady): {'Jablko' if predikce_puvodni[0] == 0 else 'Pomeranč'}\")\n", "print(f\"Lepší model (10 příkladů): {'Jablko' if predikce_lepsi[0] == 0 else 'Pomeranč'}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Část 4: Vizualizace rozhodovacího stromu\n", "\n", "Jednou z výhod rozhodovacích stromů je, že můžeme **vidět, jak model přemýšlí**. \n", "\n", "Toto je důležité pro pochopení AI - rozhodovací stromy nejsou \"černá skříňka\"!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# VIZUALIZACE STROMU\n", "# ==================\n", "\n", "# Import knihovny pro vykreslování\n", "import matplotlib.pyplot as plt\n", "\n", "# Nastavení velikosti obrázku\n", "plt.figure(figsize=(12, 8))\n", "\n", "# Vykreslení stromu\n", "tree.plot_tree(\n", " model_lepsi,\n", " feature_names=['Váha (g)', 'Textura'],\n", " class_names=['Jablko', 'Pomeranč'],\n", " filled=True,\n", " rounded=True,\n", " fontsize=10\n", ")\n", "\n", "plt.title('Rozhodovací strom pro klasifikaci ovoce', fontsize=14)\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(\"\\nJak číst strom:\")\n", "print(\"- Každý obdélník je 'rozhodovací uzel'\")\n", "print(\"- Podmínka nahoře určuje, kam jít dál\")\n", "print(\"- Modrá = Jablko, Oranžová = Pomeranč\")\n", "print(\"- 'samples' = kolik příkladů prošlo tímto uzlem\")\n", "print(\"- 'value' = [počet jablek, počet pomerančů]\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Část 5: Mini-projekt - Klasifikátor zvířat\n", "\n", "### Zadání\n", "\n", "Vytvořte rozhodovací strom, který rozpozná **3 druhy zvířat**:\n", "- Pes\n", "- Kočka \n", "- Pták\n", "\n", "**Příznaky (features):**\n", "1. Váha (kg)\n", "2. Výška (cm)\n", "\n", "**Vaším úkolem je:**\n", "1. Vytvořit trénovací data (alespoň 3 příklady na zvíře)\n", "2. Natrénovat model\n", "3. Otestovat na novém zvířeti" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# MINI-PROJEKT: Klasifikátor zvířat\n", "# ==================================\n", "\n", "# TODO: Doplňte trénovací data\n", "# Formát: [váha_kg, výška_cm]\n", "# Labels: 0 = pes, 1 = kočka, 2 = pták\n", "\n", "zvirata_features = [\n", " # Psi (label = 0)\n", " [25, 60], # Střední pes\n", " [8, 30], # Malý pes\n", " [40, 70], # Velký pes\n", " \n", " # Kočky (label = 1)\n", " [4, 25], # Kočka\n", " [5, 28], # Větší kočka\n", " [3, 23], # Menší kočka\n", " \n", " # Ptáci (label = 2)\n", " [0.5, 20], # Holub\n", " [0.3, 15], # Vrabec\n", " [1.2, 35], # Krkavec\n", "]\n", "\n", "zvirata_labels = [0, 0, 0, # Psi\n", " 1, 1, 1, # Kočky\n", " 2, 2, 2] # Ptáci\n", "\n", "# Vytvoření a trénování modelu\n", "model_zvirat = tree.DecisionTreeClassifier()\n", "model_zvirat.fit(zvirata_features, zvirata_labels)\n", "\n", "print(\"Model pro rozpoznávání zvířat natrénován!\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Testování modelu\n", "nazvy_zvirat = {0: \"Pes\", 1: \"Kočka\", 2: \"Pták\"}\n", "\n", "# Test 1: Střední zvíře\n", "test1 = [[15, 45]] # 15kg, 45cm\n", "predikce1 = model_zvirat.predict(test1)\n", "print(f\"Zvíře 15kg, 45cm = {nazvy_zvirat[predikce1[0]]}\")\n", "\n", "# Test 2: Lehké a malé\n", "test2 = [[0.4, 18]] # 0.4kg, 18cm\n", "predikce2 = model_zvirat.predict(test2)\n", "print(f\"Zvíře 0.4kg, 18cm = {nazvy_zvirat[predikce2[0]]}\")\n", "\n", "# Test 3: Střední velikost\n", "test3 = [[4.5, 26]] # 4.5kg, 26cm\n", "predikce3 = model_zvirat.predict(test3)\n", "print(f\"Zvíře 4.5kg, 26cm = {nazvy_zvirat[predikce3[0]]}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Vizualizace stromu pro zvířata\n", "plt.figure(figsize=(14, 10))\n", "\n", "tree.plot_tree(\n", " model_zvirat,\n", " feature_names=['Váha (kg)', 'Výška (cm)'],\n", " class_names=['Pes', 'Kočka', 'Pták'],\n", " filled=True,\n", " rounded=True,\n", " fontsize=10\n", ")\n", "\n", "plt.title('Rozhodovací strom pro klasifikaci zvířat', fontsize=14)\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Cvičení pro samostatnou práci\n", "\n", "### Cvičení 1: Rozšíření klasifikátoru ovoce\n", "Přidejte do klasifikátoru ovoce třetí typ - **banán**. Banán je typicky:\n", "- Váha: 100-150g\n", "- Textura: hladká (0)\n", "\n", "Jak odlišíte banán od jablka?\n", "\n", "### Cvičení 2: Nový příznak\n", "Přidejte třetí příznak - **barvu** (0=zelená, 1=červená, 2=oranžová, 3=žlutá).\n", "Jak to ovlivní přesnost modelu?\n", "\n", "### Cvičení 3: Vlastní klasifikátor\n", "Vytvořte klasifikátor pro něco jiného:\n", "- Auta (sedan, SUV, sporťák)\n", "- Počasí (slunečno, zataženo, déšť)\n", "- Hudební žánry (rock, pop, klasika)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Prostor pro cvičení 1\n", "# =====================\n", "# Doplňte svůj kód zde:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Prostor pro cvičení 2\n", "# =====================\n", "# Doplňte svůj kód zde:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Prostor pro cvičení 3\n", "# =====================\n", "# Doplňte svůj kód zde:\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Shrnutí kapitoly\n", "\n", "### Co jste se naučili:\n", "\n", "1. **Google Colab** - jak spouštět AI kód v prohlížeči zdarma\n", "2. **Trénovací data** - příklady, ze kterých se AI učí (features + labels)\n", "3. **Rozhodovací strom** - jednoduchý a srozumitelný AI algoritmus\n", "4. **Trénování modelu** - `.fit()` naučí model z dat\n", "5. **Předpovědi** - `.predict()` použije naučené znalosti na nová data\n", "6. **Vizualizace** - můžeme vidět, jak model \"přemýšlí\"\n", "\n", "### Klíčové pojmy:\n", "\n", "| Pojem | Význam |\n", "|-------|--------|\n", "| **Features** | Vstupní vlastnosti dat (váha, textura) |\n", "| **Labels** | Správné odpovědi (jablko, pomeranč) |\n", "| **Model** | \"Mozek\" AI, který se učí z dat |\n", "| **Trénování** | Proces učení modelu z příkladů |\n", "| **Predikce** | Předpověď modelu na nových datech |\n", "\n", "---\n", "\n", "## Kontrolní otázky\n", "\n", "1. Co je rozdíl mezi features a labels?\n", "2. Proč potřebujeme trénovací data?\n", "3. Co dělá metoda `.fit()`?\n", "4. Co dělá metoda `.predict()`?\n", "5. Proč je rozhodovací strom vhodný pro začátečníky?\n", "6. Co se stane, když přidáme více trénovacích dat?\n", "7. Jak můžeme vizualizovat rozhodovací strom?\n", "8. Co znamená \"černá skříňka\" v kontextu AI?\n", "9. Jaký je rozdíl mezi slabou a silnou AI?\n", "10. Kde všude se používá AI v běžném životě?\n", "\n", "---\n", "\n", "## Další kroky\n", "\n", "V příští kapitole se podíváme na **historii umělé inteligence** a pochopíme, jak jsme se dostali od prvních myšlenek k dnešním systémům.\n", "\n", "**Výzva:** Zkuste přidat do klasifikátoru zvířat další příznaky (například \"umí létat\": 0/1). Jak to ovlivní předpovědi?\n", "\n", "---\n", "\n", "*Notebook pro AI kurz - Kapitola 1* \n", "*Spustitelné v Google Colab (zdarma)*" ] } ] }