Cvičení – vytvoření modelu strojového učení
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.
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.>
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ů.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
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í.
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, amax_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í objektuRandomForestClassifier
přepsat.Trénování modelu
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
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.
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)
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 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á.
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
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.
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
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
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.