首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》6.3.1 使用学习曲线判定偏差和方差问题

关灯直达底部

如果一个模型在给定训练数据上构造得过于复杂——模型中有太多的自由度或者参数——这时模型可能对训练数据过拟合,而对未知数据泛化能力低下。通常情况下,收集更多的训练样本有助于降低模型的过拟合程度。但是,在实践中,收集更多数据会带来高昂的成本,或者根本不可行。通过将模型的训练及准确性验证看作是训练数据集大小的函数,并绘制其图像,我们可以很容易看出模型是面临高方差还是高偏差的问题,以及收集更多的数据是否有助于解决问题。在讲解如何通过scikit-learn绘制学习曲线之前,我们先通过下图来讨论一下模型常见的两个问题:

左上方图像显示的是一个高偏差模型。此模型的训练准确率和交叉验证准确率都很低,这表明此模型未能很好地拟合数据。解决此问题的常用方法是增加模型中参数的数量,例如,收集或构建额外特征,或者降低类似于SVM和逻辑斯谛回归器等模型的正则化程度。右上方图像中的模型面临高方差的问题,表明训练准确度与交叉验证准确度之间有很大差距。针对此类过拟合问题,我们可以收集更多的训练数据或者降低模型的复杂度,如增加正则化的参数;对于不适合正则化的模型,也可以通过第4章介绍的特征选择,或者第5章中的特征提取来降低特征的数量。需要注意:收集更多的训练数据可以降低模型过拟合的概率。不过该方法并不适用于所有问题,例如:训练数据中噪声数据较多,或者模型本身已经接近于最优。

在下一小节中,我们将看到如何使用验证曲线来解决模型中存在的问题,不过先看一下如何使用scikit-learn中的学习曲线函数评估模型:

执行上述代码,可以得到如下学习曲线:

通过learning_curve函数的train_size参数,我们可以控制用于生成学习曲线的样本的绝对或相对数量。在此,通过设置train_sizes=np.linspace(0.1,1.0,10)来使用训练数据集上等距间隔的10个样本。默认情况下,learning_curve函数使用分层k折交叉验证来计算交叉验证的准确性,通过cv参数将k的值设置为10。然后,我们可以简单地通过不同规模训练集上返回的交叉验证和测试评分来计算平均准确率,并且,我们使用matplotlib的plot函数绘制出准确率图像。此外,在绘制图像时,我们通过fill_between函数加入了平均准确率标准差的信息,用以表示评价结果的方差。

通过前面学习曲线图像可见,模型在测试数据集上表现良好。但是,在训练准确率曲线与交叉验证准确率之间,存在着相对较小差距,这意味着模型对训练数据有轻微的过拟合。