Uczciwe porównywanie modeli
Część sekcji Uczenie nadzorowane ścieżki Machine Learning w Coddy. Lekcja 38 z 58.
Porównywanie modeli na jednym podziale to rzut monetą: jeden z nich może trafić na szczęśliwy zbiór testowy. Zamiast tego daj każdemu modelowi te same pięć podziałów. Dla 150 banknotów, prawdziwych lub fałszywych:
k-NN i regresja logistyczna remisują w granicach swojego wahania, a k-NN jest stabilniejszy. Drzewo wypada gorzej.
Podział KFold tasuje wiersze raz i przekazuje każdemu modelowi identyczne podzbiory:
from sklearn.model_selection import KFold
folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
scores = cross_val_score(model, X, y, cv=folds)
print(f"{scores.mean():.3f} {scores.std():.3f}")Wyświetla liczby na wykresie:
0.867 0.042
0.873 0.074
0.807 0.077Wybierz najwyższą średnią; gdy średnie są zbliżone, wybierz mniejsze odchylenie standardowe.
Wyzwanie
ŚredniSerwis kulinarny przewiduje, którzy odwiedzający ugotują przepis, który otworzą. Kod startowy ocenia trzy modele na jednym podziale, a wygrywa drzewo. Sprawdź to rzetelnie; program odczytuje liczbę podziałów.
- Utwórz
KFoldz taką liczbą podziałów,shuffle=Trueirandom_state=0. - Przeprowadź walidację krzyżową każdego modelu na tych podziałach; wypisz jego średnią i odchylenie standardowe, z dokładnością do 3 miejsc po przecinku.
- Wypisz model z najwyższą średnią.
Dla innych odwiedzających i wartości 5:
One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logisticSpróbuj swoich sił
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
n_folds = int(input())
# Nie zmieniaj poniższych wierszy: 300 odwiedzających, 6 nawyków przeglądania; etykieta 1 oznacza, że przygotowali danie według przepisu
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
DecisionTreeClassifier(max_depth=4, random_state=0)]
# Jeden podział wyłania zwycięzcę
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
model.fit(X_train, y_train)
single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")
# Napisz swój kod poniżej
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Uczenie nadzorowane
1Twój pierwszy model
Uczenie się na przykładachZbiory treningowe i testoweDopasowywanie i przewidywanieOcena modeluPodsumowanie: Sortownik nasion4Regresja logistyczna
Przewidywanie „tak” lub „nie”Próg decyzyjnyWagi jako dowodyWiele klasPodsumowanie: filtr spamu2Najbliżsi sąsiedzi
Jak działa k-NNWybór kGranice decyzyjneSkalowanie dla sąsiadówPodsumowanie: sąsiedzi w zbiorze Wine5Ocena klasyfikatorów
Macierz pomyłekPrecyzja i czułośćWynik F1Niezrównoważone klasyKrzywe ROCPodsumowanie: test przesiewowy8Walidacja krzyżowa
Walidacja k-krotnaUczciwe porównywanie modeliPrzeszukiwanie siatkiPodsumowanie: naprawa deskorolki11Projekt: Gatunki pingwinów
Poznaj pingwinyPrzygotuj daneWybierz modelDopracuj zwycięski modelWdróż modelPoćwicz samodzielnie: Kompilator Python online