Kurs uczenia maszynowego od zera · Lekcja 1.3 · 4 z 33 gotowych lekcji · 12 min
Punkt odniesienia: z czym porównujesz model?
W skrócie
Zanim pochwalisz model, policz wynik bez uczenia: najczęstszą klasę lub średnią. Gdy chorych jest mało, „zawsze zdrowy” ma wysoką trafność i nikogo nie wykryje.
Rozgrzewka Dwa pytania z wcześniejszych lekcji. Minuta, a lekcji nie blokuje.
W lekcji 0.1 drzewo trafiało 95,1% pingwinów, a zgadywanie 43,7%. Ta druga liczba to punkt odniesienia (ang. baseline): wynik odpowiedzi, która niczego się nie uczy. Bez niego nie wiesz, czy model coś umie. Dziś zobaczysz, jak go policzyć w dwóch zadaniach i kiedy sama trafność oszukuje. Dane: 569 biopsji guzów piersi i 442 pacjentów z cukrzycą.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Eksperyment
Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać.
Pokaż odpowiedź
Poprawna odpowiedź: Około 99%, więcej niż wyuczona reguła, i nie wykryje żadnej
107 ze 108 biopsji to 99,1% trafności, a złośliwa przechodzi niezauważona. Wyuczona reguła z jednym progiem ma na tym teście 90,7%, czyli mniej, ale tę jedną złośliwą wykrywa. Na pełnym teście, z 64 złośliwymi, „zawsze łagodny” ma tylko 62,6%.
Spróbuj
- Zacznij od biopsji z wszystkimi 64 złośliwymi. O ile wyuczona reguła bije „zawsze łagodny”?
- Przesuwaj suwak w prawo, aż złośliwych będzie 5, a potem 1. Co dzieje się z trafnością „zawsze łagodny”, a co z liczbą wykrytych złośliwych?
- Przełącz na cukrzycę. Porównaj błąd prostej z BMI i modelu z 10 pomiarami z błędem samej średniej.
Gdy już sprawdzisz to w labie, nazwijmy, co widzisz.
Pomysł w prostych słowach
Punkt odniesienia to najprostsza odpowiedź, jaką da się dać bez uczenia. W klasyfikacji to najczęstsza klasa: wśród 398 biopsji do nauki łagodnych jest 250, więc odpowiedź brzmi zawsze „łagodny”. W regresji to średnia: każdy pacjent dostaje ten sam przewidywany postęp choroby, średni z pacjentów do nauki.
Model ma sens dopiero wtedy, gdy wyraźnie bije punkt odniesienia na tych samych danych testowych. Na biopsjach reguła z jednym pomiarem i progiem ma 91,2% wobec 62,6%. W cukrzycy model z 10 pomiarami ma błąd 2827 wobec 5076 dla średniej, czyli o 44,3% mniejszy. Prosta z samym BMI zmniejsza błąd tylko o 19,3%.
Jest też słabszy punkt odniesienia: zgadywanie w proporcjach, czyli „łagodny” z szansą taką, jaki jest udział łagodnych w nauce. Średnio trafia 53,2%, mniej niż „zawsze łagodny”. Dlatego za punkt odniesienia bierze się najczęstszą klasę: łatwiej ją pobić losowo niż zrozumieniem.
Jak to policzono
- Biopsje: Breast Cancer Wisconsin (Diagnostic), UCI, licencja CC BY 4.0. 569 biopsji (357 łagodnych, 212 złośliwych), 10 pomiarów jąder komórkowych.
- Cukrzyca: zbiór Diabetes (Efron i in., 2004) z scikit-learn; autorzy nie podali licencji. 442 pacjentów, 10 pomiarów, postęp choroby rok później.
- Podział 70/30, ten sam co
train_test_split(test_size=0.3, random_state=1)w scikit-learn; biopsje ze stratyfikacją. W teście 171 biopsji i 133 pacjentów. - Reguła: drzewo decyzyjne z jednym pytaniem (CART). Model regresji: metoda najmniejszych kwadratów.
Dlaczego to działa
Trafność „zawsze najczęstszej klasy” to po prostu udział tej klasy w teście. Na pełnym teście łagodnych jest 107 ze 171, stąd 62,6%. Gdy zostawisz 1 złośliwą, łagodne to 107 ze 108, stąd 99,1%. Trafność punktu odniesienia nie mówi nic o biopsjach. Mówi tylko, jak rzadka jest druga klasa.
Dlatego przy rzadkiej klasie trafność przestaje odróżniać dobry model od bezużytecznego. Przy 5 złośliwych w teście „zawsze łagodny” ma 95,5%, a reguła 91,1%, choć tylko reguła wykrywa wszystkie 5. To nie przypadek jednego podziału: na 100 różnych podziałach „zawsze łagodny” wygrywa w trafności z regułą w 82. Tu pomaga druga liczba obok trafności: ile przypadków klasy rzadkiej model naprawdę wykrył.
W regresji średnia jest najlepszą stałą odpowiedzią: żadna inna jedna liczba nie daje mniejszego błędu średniokwadratowego na danych do nauki. Każdy model, który ma pomiary, powinien ją pobić, i tu bije zawsze. Na 100 podziałach prosta z BMI i model z 10 pomiarami mają mniejszy błąd niż średnia za każdym razem, średnio o 33,7% i 48,5%.
Częsty błąd
Prawda czy fałsz: „90% trafności to dużo”. To nieprawda, a raczej: sama liczba tego nie mówi. Gdy choruje 1 osoba na 100, test „zawsze zdrowy” ma 99% trafności i nie wykrywa nikogo. Model z 90% byłby wtedy gorszy od niczego w trafności, a mógłby być bardzo cenny, jeśli wykrywa chorych. Zawsze podawaj punkt odniesienia obok wyniku i sprawdzaj, ile przypadków rzadkiej klasy model wykrył.
Gdzie ta analogia się psuje: punkt odniesienia to dolna granica, a nie cel. Pobicie go o włos zwykle nic nie znaczy, bo inny podział danych może odwrócić wynik.
Quiz
Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.
Najważniejsze wnioski
- Punkt odniesienia to wynik bez uczenia: najczęstsza klasa w klasyfikacji, średnia w regresji.
- Model porównujesz z punktem odniesienia na tych samych danych testowych, a nie z zerem.
- Gdy klasa jest rzadka, „zawsze częstsza klasa” ma wysoką trafność i nie wykrywa nikogo; podawaj też, ile rzadkich przypadków model wykrył.
- Przewagę sprawdzaj na wielu podziałach, bo jeden może wypaść korzystnie przez przypadek.
Głębiej: wzór, kod, praktyka
Matematyka
Trafność odpowiedzi „zawsze klasa k” to udział tej klasy w teście: trafność = n_k / n. Na pełnym teście 107 / 171 ≈ 0,626, przy jednej złośliwej 107 / 108 ≈ 0,991.
Zgadywanie „łagodny” z prawdopodobieństwem p (udział łagodnych w nauce, 250 / 398 ≈ 0,628) trafia średnio p · q + (1 − p) · (1 − q), gdzie q to udział łagodnych w teście. Na pełnym teście daje to około 0,532.
W regresji stała odpowiedź c ma błąd MSE(c) = (1/n) · Σ (yᵢ − c)². Pochodna −(2/n) · Σ (yᵢ − c) zeruje się przy c = ȳ, więc średnia daje najmniejszy błąd spośród wszystkich stałych. Względną poprawę liczysz jako 1 − MSE(model) / MSE(średnia): dla 10 pomiarów 1 − 2827 / 5076 ≈ 0,443.
W kodzie (Python)
Ten sam eksperyment w scikit-learn: punkt odniesienia i reguła z jednym progiem na biopsjach przy 64, 5 i 1 złośliwej w teście, porównanie na 100 podziałach, a potem średnia, prosta z BMI i model z 10 pomiarami w cukrzycy.
import numpy as np
from sklearn.datasets import load_breast_cancer, load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LinearRegression
X, y = load_breast_cancer(return_X_y=True)
X = X[:, :10] # 10 pomiarów „mean”, jak w labie; y: 0 = złośliwy, 1 = łagodny
def biopsies(seed, keep_malignant):
tr, te = train_test_split(np.arange(len(y)), test_size=0.3, stratify=y, random_state=seed)
te = np.sort(te) # wiersze testowe w kolejności z pliku, jak w labie
major = np.bincount(y[tr]).argmax() # punkt odniesienia: najczęstsza klasa w nauce
rule = DecisionTreeClassifier(max_depth=1, random_state=0).fit(X[tr], y[tr]) # jeden pomiar, jeden próg
rows = np.r_[te[y[te] == 1], te[y[te] == 0][:keep_malignant]] # wszystkie łagodne + pierwsze m złośliwych
pred = rule.predict(X[rows])
return (y[rows] == major).mean(), ((major == 0) & (y[rows] == 0)).sum(), (pred == y[rows]).mean(), ((pred == 0) & (y[rows] == 0)).sum()
for m in (64, 5, 1):
base, base_found, acc, found = biopsies(1, m)
print(f"malignant {m}: always benign {base:.3f} (finds {base_found}), rule {acc:.3f} (finds {found})")
wins = sum(biopsies(s, 5)[0] > biopsies(s, 5)[2] for s in range(100))
print(f"100 splits, 5 malignant: always benign beats the rule in {wins}")
Xd, yd = load_diabetes(return_X_y=True)
def diabetes(seed):
a, b, c, e = train_test_split(Xd, yd, test_size=0.3, random_state=seed)
mse = lambda p: ((e - p) ** 2).mean()
return mse(c.mean()), mse(LinearRegression().fit(a[:, [2]], c).predict(b[:, [2]])), mse(LinearRegression().fit(a, c).predict(b))
mean, bmi, full = diabetes(1)
print(f"diabetes: mean {mean:.0f}, BMI {bmi:.0f} ({1 - bmi / mean:.1%} lower), all 10 {full:.0f} ({1 - full / mean:.1%} lower)")
r = np.array([diabetes(s) for s in range(100)])
print(f"100 splits: BMI beats the mean in {(r[:, 1] < r[:, 0]).sum()}, all 10 in {(r[:, 2] < r[:, 0]).sum()}; error lower by {1 - r[:, 1].mean() / r[:, 0].mean():.1%} and {1 - r[:, 2].mean() / r[:, 0].mean():.1%} on average")
Wynik
malignant 64: always benign 0.626 (finds 0), rule 0.912 (finds 59)
malignant 5: always benign 0.955 (finds 0), rule 0.911 (finds 5)
malignant 1: always benign 0.991 (finds 0), rule 0.907 (finds 1)
100 splits, 5 malignant: always benign beats the rule in 82
diabetes: mean 5076, BMI 4096 (19.3% lower), all 10 2827 (44.3% lower)
100 splits: BMI beats the mean in 100, all 10 in 100; error lower by 33.7% and 48.5% on average
Na podziale 1 liczby są takie same jak w labie. Model z 10 pomiarami w labie liczy na danych zaokrąglonych do dwóch miejsc po przecinku, dlatego jego błąd może różnić się od tego kodu o ułamek, ale po zaokrągleniu wynosi tyle samo: 2827.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- W scikit-learn punkt odniesienia dają
DummyClassifier(strategy="most_frequent")iDummyRegressor(strategy="mean"). Licz go na tym samym podziale co model. - Przy niezrównoważonych klasach podawaj obok trafności czułość klasy rzadkiej albo zbalansowaną trafność; „zawsze częstsza klasa” ma zbalansowaną trafność 50%.
- Silniejszym punktem odniesienia bywa prosta reguła z jednym pomiarem albo poprzedni model w firmie. Nowy model musi pobić najlepszy z nich.
- Gdy przewaga nad punktem odniesienia jest mała, sprawdź ją na wielu podziałach albo w walidacji krzyżowej, zanim ją ogłosisz.
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: