学习曲线 learning curves | 判断回归模型是否欠拟合和过拟合

过拟合:一个模型在训练集上表现良好,通过交叉验证指标(评估模型的泛化能力)得出的泛化能力很差。
欠拟合:在训练集和交叉验证指标上都表现不好。
意义:过拟合说明模型太复杂,欠拟合说明模型太简单。
学习曲线:画出模型在训练集上的表现,同时画出以训练集规模为自变量 的训练集函数,为了得到图像,需要在训练集的不同规模子集上进行多次训练。

Code:画出给定训练集后的模型学习曲线

from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

def plot_learning_curves(model, X, y):
    """
    plot learning curves
    
    parameters
    ----------
    model: 模型
    X:特征值数据集
    y:目标值
    """
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
        train_errors, test_errors = [], []
    for m in range(1, len(X_train)):
        model.fit(X_train[:m], y_train[:m])
        y_train_predict = model.predict(X_train[:m])
        y_test_predict = model.predict(X_test)
        train_errors.append(mean_squared_error(y_train_predict, y_train[:m]))
        test_errors.append(mean_squared_error(y_test_predict, y_test))
    plt.plot(np.sqrt(train_errors), "r-+", linewidth=2, label="train")
    plt.plot(np.sqrt(test_errors), "b-", linewidth=3, label="test")
    plt.legend(loc="upper right", fontsize=14)
    plt.xlabel("Training set size", fontsize=14)
    plt.ylabel("RMSE", fontsize=14)

线性回归模型

在这里插入图片描述
首先,我们观察训练集的表现:当训练集只有一两个样本的时候,模型能够非常好的拟合它们,这也是为什么曲线是从零开始的原因。但是当加入了一些新的样本的时候,训练集上的拟合程度变得难以接受,出现这种情况有两个原因,一是因为数据中含有噪声,另一个是数据根本不是线性的。因此随着数据规模的增大,误差也会一直增大, 直到达到高原地带并趋于稳定,在之后,继续加入新的样本,模型的平均误差不会变得更好或者更差。

我们继续来看模型在验证集上的表现,当以非常少的样本去训练时,模型不能恰 当的泛化,也就是为什么验证误差一开始是非常大的。当训练样本变多的到时候,模型学习的东西变多,验证误差开始缓慢的下降。但是一条直线不可能很好的拟合这些数据,因此最后误差会到达在一个高原地带并趋于稳定,最后和训练集的曲线非常接近。

欠拟合现象:

  • 两条曲线都到达高原地带并趋于稳定,并且最后两条曲线非常接近,同时误差值非常大。
  • 如果你的模型在训练集上是欠拟合的,添加更多的样本是没用的。你需要使用一个更复杂的模型或者找到更好的特征。

多项式回归模型

在这里插入图片描述
过拟合现象:

  • 在训练集上,误差要比线性回归模型低的多。
  • 图中的两条曲线之间有间隔,这意味模型在训练集上的表现要比验证集上好的多,这也是模型过拟合的显著特点。
  • 改善模型过拟合的一种方法是提供更多的训练数据,直到训练误差和验证误差相等。

参考:
《Hands-on Machine Learning with Sklearn and Tensoflow》

猜你喜欢

转载自blog.csdn.net/SanyHo/article/details/107511919