python-学习曲线,判断过拟合,欠拟合

学习如何判断是否过拟合 欠拟合 以及模型是否效果很好,这是三组数据:

数据似乎按照二次方程式很好的分布,我们尝试拟合三个模型,第一个线性(一次)模型,效果不是太好 因为欠拟合 所以是个偏差很高的模型,第二个是二次方程式模型 效果不错,第三个是六次多项式,过拟合了 因此是高方差的模型。

现在我们将画出一些曲线 以便区分这些模型,先从高偏差线性模型开始,我们先使用几个点训练该模型,然后逐步增加点的数量,如果用四个点训练该模型,那么可以很好地拟合训练集,因此训练误差很小,我们将误差绘制在右侧图表中,但是当我们评估交叉验证数据时,因为只使用四个点训练模型,模型效果不会太好,因此交叉验证的误差肯定很高 ,我们不会显示交叉验证集,但是你可以想象出该数据的其他随机子集,我们将交叉验证误差绘制在这里,现在增加到 8 个点 ,再次训练线性模型训练误差可能会增大一点点 ,因为拟合八个点比四个点要困难,但是因为模型效果稍微好些, 我们使用了更多的数据来训练它或许交叉验证误差降低了一点点但是幅度并不大, 因为这是一个尝试拟合二次数据的线性模型,这是训练误差和交叉验证误差,现在增多到 12 个点 ,重新训练模型,同样训练误差可能会增大一点点, 因为有更多的训练数据需要拟合,但是交叉验证误差也会再降低一点点,因为有一个用更多数据进行训练的更好模型了,但是依然不会降低太多,似乎随着点的数量越来越增多训练误差将不断增大 测试误差将不断下降 如果画出这两条曲线它们将越来越接近或许在某个点还会汇合,汇合的点应该很高,因为这两个模型是欠拟合的 ,它们的误差不会很小.

现在对二次方程式模型执行相同的操作:

和之前一样 用四个点进行训练,训练集的效果很好 因此训练误差很小,但是只用了非常少的点训练模型,因此交叉验证集的结果可能不太理想,如果将点增多到 8 个,训练误差增大了 因为有更多的点要拟合,但是因为模型用更多的点进行训练 了解的信息更多,所以验证误差下降了 如果使用 12 个点进行训练.出现同样的情况,训练误差增大了 交叉验证误差下降了,和之前一样 这两条曲线越来越接近,但是交点更低.

最后对六次模型执行相同的流程:

训练误差始终不会变得太大,因为过拟合的模型在训练集中效果会很好,因为它们可以很好地拟合,交叉验证误差始终不会太低,因为我们看过过拟合的模型在交叉验证集中效果不太好,当我们增多训练点时,但是不会汇集成一点,它们之间始终存在一定的距离.

Summary:

 

通过学习曲线检测过拟合和欠拟合

对于这道测验,我们将使用三个模型来训练下面的圆形数据集。

  • 决策树模型,
  • 逻辑回归模型,以及
  • 支持向量机模型。

其中一个模型会过拟合,一个欠拟合,还有一个正常。首先,我们将编写代码为每个模型绘制学习曲线,最后我们将查看这些学习曲线,判断每个模型对应哪个曲线。

首先,请记住三个模型的学习曲线外观如下所示:

对于这道测验的第一部分,你只需取消注释其中一个分类器,并点击'测试答案'以查看学习曲线的图表。但是如果你喜欢编程的话,以下是一些编程详情。我们将使用函数 learning_curve

train_sizes, train_scores, test_scores = learning_curve(
    estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))

不需要担心该函数的所有参数(你可以在此处了解详情),这里,我们将解释主要参数:

  • estimator,是我们针对数据使用的实际分类器,例如 LogisticRegression() 或 GradientBoostingClassifier()
  • X 和 y 是我们的数据,分别表示特征和标签。
  • train_sizes 是用来在曲线上绘制每个点的数据大小。
  • train_scores 是针对每组数据进行训练后的算法训练得分。
  • test_scores 是针对每组数据进行训练后的算法测试得分。

两个重要的现象:

  • 训练和测试得分是一个包含 3 个值的列表,这是因为函数使用了 3 折交叉验证。
  • 非常重要:可以看出,我们使用训练和测试误差来定义我们的曲线,而这个函数使用训练和测试得分来定义曲线。二者是相反的,因此误差越高,得分就越低。因此,当你看到曲线时,你需要自己在脑中将它颠倒过来,以便与上面的曲线对比。

第 1 部分:绘制学习曲线

这里,我们将对比三个模型:

  • 逻辑回归模型。
  • 决策树模型。
  • 支持向量机模型,具有 RBF 内核,γ 参数为 1000(稍后我们将了解它们的含义)。
# Import, read, and split data
import pandas as pd
data = pd.read_csv('data.csv')
import numpy as np
X = np.array(data[['x1', 'x2']])
y = np.array(data['y'])

# Fix random seed
np.random.seed(55)

### Imports
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC

# TODO: Uncomment one of the three classifiers, and hit "Test Run"
# to see the learning curve. Use these to answer the quiz below.

### Logistic Regression
#estimator = LogisticRegression()   

### Decision Tree
#estimator = GradientBoostingClassifier()

### Support Vector Machine
#estimator = SVC(kernel='rbf', gamma=1000)


输出图像依次为下方三图

 

解决方案:检测过拟合与欠拟合

以下是你应该获得的曲线:

我们可以根据这些曲线得出结论:

  • 对数几率回归模型的训练和测试得分很低。
  • 决策树模型的训练和测试得分很高。
  • 支持向量机模型的训练得分很高,测试得分很低。

由此可以判断,逻辑回归模型欠拟合,支持向量机模型过拟合,决策树正常。

同样,我们可以翻转这些曲线(因为它们测量的是得分,而原始曲线测量的是错误),并将它们与下面的三条曲线对比,可以看出它们与我们之前看到的三条曲线很像。(注意:我们需要翻转曲线并不意味着错误是 1 减去得分。只是表示模型越来越好的话,错误会降低,得分会升高。

现在我们应该检测在实际模型中是否这样。当我们绘制每个模型的界限曲线时,结果如下所示:

当我们查看上述模型时,第一个模型欠拟合,第二个正常,第三个过拟合,这种现象合理吗?合理吧?我们看到数据由圆圈或方框正确地划分出来。我们的模型按以下形式划分数据:

  • 逻辑回归模型使用一条直线,这太简单了。在训练集上的效果不太好,因此欠拟合
  • 决策树模型使用一个方形,拟合的很好,并能够泛化。因此,该模型效果很好
  • 支持向量机模型实际上在每个点周围都画了一个小圆圈。它实际上是在记住训练集,无法泛化。因此 过拟合

最好尽可能进行实际检查,确保模型的确具有指标所指示的行为。

  • 12
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随机森林是一种集成学习算法,它通过组合多个决策树来进行分类或回归任务。过拟合是指模型在训练数据上表现良好,但在测试数据上表现较差的情况。为了判断随机森林是否过拟合,可以使用学习曲线学习曲线是一种用于可视化模型性能的工具,它显示了模型在不同训练样本数量下的训练误差和验证误差。通过观察学习曲线,我们可以判断模型是否过拟合欠拟合。 以下是一个简单的学习曲线代码示例,用于判断随机森林是否过拟合: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import learning_curve # 创建随机森林分类器 rf = RandomForestClassifier(n_estimators=100) # 生成学习曲线数据 train_sizes, train_scores, test_scores = learning_curve( rf, X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 10)) # 计算平均值和标准差 train_mean = np.mean(train_scores, axis=1) train_std = np.std(train_scores, axis=1) test_mean = np.mean(test_scores, axis=1) test_std = np.std(test_scores, axis=1) # 绘制学习曲线 plt.figure(figsize=(10, 6)) plt.plot(train_sizes, train_mean, 'o-', color='r', label='Training Score') plt.plot(train_sizes, test_mean, 'o-', color='g', label='Validation Score') plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.1, color='r') plt.fill_between(train_sizes, test_mean - test_std, test_mean + test_std, alpha=0.1, color='g') plt.xlabel('Training Set Size') plt.ylabel('Score') plt.title('Learning Curve') plt.legend(loc='best') plt.show() ``` 在上述代码中,我们使用了`learning_curve`函数来生成学习曲线的数据。`n_estimators`参数表示随机森林中决策树的数量,`X`和`y`分别表示输入特征和目标变量。`cv`参数表示交叉验证的折数,`train_sizes`参数表示训练样本的相对数量。 通过绘制学习曲线,我们可以观察到训练误差和验证误差之间的关系。如果随着训练样本数量的增加,训练误差和验证误差都趋于收敛且误差较低,则说明模型拟合良好。如果训练误差较低但验证误差较高,则可能存在过拟合的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayuelei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值