Underfitting vs. Overfitting#

Dieses Beispiel demonstriert die Probleme von Underfitting und Overfitting und wie wir lineare Regression mit polynomialen Merkmalen verwenden können, um nichtlineare Funktionen zu approximieren. Die Grafik zeigt die Funktion, die wir approximieren wollen, welche ein Teil der Kosinusfunktion ist. Zusätzlich werden die Stichproben aus der realen Funktion und die Approximationen verschiedener Modelle angezeigt. Die Modelle haben polynomiale Merkmale unterschiedlichen Grades. Wir können sehen, dass eine lineare Funktion (Polynom vom Grad 1) nicht ausreicht, um die Trainingsstichproben anzupassen. Dies wird als Underfitting bezeichnet. Ein Polynom vom Grad 4 approximiert die wahre Funktion nahezu perfekt. Bei höheren Graden wird das Modell jedoch die Trainingsdaten overfitten, d. h. es lernt das Rauschen der Trainingsdaten. Wir bewerten Overfitting / Underfitting quantitativ mithilfe von Kreuzvalidierung. Wir berechnen den mittleren quadratischen Fehler (MSE) auf dem Validierungsdatensatz. Je höher dieser ist, desto unwahrscheinlicher ist es, dass das Modell korrekt von den Trainingsdaten generalisiert.

Degree 1 MSE = 4.08e-01(+/- 4.25e-01), Degree 4 MSE = 4.32e-02(+/- 7.08e-02), Degree 15 MSE = 1.82e+08(+/- 5.46e+08)
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib.pyplot as plt
import numpy as np

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures


def true_fun(X):
    return np.cos(1.5 * np.pi * X)


np.random.seed(0)

n_samples = 30
degrees = [1, 4, 15]

X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1

plt.figure(figsize=(14, 5))
for i in range(len(degrees)):
    ax = plt.subplot(1, len(degrees), i + 1)
    plt.setp(ax, xticks=(), yticks=())

    polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
    linear_regression = LinearRegression()
    pipeline = Pipeline(
        [
            ("polynomial_features", polynomial_features),
            ("linear_regression", linear_regression),
        ]
    )
    pipeline.fit(X[:, np.newaxis], y)

    # Evaluate the models using crossvalidation
    scores = cross_val_score(
        pipeline, X[:, np.newaxis], y, scoring="neg_mean_squared_error", cv=10
    )

    X_test = np.linspace(0, 1, 100)
    plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
    plt.plot(X_test, true_fun(X_test), label="True function")
    plt.scatter(X, y, edgecolor="b", s=20, label="Samples")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.xlim((0, 1))
    plt.ylim((-2, 2))
    plt.legend(loc="best")
    plt.title(
        "Degree {}\nMSE = {:.2e}(+/- {:.2e})".format(
            degrees[i], -scores.mean(), scores.std()
        )
    )
plt.show()

Gesamtlaufzeit des Skripts: (0 Minuten 0,162 Sekunden)

Verwandte Beispiele

Polynomielle und Spline-Interpolation

Polynomielle und Spline-Interpolation

Vergleich von linearen Bayes'schen Regressoren

Vergleich von linearen Bayes'schen Regressoren

Robuste lineare Schätzeranpassung

Robuste lineare Schätzeranpassung

Klassifikationsgrenzen mit verschiedenen SVM-Kernen plotten

Klassifikationsgrenzen mit verschiedenen SVM-Kernen plotten

Galerie generiert von Sphinx-Gallery