Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 125
Lernkurven
ОглавлениеWenn Sie höhergradige polynomielle Regressionen durchführen, werden Sie die Trainingsdaten deutlich genauer fitten als mit einer gewöhnlichen linearen Regression. Beispielsweise wird in Abbildung 4-14 ein polynomielles Modell 300. Grades auf die obigen Trainingsdaten angewandt und das Ergebnis mit einem gewöhnlichen linearen Modell und einem quadratischen Modell (einem Polynom 2. Grades) verglichen. Achten Sie darauf, wie das Polynom 3. Grades hin und her schwankt, um so nah wie möglich an die Trainingsdatenpunkte zu gelangen.
Abbildung 4-14: Regression mit einem höhergradigen Polynom
Natürlich ist beim Modell mit der höhergradigen Regression sehr starkes Overfitting zu finden, während beim linearen Modell Underfitting vorliegt. In diesem Fall verallgemeinert das quadratische Modell am besten. Das ist sinnvoll, weil ja auch den Daten ein quadratisches Modell zugrunde liegt, aber im Allgemeinen wissen Sie nicht, mit welcher Funktion die Daten generiert wurden. Wie also sollen Sie entscheiden, wie komplex Ihr Modell sein muss? Woher wissen Sie, ob Overfitting oder Underfitting der Daten vorliegt?
In Kapitel 2 haben Sie eine Kreuzvalidierung durchgeführt, um die Verallgemeinerungsleistung des Modells abzuschätzen. Wenn ein Modell auf den Trainingsdaten gut, aber bei der Kreuzvalidierung schlecht abschneidet, liegt in Ihrem Modell Overfitting vor. Erbringt es bei beiden eine schlechte Leistung, ist es Underfitting. Auf diese Weise können Sie herausfinden, ob Ihr Modell zu einfach oder zu komplex ist.
Eine Alternative dazu ist, sich die Lernkurven anzusehen: Diese Diagramme zeigen die Leistung des Modells auf den Trainings- und den Validierungsdaten über der Größe des Trainingsdatensatzes (oder die Trainingsiterationen). Um diese Plots zu erzeugen, trainieren Sie einfach das Modell mehrmals auf unterschiedlich großen Teilmengen des Trainingsdatensatzes. Der folgende Code definiert eine Funktion, die die Lernkurve eines Modells anhand der Trainingsdaten plottet:
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
def plot_learning_curves(model, X, y):
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
train_errors, val_errors = [], []
for m in range(1, len(X_train)):
model.fit(X_train[:m], y_train[:m])
y_train_predict = model.predict(X_train[:m])
y_val_predict = model.predict(X_val)
train_errors.append(mean_squared_error(y_train[:m], y_train_predict))
val_errors.append(mean_squared_error(y_val, y_val_predict))
plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")
plt.plot(np.sqrt(val_errors), "b-", linewidth=3, label="val")
Schauen wir uns die Lernkurven des einfachen linearen Regressionsmodells an (einer Geraden, Abbildung 4-15):
lin_reg = LinearRegression()
plot_learning_curves(lin_reg, X, y)
An dieser Stelle sind einige Erklärungen zum Underfitting-Modell angebracht. Zuerst betrachten wir die Vorhersageleistung auf den Trainingsdaten: Wenn der Trainingsdatensatz nur aus ein oder zwei Datenpunkten besteht, kann das Modell diese perfekt fitten. Deshalb beginnt die Kurve bei null. Aber sobald neue Datenpunkte hinzukommen, wird die perfekte Anpassung unmöglich, weil die Daten Rauschen enthalten und weil sie überhaupt nichtlinear sind. Daher steigt der Fehler auf den Trainingsdaten, bis er ein Plateau erreicht, bei dem zusätzliche Daten die durchschnittliche Abweichung weder verbessern noch verschlechtern. Schauen wir uns nun die Leistung des Modells auf den Validierungsdaten an. Wenn das Modell auf sehr wenigen Datenpunkten trainiert wird, kann es nicht anständig verallgemeinern, weswegen der Validierungsfehler zu Beginn recht groß ist. Sobald das Modell weitere Trainingsdaten kennenlernt, sinkt der Validierungsfehler allmählich. Allerdings kann auch hier eine Gerade irgendwann die Daten nicht gut modellieren, daher erreicht der Fehler ein Plateau in der Nähe der zweiten Kurve.
Abbildung 4-15: Lernkurven
Diese Lernkurven sind für ein Modell typisch, bei dem Underfitting vorliegt. Beide Kurven erreichen ein Plateau; sie liegen nah beieinander und recht weit oben.
Bei Underfitting der Trainingsdaten verbessert sich Ihr Modell durch zusätzliche Trainingsdaten nicht. Sie benötigen ein komplexeres Modell oder müssen bessere Merkmale finden. |
Betrachten wir nun die Lernkurven eines polynomiellen Modells 10. Grades auf den gleichen Daten (Abbildung 4-16):
from sklearn.pipeline import Pipeline
polynomial_regression = Pipeline([
("poly_features", PolynomialFeatures(degree=10, include_bias=False)),
("lin_reg", LinearRegression()),
])
plot_learning_curves(polynomial_regression, X, y)
Diese Lernkurven erinnern ein wenig an die vorherigen, es gibt aber zwei sehr wichtige Unterschiede:
Der Fehler auf den Trainingsdaten ist viel geringer als beim Modell mit der linearen Regression.
Es gibt eine Lücke zwischen den Kurven. Das bedeutet, dass das Modell auf den Trainingsdaten deutlich besser abschneidet als auf den Validierungsdaten. Dies ist die Handschrift eines Modells mit Overfitting. Wenn Sie allerdings einen deutlich größeren Datensatz verwendeten, würden sich die zwei Kurven weiter annähern.
Abbildung 4-16: Lernkurven für ein polynomielles Modell 10. Grades
Eine Möglichkeit, ein Modell mit Overfitting zu verbessern, ist, so lange zusätzliche Trainingsdaten bereitzustellen, bis der Validierungsfehler den Trainingsfehler erreicht. |