sklearn几种交叉验证的比较

1 sklearn.model_selection.train_test_split()

将数据集划分为训练集train和测试集test,再调用score方法在test数据集中评估,默认train : test = 3:1。缺点是数据集只划分一次,具有偶然性.
链接: 文档.

示例:
from sklearn.model_selection import train_test_split		
from sklearn.linear_model import LogisticRegression as lr

x_train,x_test,y_train,y_test = train_test_split(data[:,1::],data[:,0],random_state=0)
lr_fit = lr().fit(x_train,y_train)
print("Test data score:{:.2f}".format(lr_fit.score(x_test,y_test)))

输出:
Test score:0.901

2 sklearn.model_selection.KFold()

简单的k折交叉验证:随机划分成k个数据子集。 例如,5折交叉验证,在原始数据集上,划分成5个数据子集,每次选择四个子集训练、另一份子集评估,进行5轮,最后得到5次的评估结果,一般这5次评估结果的加权平均是模型最终的评估结果。其中,k一般取5或10。

优点:相对train_test_split,此种方式划分为多个子集,降低数据集一次性划分偶然性;比如cv =5时,划分为5份子集,5轮训练总共划分了10份数据集(每一轮训练时,train:test = 4:1,共2份),提高数据利用效率和模型泛化能力。

缺点:这种简单的交叉验证仍不能避免数据集划分的偏态性;比如,原数据集label有2类a/b,进行3折交叉验证时,其中一轮训练时train和test恰巧分别只包含一种类别,那么训练模型时仅学习到其中一种a类别,完全学习不到test中的另一种b类,那么模型的泛化效果极差。

链接: 简单交叉验证文档

示例:
from sklearn.model_selection import KFold,cross_val_score

lr = LogisticRegression()
kf = KFold(n_splits=3, shuffle=False, random_state=0)
scores = cross_val_score(lr, data[:,1::], data[:,0], cv=kf)

print("cross validation scores:{}".format(scores))
print("mean cross validation score:{:2f}".format(scores.mean()))

输出:
cross validation scores:[0.94  0.92  0.93]
mean cross validation score:0.93
3 sklearn.model_selection.StratifiedKFold()

k折分层交叉验证:分层抽样的思想,每一折都和原数据中各类别的比例分布保持一致; 比如,原数据集label有三类a/b/c,比例分别是1:1:2,进行3折交叉验证时,每一折数据子集的类别比例均是1:1:2。
链接:k折交叉验证文档

示例:
from sklearn.model_selection import StratifiedKFold,cross_val_score

lr = LogisticRegression()
s_kf = StratifiedKFold(n_splits=3, shuffle=False, random_state=0)
scores = cross_val_score(lr, data[:,1::], data[:,0], cv=s_kf)

print("straitified cross validation scores:{}".format(scores))
print("mean score of straitified cross validation:{:.2f}".format(scores.mean()))

输出:
straitified cross validation scores:[0.971 0.96 0.95]
Mean score of straitified cross validation:0.96
附:4 sklearn.model_selection.cross_val_score使用事项
from sklearn import datasets, linear_model
from sklearn.model_selection import cross_val_score,KFold,StratifiedKFold

# 原始参数
cross_val_score(lasso,  X,  y,  cv=3)
输出:array([0.33150734, 0.08022311, 0.03531764])

# kfold
kf = KFold(n_splits=3,  shuffle=False,  random_state=0)
cross_val_score(lasso,  X,  y,  cv=kf)
输出:array([0.33150734, 0.08022311, 0.03531764])

# stratifiedKFold
s_kf = StratifiedKFold(n_splits=3,  shuffle=False,  random_state=0)
cross_val_score(lasso,  X,  y,  cv=s_kf)
输出:array([0.25045721, 0.35905339, 0.30717018])

4.1 stratifiedKFold的训练效果好于KFold
4.2 原始参数和kfold训练效果得分一样,是巧合吗? 请看官方文档解释: cross_val_score.
【可见,当cv参数是数值或none,且学习器是分类器,y变量是二或多分类时,交叉验证方法才是K折分层验证,其他情况默认是简单的K折验证】
当cv参数是数值或none,且学习器是分类器,y变量是二或多分类时,交叉验证方法才是K折分层验证,其他情况默认是简单的K折验证

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值