Pierwszy projekt ML na otwartych danych krok po kroku
W skrócie
Sześć kroków na otwartych danych o pingwinach: pytanie, dane, podział, zgadywanie, model, ocena. Kilkanaście linijek Pythona i wynik 95,1% do sprawdzenia.
Krótka odpowiedź
Pierwszy projekt uczenia maszynowego zrób na małym, otwartym i czystym zbiorze danych, w sześciu krokach: pytanie, dane, podział, zgadywanie bez modelu, model, ocena. Na zbiorze Palmer Penguins całość to kilkanaście linijek Pythona w darmowym notatniku w przeglądarce (Google Colab albo notatnik Kaggle). Wynik: drzewo decyzyjne rozpoznaje gatunek 98 ze 103 pingwinów, których nie widziało (95,1%), a zgadywanie bez modelu trafia 45 razy (43,7%).
Te same kroki, bez kodu i z suwakami, przejdziesz w lekcji Cały proces w 15 minut. Liczby wyjdą Ci identyczne, bo lekcja liczy dokładnie ten podział.
Dlaczego pingwiny
Dobry pierwszy zbiór jest mały, ma jasne pytanie i nie wymaga godzin czyszczenia. Palmer Penguins to 344 pingwiny trzech gatunków (Adelie, Chinstrap, Gentoo) z czterema pomiarami ciała, zebrane przez badaczy na Antarktydzie i udostępnione na licencji CC0, czyli bez ograniczeń. Inne dobre zbiory na start też mają w Atlasie swoje strony: irysy (150 kwiatów), wina (178 win) i guzy piersi (569 biopsji).
Krok 1. Pytanie
Zapisz jednym zdaniem, co przewidujesz i z czego: gatunek pingwina z czterech wymiarów ciała. Dobre pytanie da się sprawdzić, bo prawdziwą odpowiedź znamy dla każdego pingwina w danych.
Krok 2. Dane
Otwórz nowy notatnik i wczytaj plik prosto z repozytorium autorów zbioru:
import pandas as pddf = pd.read_csv("https://raw.githubusercontent.com/allisonhorst/palmerpenguins/main/inst/extdata/penguins.csv")cechy = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]df = df.dropna(subset=cechy)
Plik ma 344 wiersze. 2 pingwiny nie mają żadnego pomiaru, więc zostają 342. Zawsze najpierw obejrzyj dane (df.head(), df.isna().sum()): to tu najczęściej czeka niespodzianka.
Krok 3. Podział
Chowasz część pingwinów przed modelem. Tylko na nich sprawdzisz, czy model nauczył się reguły, a nie zapamiętał odpowiedzi.
from sklearn.model_selection import train_test_splitX, y = df[cechy], df["species"]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=1)
Model uczy się na 239 pingwinach, a 103 (30%) czekają na sprawdzian. stratify=y pilnuje tych samych proporcji gatunków w obu częściach. random_state=1 sprawia, że dostaniesz dokładnie ten sam podział co my.
Krok 4. Zgadywanie bez modelu
Zanim zbudujesz model, policz, ile daje odpowiedź bez myślenia: „zawsze najczęstszy gatunek”.
from sklearn.dummy import DummyClassifierzgad = DummyClassifier(strategy="most_frequent").fit(X_train, y_train)zgad.score(X_test, y_test)
Wynik: 45 ze 103, czyli 43,7%. To Twój punkt odniesienia. Bez niego nie wiesz, czy wynik modelu to dużo, czy mało.
Krok 5. Model
Drzewo decyzyjne zadaje pingwinowi pytania tak/nie o wymiary. Pozwólmy mu na najwyżej 2 pytania.
from sklearn.tree import DecisionTreeClassifiermodel = DecisionTreeClassifier(max_depth=2).fit(X_train, y_train)
Krok 6. Ocena
model.score(X_test, y_test)
Drzewo trafia 98 ze 103 schowanych pingwinów: 95,1%, o 51,5 punktu procentowego więcej niż zgadywanie. Z jednym pytaniem (max_depth=1) trafia 81 razy (78,6%).
Trzy błędy, które warto popełnić świadomie
- Ocena na danych do nauki. Ustaw
max_depth=3. Na pingwinach do nauki drzewo ma 97,5%, ale na schowanych tylko 93,2%, mniej niż z dwoma pytaniami. Trzecie pytanie zaczęło zapamiętywać pojedyncze pingwiny. To przeuczenie. - Brak punktu odniesienia. Bez kroku 4 wynik 95,1% nic nie mówi. Przy innych danych tyle samo może dawać zgadywanie, gdy jedna klasa stanowi 95% przykładów.
- Zaglądanie do testu. Jeśli wybierasz
max_depth, patrząc na wynik na schowanych pingwinach, test przestaje być uczciwy. Do wybierania ustawień służy walidacja krzyżowa, a o pokrewnej pułapce przeczytasz w haśle wyciek danych.
Co dalej
- Zmień zbiór: spróbuj tych samych kroków na irysach albo winach (w scikit-learn:
load_iris,load_wine). - Start tutaj: mapa na pierwsze 15 minut i darmowe materiały z zewnątrz.
- Kurs ML od zera: każdy z sześciu kroków dostaje osobny moduł.
- Newsletter „ML jak dziecku”: jedno pojęcie w mailu, z linkiem do eksperymentu.
Źródła
- Gorman K. B., Williams T. D., Fraser W. R., „Ecological sexual dimorphism and environmental variability within a community of Antarctic penguins (genus Pygoscelis)”, PLoS ONE 9(3), e90081 (2014): https://doi.org/10.1371/journal.pone.0090081
- Horst A. M., Hill A. P., Gorman K. B., pakiet palmerpenguins (dane, licencja CC0; plik CSV z wpisu), sprawdzone 25.10.2026: https://github.com/allisonhorst/palmerpenguins
- Dokumentacja scikit-learn:
train_test_split,DummyClassifier,DecisionTreeClassifier, sprawdzone 25.10.2026: https://scikit-learn.org/stable/modules/tree.html, https://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html - Liczby policzyliśmy dwa razy: kodem z tego wpisu (scikit-learn 1.7.2) i kodem lekcji „Cały proces w 15 minut”; wyniki są te same.