Cvičení – vytvoření modelu strojového učení

Dokončeno

K vytvoření modelu strojového učení budete potřebovat dvě datové sady: jednu pro trénování modelu a druhou pro testování. V reálu máte často pouze jednu datovou sadu, a proto ji rozdělíte na dvě. V tomto cvičení rozdělíte datový rámec, který jste si připravili v předchozím cvičení, na dvě datové sady v poměru 80:20, abyste mohli datovou sadu použít k trénování modelu strojového učení. Také rozdělíte datový rámec na důležité sloupce a sloupce popisků. První datový rámec obsahuje sloupce použité jako vstup do modelu (například výchozí a cílové letiště a plánovaný čas odletu), druhý obsahuje sloupec, který se model pokusí předpovědět – v tomto případě jde o sloupec ARR_DEL15, který označuje, zda letadlo přiletělo na čas.

  1. Přejděte zpět do poznámkového bloku Azure, který jste vytvořili v předchozí části. Pokud jste poznámkový blok zavřeli, můžete se znovu přihlásit k portálu Microsoft Azure Notebooks, otevřít poznámkový blok a po otevření poznámkového bloku znovu spustit všechny buňky v poznámkovém bloku.>

  2. V nové buňce na konci poznámkového bloku zadejte následující kód a spusťte ho:

    from sklearn.model_selection import train_test_split
    train_x, test_x, train_y, test_y = train_test_split(df.drop('ARR_DEL15', axis=1), df['ARR_DEL15'], test_size=0.2, random_state=42)
    

    Prvním příkazem naimportujete pomocnou funkci train_test_split knihovny scikit-learn. Druhý řádek používá funkci k rozdělení datového rámce na trénovací sadu, která obsahuje 80 % původních dat, a testovací sadu, která obsahuje zbývajících 20 % dat. Parametr random_state přidá generátor náhodných čísel, který se použije k rozdělení. První a druhý parametr představuje datové rámce, které obsahují důležité sloupce a sloupec popisků.

  3. train_test_split vrátí čtyři datové rámce. Pomocí následujícího příkazu zobrazte počet řádků a sloupců v datovém rámci, který obsahuje důležité sloupce použité pro trénování:

    train_x.shape
    
  4. Nyní pomocí tohoto příkazu zobrazte počet řádků a sloupců v datovém rámci, který obsahuje důležité sloupce použité pro testování:

    test_x.shape
    

    Jak se tyto dva výstupy liší, a proč?

Můžete předpovědět, co se zobrazí, pokud zavoláte shape u druhých dvou datových rámců (train_y a test_y)? Pokud si nejste jisti, vyzkoušejte to a uvidíte.

Existuje mnoho typů modelů strojového učení. Jedním z nejběžnějších je regresní model, který pomocí jednoho z regresních algoritmů vytvoří číselnou hodnotu – například věk nějaké osoby nebo pravděpodobnost, že je transakce platební karty podvodná. Vytrénujete klasifikační model, který hledá způsob překladu sady vstupů na jednu ze sad známých výstupů. Klasickým příkladem klasifikačního modelu je model, který zkoumá e-maily a klasifikuje je jako "spam" nebo "ne spam". Vaším modelem bude binární klasifikační model, který předpovídá, jestli let dorazí včas nebo pozdě ("binární", protože existují pouze dva možné výstupy).

Jednou z výhod použití knihovny scikit-learn je, že tyto modely nemusíte vytvářet ani implementovat jimi používané algoritmy ručně. Knihovna scikit-learn zahrnuje různé třídy pro implementaci běžných modelů strojového učení. Jednou z nich je třída RandomForestClassifier, která používá u dat více rozhodovacích stromů a průměrování, aby se zvýšila celková přesnost a omezilo přeurčení.

  1. Spuštěním následujícího kódu v nové buňce vytvořte objekt RandomForestClassifier a vytrénujte ho zavoláním metody fit.

    from sklearn.ensemble import RandomForestClassifier
    
    model = RandomForestClassifier(random_state=13)
    model.fit(train_x, train_y)
    

    Výstup zobrazuje parametry použité v klasifikátoru, včetně n_estimators, který určuje počet stromů v jednotlivých rozhodovacích lesích, a max_depth, který určuje maximální hloubku rozhodovacích stromů. Zobrazené hodnoty představují výchozí hodnoty, ale kteroukoli z nich můžete při vytváření objektu RandomForestClassifier přepsat.

    Trénování modelu

    Trénování modelu

  2. Nyní zavolejte metodu predict a otestujte model pomocí hodnot v sadě test_x. Potom zavolejte metodu score a určete průměrnou přesnost modelu:

    predicted = model.predict(test_x)
    model.score(test_x, test_y)
    

    Měl by se zobrazit následující výstup:

    Testování modelu

    Testování modelu

Průměrná přesnost je 86 %, což na první pohled vypadá dobře. Průměrná přesnost ale není vždycky spolehlivým indikátorem přesnosti klasifikačního modelu. Zkusme se na to podívat podrobněji a určit skutečnou přesnost modelu – tj. jak obratný je při určování toho, zda letadlo přistane na čas.

Existuje několik způsobů, jak změřit přesnost klasifikačního modelu. Jedním z nejlepších měřítek pro binární klasifikační model je plocha pod křivkou ROC (Receiver Operating Characteristic), která v podstatě kvantifikuje, jak často model provede správnou předpověď bez ohledu na výsledek. V této lekci vypočítáte skóre oblasti pod křivkou ROC pro model, který jste vytvořili dříve, a dozvíte se důvody, proč je toto skóre nižší než průměrná přesnost poskytovaná metodou score. Dozvíte se také informace o jiných způsobech měření přesnosti modelu.

  1. Než vypočítáte oblast pod křivkou ROC musíte vygenerovat pravděpodobnosti předpovědí u testovací sady. Tyto pravděpodobnosti představují odhady pro jednotlivé třídy, neboli odpovědi, které model předpovídá. [0.88199435, 0.11800565] například znamená, že existuje 89% šance, že let přiletí na čas (ARR_DEL15 = 0) a 12% šance, že nikoli (ARR_DEL15 = 1). Součet těchto dvou pravděpodobností dává 100 %.

    Spuštěním následujícího kódu vygenerujte skupinu pravděpodobností předpovědi z testovacích dat:

    from sklearn.metrics import roc_auc_score
    probabilities = model.predict_proba(test_x)
    
  2. Teď pomocí následujícího příkazu vygenerujte skóre oblasti pod křivkou ROC z pravděpodobností pomocí metody roc_auc_score knihovny scikit-learn:

    roc_auc_score(test_y, probabilities[:, 1])
    

    Zkontrolujte, že výsledek zobrazuje skóre 67 %:

    Generování skóre AUC

    Generování skóre oblasti pod křivkou

    Proč je skóre oblasti pod křivkou nižší než průměrná přesnost vypočítaná v předchozím cvičení?

    Výsledek metody score odráží počet položek v testovací sadě, který model předpověděl správně. Toto skóre je zkresleno faktem, že datová sada použitá k trénování a testování modelu obsahuje mnohem více řádků, které reprezentují včasné přílety, než řádků, které reprezentují zpožděné přílety. Vzhledem k této nevyrovnanosti v datech je vyšší pravděpodobnost, že předpověď včasného příletu bude správná než předpověď, že se let opozdí.

    Oblast pod křivkou ROC toto bere v úvahu a poskytuje přesnější označení, jaká je pravděpodobnost, že předpověď včasného nebo zpožděného příletu bude správná.

  3. Další informace o chování modelu můžete získat tak, že vygenerujete konfuzní matici, někdy označovanou také jako chybová matice. Konfuzní matice kvantifikuje počet, kolikrát byla každá odpověď klasifikována správně nebo nesprávně. Konkrétně pak kvantifikuje počet falešně pozitivních, falešně negativních, správně pozitivních a správně negativních klasifikací. To je důležité, protože pokud je binární klasifikační model trénovaný k rozpoznávání koček a psů testován na datové sadě, která obsahuje 95 % psů, dosáhl by skóre 95 % jenom tím, že by pokaždé uvedl „pes“. Pokud se mu ale nepodaří kočky identifikovat vůbec, nebude mít velkou hodnotu.

    Pomocí následujícího kódu vytvořte konfuzní matici modelu:

    from sklearn.metrics import confusion_matrix
    confusion_matrix(test_y, predicted)
    

    První řádek výstupu označuje lety, které přistály na čas. První sloupec v daném řádku zobrazuje, u kolika letů bylo správně předpovězeno, že přiletí na čas; druhý sloupec odhaluje, u kolika letů bylo předpovězeno, že budou zpožděny, ale nebyly. Z toho se zdá, že model je zběhlý v předpovídání, že let přistane na čas.

    Generování konfuzní matice

    Generování konfuzní matice

    Podívejme se ale na druhý řádek, který označuje zpožděné lety. První sloupec ukazuje, kolik zpožděných letů bylo nesprávně předpovězeno jako lety, které přistanou na čas. Druhý sloupec ukazuje, kolik letů bylo správně předpovězeno jako zpožděné. Z toho je zřejmé, že model není tak zběhlý při predikci, že let bude zpožděn, jako při predikci, že přistane na čas. V konfuzní matici chcete mít velká čísla v levém horním a pravém dolním rohu a malá čísla (pokud možno nuly) v pravém horním a levém dolním rohu.

  4. Mezi další měřítka přesnosti klasifikačního modelu patří přesnost a úplnost. Předpokládejme, že model obdržel tři včasné a tři zpožděné přílety a že správně předpověděl dva včasné přílety, ale nesprávně předpověděl, že dva ze zpožděných příletů budou na čas. V takovém případě by byla přesnost 50 % (dva ze čtyř letů klasifikovaných jako přílety na čas skutečně přistály na čas), ale úplnost by byla 67 % (dva ze tří příletů na čas model identifikoval jako přílety na čas). Další informace o přesnosti a úplnosti najdete na stránce https://en.wikipedia.org/wiki/Precision_and_recall.

    Knihovna scikit-learn obsahuje šikovnou metodu s názvem precision_score pro výpočet přesnosti. Pokud chcete kvantifikovat přesnost modelu, spusťte následující příkazy:

    from sklearn.metrics import precision_score
    
    train_predictions = model.predict(train_x)
    precision_score(train_y, train_predictions)
    

    Zkontrolujte výstup. Jaká je přesnost modelu?

    Měření přesnosti.

    Měření přesnosti

  5. Scikit-learn obsahuje také metodu s názvem recall_score pro výpočet úplnosti. Pokud chcete změřit úplnost modelu, spusťte následující příkazy:

    from sklearn.metrics import recall_score
    
    recall_score(train_y, train_predictions)
    

    Co je úplnost modelu?

    Měření úplnosti.

    Měření úplnosti

  6. K uložení poznámkového bloku použijte příkaz File ->Save a Checkpoint.

Ve skutečném světě by zkušení odborníci na data hledali způsoby, jak model dále zpřesnit. Mimo jiné by také vyzkoušeli různé algoritmy a vybraný algoritmus vyladili, aby našli optimální kombinaci parametrů. Dále by pravděpodobně rozšířili datovou sadu, aby obsahovala milióny řádků, a nikoli pouze tisíce, a pokusili by se zmenšit nerovnováhu mezi zpožděnými a včasnými přílety. Nám ale bude model stačit tak, jak je.