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折验证】