Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 136
Early Stopping
ОглавлениеEin völlig anderes Verfahren zum Regularisieren iterativer Lernalgorithmen wie des Gradientenverfahrens ist es, das Training zu unterbrechen, sobald der Validierungsfehler ein Minimum erreicht. Dies bezeichnet man als Early Stopping. Abbildung 4-20 zeigt ein komplexes Modell (in diesem Fall ein höhergradiges polynomielles Regressionsmodell), das mit dem Batch-Gradientenverfahren trainiert wird. Von Epoche zu Epoche lernt der Algorithmus, und der Vorhersagefehler (RMSE) auf dem Trainingsdatensatz sinkt dabei ebenso wie der Vorhersagefehler auf dem Validierungsdatensatz. Nach einer Weile hört der Validierungsfehler aber auf zu sinken und steigt wieder an. Dies weist darauf hin, dass das Modell angefangen hat, die Trainingsdaten zu overfitten. Mit Early Stopping beenden Sie das Training, sobald der Validierungsfehler das Minimum erreicht. Diese Regularisierungstechnik ist derart einfach und effizient, dass Geoffrey Hinton sie ein »beautiful free lunch« genannt hat.
Abbildung 4-20: Regularisierung mit Early Stopping
Tipp: Beim stochastischen und beim Mini-Batch-Gradientenverfahren sind die Kurvenverläufe nicht ganz so glatt, und es ist manchmal schwierig zu erkennen, ob sie das Minimum erreicht haben oder nicht. Eine Möglichkeit ist, nur dann anzuhalten, wenn der Validierungsfehler eine Weile oberhalb des Minimums liegt (wenn Sie sich sicher sind, dass das Modell es nicht besser kann). Anschließend setzen Sie die Modellparameter wieder auf den Punkt zurück, an dem der Validierungsfehler minimal war.
Hier sehen Sie eine einfache Implementierung des Early Stopping:
from sklearn.base import clone
# Vorbereiten der Daten
poly_scaler = Pipeline([
("poly_features", PolynomialFeatures(degree=90, include_bias=False)),
("std_scaler", StandardScaler())
])
X_train_poly_scaled = poly_scaler.fit_transform(X_train)
X_val_poly_scaled = poly_scaler.transform(X_val)
sgd_reg = SGDRegressor(max_iter=1, tol=-np.infty, warm_start=True,
penalty=None, learning_rate="constant", eta0=0.0005)
minimum_val_error = float("inf")
best_epoch = None
best_model = None
for epoch in range(1000):
sgd_reg.fit(X_train_poly_scaled, y_train) # macht weiter, wo es aufgehört hat
y_val_predict = sgd_reg.predict(X_val_poly_scaled)
val_error = mean_squared_error(y_val, y_val_predict)
if val_error < minimum_val_error:
minimum_val_error = val_error
best_epoch = epoch
best_model = clone(sgd_reg)
Mit dem Aufruf der Methode fit() mit warm_start=True wird das Trainieren beim letzten Stand fortgesetzt, anstatt neu zu starten.