几种常用交叉验证(cross validation)方式的比较

本文对比了不同交叉验证方法,包括train_test_split、K-Fold Cross-validation、Stratified K-Fold Cross-validation和Leave-one-out Cross-validation。强调了交叉验证在减少偶然性、提高模型泛化能力和数据使用效率上的优势,并指出分层交叉验证能保持类别比例,更适用于类别不均衡的情况。留一法适合小样本但计算成本高。

模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何。

train_test_split

在分类问题中,我们通常通过对训练集进行train_test_split,划分成train 和test 两部分,其中train用来训练模型,test用来评估模型,模型通过fit方法从train数据集中学习,然后调用score方法在test集上进行评估,打分;从分数上我们可以知道 模型当前的训练水平如何。

"""
train_test_split 验证方法
"""
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

cancer = load_breast_cancer()
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# ml .fit方法进行学习
logreg = LogisticRegression().fit(X_train,y_train)
print("Test set score: {:.2f}".format(logreg.score(X_test, y_test)))

result:

Test set score: 0.96
train_test_split(train_data, train_target,random_state=0) 参数解答
train_data:  被划分的样本特征集 
train_target:被划分的标签 都是array形式
random_state: 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

train_test_split 这种方法只进行了一次划分,数据结果具有偶然性,如果在某次划分中,训练集里全是容易学习的数据, 测试集里全是复杂的数据,这样就会导致最终的结果不尽如意;反之,亦是如此。

K-Fold Cross-validation k折交叉验证

简言之,就是进行多次train_test_split划分;每次划分时,在不同的数据集上进行训练、测试评估,从而得出一个评价结果;如果是5折交叉验证,意思就是在原始数据集上,进行5次划分,每次划分进行一次训练、评估,最后得到5次划分后的评估结果,一般在这几次评估结果上取平均得到最后的评分。k-fold cross-validation ,其中,k一般取5或10。

"""
K-Fold 交叉验证方法
"""
from sklearn.model_selection import cross_val_score,KFold
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression

cancer = load_breast_cancer()
logreg = LogisticRegression()

# 进行交叉验证得分计算 默认是3折通过cv参数改变 CV>=2,默认评价函数scoring为'f1_macro',可以修改
kf = KFold(n_splits=5, shuffle=False, random_
### 常见的交叉验证方法及其优缺点 #### 留出法 (Hold-Out) 留出法是一种简单的划分训练集测试集的方法。数据被随机分成两部分,一部分用于模型训练,另一部分用于评估模型性能。 - **优点**: 实现简单,计算成本低。 - **缺点**: 结果可能依赖于特定的数据分割方式,可能导致较大的方差[^1]。 --- #### k交叉验证 (K-Fold Cross Validation) k交叉验证将数据分为k个子集(folds),每次选取其中一个作为测试集,其余作为训练集。重复此过程k次,最终取平均值作为模型性能指标。 - **优点**: 更充分利用数据,减少因数据划分带来的偏差;适合中小型数据集。 - **缺点**: 计算开销较大,尤其是当k值较高时。 ```python from sklearn.model_selection import KFold kf = KFold(n_splits=5, shuffle=True, random_state=42) for train_index, test_index in kf.split(X): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] ``` --- #### 留一法 (Leave-One-Out Cross Validation, LOOCV) LOOCV 是一种特殊的k交叉验证,其中k等于样本数量。即每次仅保留一个样本作为测试集,其他所有样本都用来训练模型。 - **优点**: 几乎无偏估计,因为几乎所有的数据都被用于训练。 - **缺点**: 对大数据集不适用,计算复杂度高;结果可能存在较高的方差。 --- #### 自助法 (Bootstrapping) 自助法通过对原始数据进行有放回抽样构建多个训练集,未被选中的样本则构成测试集。 - **优点**: 特别适用于小型数据集,能够有效缓解数据不足的问题。 - **缺点**: 可能会引入一定的偏差,尤其是在类别分布不平衡的情况下。 ```python import numpy as np n_samples = len(X) bootstrap_indices = np.random.choice(range(n_samples), size=n_samples, replace=True) X_bootstrap = X[bootstrap_indices] y_bootstrap = y[bootstrap_indices] test_mask = ~np.isin(np.arange(n_samples), bootstrap_indices) X_test = X[test_mask] y_test = y[test_mask] ``` --- #### 嵌套交叉验证 (Nested Cross-Validation) 嵌套交叉验证主要用于超参数调优模型选择场景。外层循环负责评估模型泛化能力,内层循环用于优化模型参数。 - **优点**: 提供了更为可靠的模型性能评估,避免了过度拟合到特定的超参数组合上[^2]。 - **缺点**: 运行时间较长,资源消耗大。 --- ### 各种方法的应用场景 | 方法 | 适用场景 | |-------------------|------------------------------------------------------------------------| | 留出法 | 数据量充足且不需要精确评估的小型项目。 | | k交叉验证 | 中小型数据集上的常规模型评估任务,特别是需要平衡偏差与方差的情况。 | | 留一法 | 小规模数据集或对模型误差敏感的任务,例如生物医学研究中个体差异显著的情形。 | | 自助法 | 当可用数据有限而无法满足传统划分需求时使用。 | | 嵌套交叉验证 | 超参数调优阶段,需同时完成模型选择与性能评估的大规模实验设计。 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值