模型的选择也是需要一些技巧性和操作的,最重要的是我们所选择的模型最后的一个性能指标有提升,而且效果比较好的话,这个模型就是没有问题的。
模型选择策略
交叉验证
- 基本想法是重复地使用数据。将数据集随机切分,将切分的数据集组合为训练集和测试集,在此基础上反复进行训练,测试和模型选择。
K折交叉验证
- 随机地将数据切分为k个互不相同大小相同的子集;
- 每次利用k-1个子集的数据训练模型,余下的数据测试模型;
- 最后选择在k次测评中平均性能最好的模型。
过拟合欠拟合问题
我们如果判断了我们所选择的模型效果好与坏,或者哪个部分出现问题了,我们就要朝着正确方向对模型进行优化
模型过于复杂(例如参数过多),导致所选模型对已知数据预测得很好,但对未知数据预测很差。
对于上述问题,我们可以利用下面的方法进行纠正。
正则化:
- 正则化是模型选择的典型方法
- 在误差函数上加一个正则项,正则项通常为参数向量的范数
- 在训练误差和模型复杂度之间的权衡
学习曲线
-
学习曲线(learning curve)是关于模型在训练集和测试集上的预测性能曲线
-
横轴为训练集的样本数量,纵轴为交叉验证的正确率
-
能够判断模型的方差或偏差是否过高,以及增大训练集是否可以减小过拟合
- 偏差就是说模型整体预测结果离真实结果的一个偏的是比较多的(也就是误差较大)
- 方差就是说预测结果它比较分散一些,很难达到比较好的一个稳定性
图源scikitlearn官网
高偏差
随着我们训练集样本的一个整体数量增加,或者是训练集复杂度增加,模型整体的准确率是比较低的,均未达到理想状态
高方差
我们可以看到我们训练集的正确率是比较准确的,但是测试集的准确率有待提升,且两者的正确率差异较大
理想状态
训练集和测试集均贴近理想正确值,同时,随着我们的一个训练集的一个收敛,测试集也是达到了一个收敛状态
构建学习曲线
model_selection.learning_curve
| 参数 | 说明 |
|---|---|
| estimator | 指定的模型 |
| X | 训练集 |
| y | 训练集对应的标签 |
| train_sizes | 指定考察数据集的比例(浮点数)或数量(整数) |
| cv | 默认为3折交叉分类器,如果为整数即为指定的k值,也可直接指定k折交叉分类器 |
| scoring | 指定评价指标的字符串,默认采用.score方法,可选参数为:'accuracy’、‘f1’ 、‘logloss’和'mean_ squared_ error’ 等 |
更多可参考官方文档:scikit-learn.org/stable/modu…
from sklearn.model_selection import learning_curve
estimator = LogisticRegression()
CV = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0)
learning_curve(estimator, X, y,cv=cv,train_sizes=np.linspace(.1, 1.0, 5))
模型选择LogisticRegression,分类器选择ShuffleSplit (将数据打乱后再划分)