数据分析之如何选择合适的模型

1,842 阅读3分钟

模型的选择也是需要一些技巧性和操作的,最重要的是我们所选择的模型最后的一个性能指标有提升,而且效果比较好的话,这个模型就是没有问题的。

模型选择策略

交叉验证

  • 基本想法是重复地使用数据。将数据集随机切分,将切分的数据集组合为训练集和测试集,在此基础上反复进行训练,测试和模型选择。

K折交叉验证

  • 随机地将数据切分为k个互不相同大小相同的子集;
  • 每次利用k-1个子集的数据训练模型,余下的数据测试模型;
  • 最后选择在k次测评中平均性能最好的模型。

过拟合欠拟合问题

我们如果判断了我们所选择的模型效果好与坏,或者哪个部分出现问题了,我们就要朝着正确方向对模型进行优化

模型过于复杂(例如参数过多),导致所选模型对已知数据预测得很好,但对未知数据预测很差。

对于上述问题,我们可以利用下面的方法进行纠正。

正则化: minfF 1ni=1n L(yi,f(xi))+λȷ(f){\min \atop{f \in F}} {\frac 1n}\displaystyle\sum_{i=1}^n L(y_i,f(x_i))+\lambda\jmath(f)

  • 正则化是模型选择的典型方法
  • 在误差函数上加一个正则项,正则项通常为参数向量的范数
  • 在训练误差和模型复杂度之间的权衡

学习曲线

  • 学习曲线(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 (将数据打乱后再划分)