Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью 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.221 секунды)
Похожие примеры
© 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