Ćwiczenie — tworzenie modelu uczenia maszynowego
Do utworzenia modelu uczenia maszynowego potrzebne są dwa zestawy danych: jeden do trenowania i jeden do testowania. W praktyce często masz tylko jeden zestaw danych, dlatego trzeba go podzielić na dwa. W tym ćwiczeniu wykonasz podział w stosunku 80–20 na obiekcie DataFrame, który został przygotowany w poprzednim laboratorium, aby można było użyć go do trenowania modelu uczenia maszynowego. Ponadto podzielisz obiekt DataFrame na kolumny cech i kolumny etykiet. Pierwsze z nich to kolumny używane jako dane wejściowe modelu (na przykład miejsce początkowe i docelowe lotu oraz zaplanowany czas odlotu), a drugie to kolumna, którą model spróbuje przewidzieć — w tym przypadku jest to kolumna ARR_DEL15, która wskazuje, czy przylot będzie punktualny.
Przejdź z powrotem do notesu platformy Azure utworzonego w poprzedniej sekcji. Jeśli notes został zamknięty, możesz zalogować się z powrotem do portalu microsoft Azure Notebooks, otworzyć notes i użyć komórki ->Uruchom wszystko, aby ponownie uruchomić wszystkie komórki w notesie po jego otwarciu.
W nowej komórce na końcu notesu wprowadź i wykonaj poniższe instrukcje:
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)
Pierwsza instrukcja importuje funkcję pomocnika train_test_split biblioteki sckit-learn. W drugim wierszu używamy tej funkcji, aby podzielić obiekt DataFrame na zestaw do trenowania zawierający 80% oryginalnych danych i zestaw testowy zawierający pozostałe 20% danych. Parametr
random_state
inicjuje generator liczb losowych używany do wykonania podziału, podczas gdy pierwszy i drugi parametr to obiekty DataFrame zawierające kolumny cech i kolumnę etykiety.Funkcja
train_test_split
zwraca cztery obiekty DataFrame. Użyj poniższego polecenia, aby wyświetlić liczbę wierszy i kolumn w obiekcie DataFrame zawierającym kolumny cech używane na potrzeby trenowania:train_x.shape
Teraz użyj tego polecenia, aby wyświetlić liczbę wierszy i kolumn w obiekcie DataFrame zawierającym kolumny cech używane do testowania:
test_x.shape
Jaka jest różnica między tymi dwoma wynikami i dlaczego?
Czy potrafisz przewidzieć, jaki byłby wynik, gdybyśmy wywołali metodę shape
na dwóch pozostałych obiektach DataFrame: train_y
i test_y
? Jeśli nie masz pewności, zrób to i dowiedz się.
Istnieje wiele typów modeli uczenia maszynowego. Jednym z najbardziej popularnych jest model regresji, który korzysta z jednego z wielu algorytmów regresji w celu uzyskania wartości liczbowej — na przykład wieku osoby lub prawdopodobieństwa, że transakcja karty kredytowej jest fałszywa. Ty wytrenujesz model klasyfikacji, którego celem jest rozpoznanie zestawu danych wejściowych i przydzielenie ich do jednego z zestawów znanych danych wyjściowych. Klasycznym przykładem modelu klasyfikacji jest model, który sprawdza wiadomości e-mail i klasyfikuje je jako "spam" lub "nie spam". Model będzie modelem klasyfikacji binarnej, który przewiduje, czy lot przybędzie na czas, czy późno ("binarny", ponieważ istnieją tylko dwa możliwe dane wyjściowe).
Jedną z zalet użycia biblioteki scikit-learn jest to, że nie musisz ręcznie tworzyć tych modeli ani implementować algorytmów, które są w nich używane. Biblioteka scikit-learn zawiera wiele różnych klas na potrzeby implementacji typowych modeli uczenia maszynowego. Jeden z nich to model RandomForestClassifier, który dopasowuje do danych wiele drzew decyzyjnych i używa uśredniania, aby zwiększyć ogólną dokładność i ograniczyć nadmierne dopasowanie.
Wykonaj następujący kod w nowej komórce, aby utworzyć obiekt
RandomForestClassifier
i wytrenować go, wywołując metodę fit.from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(random_state=13) model.fit(train_x, train_y)
Dane wyjściowe pokazują parametry używane w klasyfikatorze, w tym parametr
n_estimators
, który określa liczbę drzew w każdym lesie drzew decyzyjnych, i parametrmax_depth
, który określa maksymalną głębokość drzew decyzyjnych. Wyświetlane wartości są domyślne, ale tworząc obiektRandomForestClassifier
, można je zastąpić.Trenowanie modelu
Teraz wywołaj metodę predict, aby przetestować model, używając wartości w obiekcie
test_x
, a następnie wywołaj metodę score, aby ustalić średnią dokładność modelu:predicted = model.predict(test_x) model.score(test_x, test_y)
Upewnij się, że zostały wyświetlone następujące dane wyjściowe:
Testowanie modelu
Średnia dokładność wynosi 86%, co na pierwszy rzut oka wydaje się być dość dobrym wynikiem. Jednak średnia dokładność nie zawsze jest wiarygodnym wskaźnikiem dokładności modelu klasyfikacji. Przyjrzyjmy się temu nieco bardziej szczegółowo i określmy, jak dokładny ten model jest naprawdę — czyli jak sprawny jest w ustalaniu, czy przylot będzie punktualny.
Istnieje kilka sposobów mierzenia dokładności modelu klasyfikacji. Jedną z najlepszych ogólnych miar dla binarnego modelu klasyfikacji jest tzw. krzywa ROC AUC (Area Under Receiver Operating Characteristic Curve), która zasadniczo określa ilościowo, jak często przewidywanie modelu będzie poprawne, niezależnie od wyniku. W tej lekcji obliczysz wynik krzywej ROC AUC dla utworzonego wcześniej modelu i poznasz niektóre powody, dla których ten wynik jest niższy, niż średnia dokładność określona przez metodę score
. Poznasz także inne sposoby zmierzenia dokładności modelu.
Zanim obliczysz krzywą ROC AUC, musisz wygenerować prawdopodobieństwa przewidywania dla zestawu testowego. Te prawdopodobieństwa to oszacowania dla każdej klasy, czyli odpowiedzi, którą może przewidzieć model. Na przykład wartości
[0.88199435, 0.11800565]
oznaczają, że istnieje 89% prawdopodobieństwo, że lot przybędzie na czas (ARR_DEL15 = 0) i 12% prawdopodobieństwo, że będzie opóźniony (ARR_DEL15 = 1). Suma tych dwóch prawdopodobieństw daje 100%.Uruchom następujący kod, aby wygenerować zestaw prawdopodobieństw przewidywania na podstawie danych testowych:
from sklearn.metrics import roc_auc_score probabilities = model.predict_proba(test_x)
Teraz za pomocą następującej instrukcji wygeneruj wynik krzywej ROC AUC na podstawie tych prawdopodobieństw, używając metody roc_auc_score biblioteki scikit-learn:
roc_auc_score(test_y, probabilities[:, 1])
Upewnij się, że dane wyjściowe pokazują wynik 67%:
Generowanie wyniku krzywej AUC
Dlaczego wynik krzywej AUC jest niższy niż średnia dokładność obliczona w poprzednim ćwiczeniu?
Dane wyjściowe z metody
score
odzwierciedlają liczbę elementów w zestawie testowym, które model przewidział poprawnie. Ten wynik jest odchylony przez to, że zestaw danych, na podstawie którego model był trenowany i testowany, zawiera o wiele więcej wierszy reprezentujących przyloty punktualne, niż wierszy reprezentujących przyloty opóźnione. Ze względu na tę dysproporcję w danych, prawdopodobieństwo, że wynik będzie poprawny, jest większe, jeśli przewidzisz przylot punktualny, niż jeśli przewidzisz przylot opóźniony.Krzywa ROC AUC uwzględnia ten fakt i dostarcza bardziej precyzyjny wskaźnik prawdopodobieństwa, czy przewidywanie przylotu punktualnego lub opóźnionego będzie prawidłowe.
Więcej na temat zachowania modelu możesz się dowiedzieć, generując macierz pomyłek, znaną również jako macierz błędów. Macierz pomyłek określa ilościowo, ile razy każda odpowiedź została sklasyfikowana poprawnie lub niepoprawnie. W szczególności podaje liczbę wyników fałszywie dodatnich, fałszywie ujemnych, prawdziwie dodatnich i prawdziwie ujemnych. Jest to ważne, ponieważ jeśli binarny model klasyfikacji wytrenowany w celu rozpoznawania kotów i psów będzie testowany na zestawie danych, który w 95% zawiera psy, może uzyskać wynik 95%, podając za każdym razem wynik „pies”. Jeśli jednak za każdym razem błędnie zidentyfikuje kota, nie ma w zasadzie żadnej wartości.
Użyj poniższego kodu, aby wygenerować macierz pomyłek dla modelu:
from sklearn.metrics import confusion_matrix confusion_matrix(test_y, predicted)
Pierwszy wiersz w danych wyjściowych reprezentuje loty, które przybyły na czas. Pierwsza kolumna w tym wierszu pokazuje, ile lotów zostało przewidzianych poprawnie jako punktualne, podczas gdy druga kolumna pokazuje, ile lotów zostało przewidzianych jako opóźnione, ale w rzeczywistości były punktualne. Na tej podstawie możemy stwierdzić, że model sprawnie przewiduje, czy lot będzie punktualny.
Generowanie macierzy pomyłek
Przyjrzyjmy się jednak drugiemu wierszowi, który reprezentuje opóźnione przyloty. Pierwsza kolumna pokazuje, ile opóźnionych przylotów zostało nieprawidłowo przewidzianych jako punktualne. Druga kolumna pokazuje, ile przylotów zostało prawidłowo przewidzianych jako opóźnione. Wyraźnie widać, że model nie jest tak sprawny w przewidywaniu, że lot będzie opóźniony, jak jest w przewidywaniu, że będzie punktualny. W macierzy pomyłek chcemy mieć duże liczby w lewym górnym i prawym dolnym rogu, oraz małe liczby (najlepiej zera) w prawym górnym i lewym dolnym rogu.
Inne miary dokładności modelu klasyfikacji to precyzja i kompletność. Załóżmy, że modelowi przedstawiono trzy przyloty punktualne i trzy przyloty opóźnione i że poprawnie przewidział on dwa przyloty punktualne, ale niepoprawnie przewidział, że dwa opóźnione przyloty będą na czas. W tym przypadku precyzja będzie wynosić 50% (dwa z czterech lotów sklasyfikowanych jako punktualne rzeczywiście takie były), podczas gdy kompletność modelu będzie wynosić 67% (dwa z trzech punktualnych przylotów zostały zidentyfikowane poprawnie). Więcej o precyzji i kompletności możesz dowiedzieć się z artykułu https://en.wikipedia.org/wiki/Precision_and_recall
Biblioteka scikit-learn zawiera przydatną metodę o nazwie precision_score do obliczania precyzji. Aby obliczyć precyzję modelu, wykonaj następujące instrukcje:
from sklearn.metrics import precision_score train_predictions = model.predict(train_x) precision_score(train_y, train_predictions)
Sprawdź dane wyjściowe. Jaka jest precyzja modelu?
Mierzenie precyzji
Biblioteka scikit-Learn zawiera także metodę o nazwie recall_score do obliczania kompletności. W celu zmierzenia kompletności modelu wykonaj następujące instrukcje:
from sklearn.metrics import recall_score recall_score(train_y, train_predictions)
Jaka jest kompletność modelu?
Mierzenie kompletności
Użyj polecenia File ->Save and Checkpoint, aby zapisać notes.
W świecie rzeczywistym doświadczony analityk danych szukałby sposobów, aby jeszcze bardziej zwiększyć dokładność modelu. Między innymi wypróbowałby różne algorytmy i podjął kroki, aby dostroić wybrany algorytm w celu znalezienia optymalnej kombinacji parametrów. Innym prawdopodobnym krokiem byłoby rozszerzenie zestawu danych do miliona wierszy, zamiast kilku tysięcy, a także podjęcie próby zmniejszenia dysproporcji między punktualnymi i opóźnionymi przylotami. Jednak dla naszych potrzeb obecny model jest wystarczająco dobry.