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 = 2.20e-01(+/- 4.20e-01)
# 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.221 секунды)

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–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/model_selection/plot_underfitting_overfitting.html

Spec-Zone.ru

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