问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

交叉验证全解析:提升模型泛化能力的关键技术

创作时间:
2025-01-22 03:31:26
作者:
@小白创作中心

交叉验证全解析:提升模型泛化能力的关键技术

在监督学习的众多算法中,不管是分类还是回归,都有很多不同的算法模型。在不同的问题中,这些算法模型的表现是不同的。如何对模型的表行进行评估和改进呢?scikit learn网站给出了这样一个模型评估和改进的流程图:

首先我们再来看看模型评估的过程,在模型训练时,我们首先可以用scikit learn的model_selection模块train_test_split函数对数据划分,分为训练集合和测试集合。对于验证模型的泛化能力,测试集合至关重要。

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

交叉验证

交叉验证是一种统计学方法,用于衡量算法表现是否稳定。在交叉验证里,数据不是简单按照某个比例分为训练集合和测试集合,而是将数据如下图做多次划分,并且基于这些划分,训练多个机器学习模型。这也就是所谓的k折交叉验证(k-fold cross validation),k通常为5或者10.

以5折交叉验证为例,数据首先被均匀地分为5份(“折”,fold),取其中一份作为测试集合,其他为训练集合,训练一个模型。之后,轮流地选择其中的一折作为测试集合,其他为训练集合,再依次训练模型。

调用方法

scikit-learn提供了非常简便的方法调用交叉验证。只需要从model_selection模块中加载cross_val_score函数就可以了。以鸢尾花数据集,logistic回归预测为例:

from sklearn.model_selection import cross_val_score 
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris = load_iris()
logreg = LogisticRegression()
scores = cross_val_score(logreg, iris.data, iris.target) 
print("Cross-validation scores: {}".format(scores))

通常cross_val_score函数默认是3折交叉验证,运行后输出

Cross-validation scores: [ 0.961 0.922 0.958]

。 可以在cross_val_score() 函数中修改默认设置,例如改成5折交叉验证:

scores = cross_val_score(logreg, iris.data, iris.target, cv=5)

正确率为

[ 1. 0.967 0.933 0.9 1. ]

。平均来说,交叉验证的正确率是我们关心的指标,可以用

scores.mean()

得到,约为0.96。 96%的正确率,模型的性能还是比较好的,但是具体看每折交叉验

优势和不足

交叉验证的主要优势包括:

  1. 充分利用数据:通过多次划分和训练,每个数据点都有机会被用作测试数据,提高了数据利用率。
  2. 稳定性:通过多次训练和测试,可以减少模型性能的波动,得到更稳定的评估结果。
  3. 避免过拟合:交叉验证能够更好地评估模型在未见过的数据上的表现,有助于检测和避免过拟合。

交叉验证的主要不足包括:

  1. 计算成本:需要训练多个模型,计算量较大。
  2. 时间成本:特别是对于大规模数据集和复杂模型,交叉验证可能需要较长时间。

注意事项

  1. 数据顺序:对于时间序列数据,简单的随机划分可能不合适,需要按照时间顺序进行划分。
  2. 数据分布:如果数据集存在类别不平衡问题,可以使用分层抽样(stratified sampling)来保持每个折叠中的类别分布。
  3. 数据泄露:在划分数据时,要确保训练集和测试集之间没有数据泄露,例如通过预处理步骤(如标准化)的正确应用。

分层k折交叉验证

分层k折交叉验证是在普通k折交叉验证的基础上,保持每个折叠中目标变量的分布与整体数据集中的分布一致。这对于处理类别不平衡问题特别有用。

交叉验证的更多变形

除了基本的k折交叉验证,还有其他一些变体:

leave-one-out交叉验证

leave-one-out交叉验证是一种特殊的交叉验证方法,其中k等于样本数量。每次只留出一个样本作为测试集,其余所有样本作为训练集。这种方法的优点是充分利用了所有数据,但计算成本非常高。

Shuffle-split交叉验证

Shuffle-split交叉验证通过随机划分训练集和测试集多次,而不是固定数量的折叠。这种方法更灵活,可以指定每次划分的训练集和测试集的比例。

组间的交叉验证

在某些情况下,数据可能具有“组”结构,例如来自不同用户的观测。在这种情况下,需要确保训练集和测试集中的观测来自不同的组,以避免数据泄露。

总结

交叉验证是机器学习中重要的模型评估方法,能够提供更稳定、可靠的模型性能评估。通过合理选择交叉验证策略,可以更好地评估和改进模型,避免过拟合,提高模型的泛化能力。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号