Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для скачивания полного кода примера. или для запуска этого примера в браузере через JupyterLite или Binder

Недообучение и переобучение

Этот пример демонстрирует проблемы недообучения и переобучения, а также то, как мы можем использовать линейную регрессию с полиномиальными признаками для приближения нелинейных функций. График показывает функцию, которую мы хотим приблизить, являющуюся частью косинусной функции. Кроме того, отображаются образцы из реальной функции и приближения различных моделей. Модели имеют полиномиальные признаки различных степеней. Мы видим, что линейной функции (полином первой степени) недостаточно для подгонки обучающих выборок. Это называется недостаточным обучением. Полином четвёртой степени приближает истинную функцию почти идеально. Однако для более высоких степеней модель будет переобучаться к обучающим данным, то есть она будет запоминать шум обучающих данных. Мы количественно оцениваем переобучение/недостаточное обучение, используя перекрестную проверку. Мы вычисляем среднеквадратичную ошибку (MSE) на проверочном наборе, чем выше, тем менее вероятно, что модель обобщает результаты корректно из обучающих данных.

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

Общее время выполнения сценария: (0 минут 0.261 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_underfitting_overfitting.ipynb

Download Python source code: plot_underfitting_overfitting.py

Download zipped: plot_underfitting_overfitting.zip

Связанные примеры

Интерполяция полиномов и сплайнов

Сравнение линейных байесовских регрессоров

Подгонка с помощью робастного линейного оценщика

График разделяющих границ с различными ядрами SVM

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/model_selection/plot_underfitting_overfitting.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API