Menu
CoddyTech

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:

Wyniki dla pięciu podziałów dla każdego modelu przedstawione jako kropki, z czarną linią przy średniej. Kropki k-NN leżą blisko siebie wokół 0.867; wyniki regresji logistycznej są rozproszone od 0.73 do 0.93 wokół 0.873; drzewo osiąga 0.807

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.077

Wybierz najwyższą średnią; gdy średnie są zbliżone, wybierz mniejsze odchylenie standardowe.

challenge icon

Wyzwanie

Średni

Serwis 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.

  1. Utwórz KFold z taką liczbą podziałów, shuffle=True i random_state=0.
  2. 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.
  3. 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: logistic

Spró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
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nadzorowane

Poćwicz samodzielnie: Kompilator Python online