Menu
CoddyTech

Modelle fair vergleichen

Teil des Abschnitts Überwachtes Lernen der Machine Learning-Journey von Coddy. Lektion 38 von 58.

Modelle anhand eines einzigen Splits zu vergleichen, ist ein Glücksspiel: Ein Modell kann einen besonders günstigen Testsatz erwischen. Verwende stattdessen für jedes Modell dieselben fünf Folds. Für 150 Banknoten, echt oder gefälscht:

Punkte für die Ergebnisse der fünf Folds pro Modell, mit einer schwarzen Linie beim jeweiligen Mittelwert. Die Punkte von k-NN liegen dicht beieinander bei etwa 0.867; die von logistic sind zwischen 0.73 und 0.93 gestreut, bei einem Mittelwert von etwa 0.873; der Baum liegt mit 0.807 zurück

k-NN und logistische Regression liegen innerhalb ihrer Schwankungsbreite gleichauf, und k-NN ist stabiler. Der Entscheidungsbaum liegt zurück.

Ein KFold-Splitter mischt die Zeilen einmal und übergibt jedem Modell identische Folds:

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}")

Es gibt die Zahlen in der Tabelle aus:

0.867 0.042
0.873 0.074
0.807 0.077

Wähle den höchsten Mittelwert; wenn die Mittelwerte nahe beieinanderliegen, die kleinere Standardabweichung.

challenge icon

Aufgabe

Mittel

Eine Kochwebsite sagt voraus, welche Besucher ein Rezept kochen, das sie öffnen. Der Startcode bewertet drei Modelle anhand einer einzigen Aufteilung, und der Baum gewinnt. Überprüfe das fair; das Programm liest die Anzahl der Folds ein.

  1. Erstelle ein KFold mit dieser Anzahl an Aufteilungen, shuffle=True und random_state=0.
  2. Führe für jedes Modell eine Kreuzvalidierung mit diesen Folds durch; gib den Mittelwert und die Standardabweichung mit 3 Dezimalstellen aus.
  3. Gib das Modell mit dem höchsten Mittelwert aus.

Für andere Besucher und 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

Probier es selbst

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())

# Ändere die folgenden Zeilen nicht: 300 Besucher, 6 Surfgewohnheiten; das Label 1 bedeutet, dass sie das Rezept nachgekocht haben
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)]

# Eine einzige Aufteilung kürt einen Gewinner
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)]}")

# Schreibe deinen Code unten
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Überwachtes Lernen

Übe selbstständig: Online-Python-Compiler