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

# 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 секунд)
Связанные примеры
© 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