ML Atlas

Kurs uczenia maszynowego od zera · Lekcja 0.1 · 1 z 33 gotowych lekcji · 15 min

Cały proces w 15 minut, od pytania do oceny

W skrócie

Cała droga projektu uczenia maszynowego na jednym zbiorze danych: pytanie, dane, podział, zgadywanie, model i ocena. Bez punktu odniesienia wynik nic nie mówi.

Zanim poznasz części, zobacz całą grę. Tak uczy się piłki nożnej: najpierw mecz, potem ćwiczenie podań. W tej lekcji przejdziesz cały projekt uczenia maszynowego w kwadrans, na jednym zbiorze danych: pingwinach trzech gatunków, które badacze zmierzyli na wyspach u wybrzeży Antarktydy. Każdy następny moduł kursu otwiera jeden z sześciu kroków, które tu zobaczysz naraz.

Przewidź, potem sprawdź Drzewo decyzyjne (model, który zadaje po kolei pytania tak/nie) może zadać każdemu pingwinowi najwyżej 2 takie pytania o wymiary ciała. Ile ze 103 pingwinów, których nigdy nie widziało, rozpozna poprawnie?
Jak bardzo jesteś pewny(-a)?

Eksperyment

Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać.

Pokaż odpowiedź

Poprawna odpowiedź: Prawie wszystkie, ponad 9 na 10

Dwa pytania dają 98 ze 103 (95,1%), jedno pytanie 81 (78,6%). Samo zgadywanie „zawsze Adelie”, bez żadnego modelu, trafia 45 razy (43,7%) i to ono mówi, czy 95,1% to dużo. Trzecie pytanie nie pomaga: 96 ze 103 (93,2%).

Spróbuj

  • Ustaw 0 pytań. To zgadywanie bez modelu: ilu pingwinom pasuje odpowiedź „zawsze Adelie”?
  • Przejdź na 1, potem na 2 pytania. Przeczytaj pytania drzewa pod wykresem: o które wymiary pyta?
  • Przy 2 pytaniach przesuwaj suwak podziału. Czy na którymś podziale przewaga nad zgadywaniem znika?
  • Wróć do podziału 1 i ustaw 3 pytania. Czy dodatkowe pytanie zawsze pomaga?

Gdy już sprawdzisz to w labie, nazwijmy kroki, które właśnie przeszedłeś.

Pomysł w prostych słowach

Każdy projekt uczenia maszynowego, od pingwinów po wykrywanie oszustw w banku, idzie przez te same sześć kroków:

  1. Pytanie. Co dokładnie przewidujesz i z czego? Tu: gatunek pingwina z czterech wymiarów ciała. Dobre pytanie da się sprawdzić, bo prawdziwe gatunki znamy.
  2. Dane. Plik ma 344 pingwiny, ale 2 nie mają żadnego pomiaru, więc zostają 342. Płci brakuje w 11 wierszach. Gdybyśmy wyrzucili każdy wiersz z jakimkolwiek brakiem, zostałoby 333, ale płci tu nie używamy, więc tracimy tylko te 2.
  3. Podział. 103 pingwiny, czyli 30%, chowamy przed modelem. Model uczy się na pozostałych 239, a sprawdzamy go tylko na schowanych. Część do nauki to zbiór treningowy, schowana część to zbiór testowy.
  4. Punkt odniesienia. Zanim zbudujesz model, policz, ile daje odpowiedź bez myślenia. Wśród pingwinów do nauki najczęstszy jest Adelie, więc „zawsze Adelie” trafia 45 ze 103 testowych: 43,7%.
  5. Model. Drzewo decyzyjne to ciąg pytań tak/nie. Z dwoma pytaniami najpierw pyta o płetwę (do 207 mm czy dłuższa), a potem o długość albo wysokość dzioba.
  6. Ocena. Drzewo trafia 98 ze 103, czyli 95,1%: o 51,5 pkt proc. więcej niż zgadywanie.

Kolejne moduły kursu otwierają te kroki po kolei: jak model uczy się z przykładów i z czym go porównać (moduł 1), jak mierzyć wynik (moduł 2), czy wynik przetrwa nowe dane (moduł 3), co psuje dane (moduł 4), jakie modele wybierać (moduł 5) i co dzieje się z modelem w świecie (moduł 6).

Jak to policzono
  • Dane: Palmer Penguins (Gorman, Williams i Fraser, 2014; pakiet palmerpenguins: Horst, Hill i Gorman, 2020), licencja CC0. W pliku 344 pingwiny, 342 z kompletem czterech pomiarów.
  • Podział: 70/30, w obu częściach te same proporcje gatunków; podział 1 to ten sam podział co train_test_split(test_size=0.3, stratify=y, random_state=1) w scikit-learn.
  • Model: drzewo decyzyjne (CART, indeks Giniego), najwyżej 1, 2 albo 3 pytania na każdej ścieżce.
  • Punkt odniesienia: najczęstszy gatunek wśród pingwinów do nauki.

Dlaczego to działa

Wynik na schowanych pingwinach coś znaczy, bo model ich nie widział. Gdyby sprawdzać go na pingwinach do nauki, mógłby po prostu zapamiętać odpowiedzi. Dlatego drzewo z trzema pytaniami ma 97,5% na pingwinach do nauki, a na schowanych tylko 93,2%, mniej niż drzewo z dwoma pytaniami. Trzecie pytanie zaczęło uczyć się pojedynczych pingwinów zamiast reguły. To przeuczenie, temat modułu 3.

Drzewo radzi sobie tak dobrze, bo gatunki naprawdę różnią się budową. Gentoo mają długie płetwy, więc pierwsze pytanie prawie je oddziela: wśród pingwinów do nauki z płetwą dłuższą niż 207 mm 85 z 91 to Gentoo. Wśród krótszych płetw długi dziób zdradza Chinstrapa, a krótki Adelie: w grupie z płetwą do 207 mm i dziobem do 43,4 mm 101 ze 103 pingwinów do nauki to Adelie.

Punkt odniesienia jest potrzebny, bo trafność zależy od zadania. Przy trzech gatunkach losowy rzut kością trafiłby co trzeci raz, a „zawsze najczęstszy gatunek” trafia 43,7%. Model ma sens dopiero wtedy, gdy wyraźnie bije tę prostą odpowiedź.

Jeden podział to jedno losowanie. Na 20 podziałach w labie dwa pytania trafiają od 94 do 100 ze 103 pingwinów (od 91,3% do 97,1%), a zgadywanie za każdym razem 43,7%. Przewaga zostaje, choć dokładna liczba się zmienia.

Częsty błąd

Prawda czy fałsz: „95% trafności to świetny wynik”. To nieprawda, a raczej: sama liczba tego nie mówi. Trafność zależy od proporcji klas i od tego, jak łatwe jest zadanie. Tu zgadywanie daje 43,7%, więc 95,1% to ogromna poprawa. Ale gdy 95 na 100 maili to zwykłe wiadomości, filtr, który nic nie robi i każdy mail przepuszcza, też ma 95% trafności i nie łapie ani jednego spamu. Najpierw punkt odniesienia, potem zachwyt.

Gdzie ta analogia się psuje: w piłce mecz ma koniec, a projekt rzadko idzie po prostej. Po ocenie często wracasz do pytania albo do danych, bo wynik pokazał, czego brakuje.

Quiz

Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.

1. Po co chowamy część danych przed modelem?
Pokaż odpowiedź

Poprawna odpowiedź: Żeby sprawdzić go na przykładach, których nigdy nie widział

Wynik na schowanych przykładach mówi, jak model poradzi sobie z nowymi. Na przykładach do nauki mógłby po prostu pamiętać odpowiedzi.

2. Model rozpoznaje gatunek 75 na 100 pingwinów. Czego potrzebujesz, żeby ocenić, czy to dobrze?
Pokaż odpowiedź

Poprawna odpowiedź: Wyniku prostego zgadywania na tych samych danych testowych

Liczba bez punktu odniesienia nic nie mówi. Jeśli zgadywanie daje 43,7%, to 75% to postęp; gdyby dawało 80%, model byłby gorszy od zgadywania.

3. Która kolejność kroków projektu jest właściwa?
Pokaż odpowiedź

Poprawna odpowiedź: dane → podział → punkt odniesienia → model → ocena

Najpierw chowasz część danych, potem liczysz prosty punkt odniesienia, a dopiero na końcu budujesz model i oceniasz go na schowanej części.

Najważniejsze wnioski

  • Każdy projekt uczenia maszynowego to te same kroki: pytanie, dane, podział, punkt odniesienia, model i ocena.
  • Model ocenia się na danych, których nie widział; wynik na danych do nauki jest zawyżony.
  • Liczba bez punktu odniesienia nic nie mówi: 95,1% to dużo, bo samo zgadywanie daje 43,7%.
  • Jeden podział to jedno losowanie, więc sprawdź wynik na kilku podziałach.

Głębiej: wzór, kod, praktyka

Matematyka

Trafność to udział poprawnych odpowiedzi: trafność = poprawne / wszystkie. Zgadywanie „zawsze Adelie” daje 45 / 103 ≈ 0,437, a drzewo z dwoma pytaniami 98 / 103 ≈ 0,951. Różnica to 98 / 103 − 45 / 103 = 53 / 103 ≈ 0,515, czyli 51,5 pkt proc.

Odpowiedź „zawsze najczęstsza klasa” ma trafność równą udziałowi tej klasy w zbiorze testowym. Adelie to 151 z 342 pingwinów (44,2%); podział zachowuje proporcje gatunków, więc w teście jest ich 45 ze 103. Losowy wybór jednego z trzech gatunków trafiałby średnio w 1 / 3 ≈ 33,3% przypadków.

Drzewo o głębokości d dzieli dane na najwyżej 2^d grup: przy 2 pytaniach to 4 grupy, a każda przewiduje gatunek, który przeważa w niej wśród pingwinów do nauki.

W kodzie (Python)

Ten sam eksperyment w scikit-learn: podział 1 z labu, punkt odniesienia, drzewa o głębokości 1–3 i drzewo z dwoma pytaniami na 100 różnych podziałach. Notebook podlinkowany pod wynikiem sam pobierze dane.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

df = pd.read_csv("data/raw/penguins.csv")
cols = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
d = df.dropna(subset=cols)  # tylko pingwiny z kompletem pomiarów
print(f"penguins {len(df)}, with measurements {len(d)}, without any gap {len(df.dropna())}")
X, y = d[cols], d["species"]
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
guess = ytr.value_counts().idxmax()  # punkt odniesienia: najczęstszy gatunek w części do nauki
print(f"train {len(Xtr)}, test {len(Xte)}; always {guess}: {(yte == guess).sum()} of {len(yte)} = {(yte == guess).mean():.3f}")
for depth in (1, 2, 3):
    tree = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(Xtr, ytr)
    print(f"depth {depth}: {(tree.predict(Xte) == yte).sum()} of {len(yte)} = {tree.score(Xte, yte):.3f} (train {tree.score(Xtr, ytr):.3f})")
scores = []
for seed in range(100):  # 100 różnych losowań podziału
    a, b, c, e = train_test_split(X, y, test_size=0.3, stratify=y, random_state=seed)
    scores.append(DecisionTreeClassifier(max_depth=2, random_state=0).fit(a, c).score(b, e))
print(f"depth 2 on 100 splits: mean {sum(scores) / 100:.3f}, min {min(scores):.3f}, max {max(scores):.3f}")

Wynik

penguins 344, with measurements 342, without any gap 333
train 239, test 103; always Adelie: 45 of 103 = 0.437
depth 1: 81 of 103 = 0.786 (train 0.791)
depth 2: 98 of 103 = 0.951 (train 0.967)
depth 3: 96 of 103 = 0.932 (train 0.975)
depth 2 on 100 splits: mean 0.949, min 0.883, max 0.990

Na podziale 1 wyniki są takie same jak w labie. Na 100 innych podziałach drzewo z dwoma pytaniami trafia średnio 94,9%, najgorzej 88,3%, najlepiej 99,0%, a zgadywanie za każdym razem 43,7%.

Dla praktyka
  • Zawsze zaczynaj od punktu odniesienia. W scikit-learn robi to DummyClassifier(strategy="most_frequent"), a w regresji średnia.
  • Schowaj zbiór testowy na samym początku i nie zaglądaj do niego przy wyborze modelu. Do wyboru służy walidacja (moduł 3).
  • Gdy klasy mają różną liczebność, dziel ze stratyfikacją (stratify=y), żeby proporcje w obu częściach były takie same.
  • Podawaj wynik z kilku podziałów albo z walidacji krzyżowej, a nie jedną liczbę z jednego losowania.
  • Zapisz ziarno losowania (random_state), żeby ktoś mógł odtworzyć wynik, i sprawdź licencję danych, zanim ich użyjesz.

Więcej w Atlasie

Hasła encyklopedii o pojęciach z tej lekcji: