当前位置: 代码迷 >> 综合 >> 几种常用交叉验证(cross validation)方式的比较
  详细解决方案

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

热度:51   发布时间:2023-11-17 01:05:27.0

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

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 LogisticRegressioncancer = 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 LogisticRegressioncancer = load_breast_cancer()
logreg = LogisticRegression()# 进行交叉验证得分计算 默认是3折通过cv参数改变 CV>=2,默认评价函数scoring为'f1_macro',可以修改
kf = KFold(n_splits=5, shuffle=False, random_state=0)
scores = cross_val_score(logreg, cancer.data, cancer.target, cv=kf)print("Cross validation scores: {}".format(scores))
print("Mean Cross validation scores: {}".format(scores.mean()))

result:

Cross validation scores: [0.9122807  0.94736842 0.97368421 0.97368421 0.95575221]
Mean Cross validation scores: 0.95255395125
交叉验证的优点:

原始采用的train_test_split方法,数据划分具有偶然性;交叉验证通过多次划分,大大降低了这种由一次随机划分带来的偶然性,同时通过多次划分,多次训练,模型也能遇到各种各样的数据,从而提高其泛化能力;
与原始的train_test_split相比,对数据的使用效率更高。train_test_split,默认训练集、测试集比例为3:1,而对交叉验证来说,如果是5折交叉验证,训练集比测试集为4:1;10折交叉验证训练集比测试集为9:1。数据量越大,模型准确率越高!

缺点:

这种简答的交叉验证方式,从上面的图片可以看出来,每次划分时对数据进行均分,设想一下,会不会存在一种情况:数据集有5类,抽取出来的也正好是按照类别划分的5类,也就是说第一折全是0类,第二折全是1类,等等这样的结果就会导致,模型训练时,没有学习到测试集中数据的特点,从而导致模型得分很低**,甚至为0,!为了避免这种情况,又出现了其他的各种交叉验证方式。

Stratified K-Fold Cross-validation 分层k折交叉验证

解决简单交叉验证带来的问题,所以进行分层交叉验证,保证每次划分中包含类别的比例数和原数据相同。
如原数据有三类,比例为1:2:1,那么划分的k折中,每一折中的数据类别保持着1:2:1的比例,这样的验证结果更加可信。 实际上就是改变了交叉验证的划分函数。

from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegressioniris = load_iris()
print("iris label :\n{}".format(iris.target))
logreg = LogisticRegression()
strKFold = StratifiedKFold(n_splits=3, shuffle=False, random_state=0)
scores = cross_val_score(logreg, iris.data, iris.target, cv=strKFold)
print("Straitified cross validation scores:{}".format(scores))
print("Mean score of straitified cross validation:{:.2f}".format(scores.mean()))

result:

Straitified cross validation scores:[0.96078431 0.92156863 0.95833333]
Mean score of straitified cross validation:0.95

Leave-one-out Cross-validation 留一法

留一法是一种特殊的交叉验证方式,顾名思义就是每次留下一个样本进行验证,如果样本容量是n 那么k折中的k等于n,进行n折交叉验证,适合小样本数据,耗时,相当于n折交叉验证,改变交叉验证数据划分函数即可。

from sklearn.datasets import load_iris
from sklearn.model_selection import LeaveOneOut, cross_val_score
from sklearn.linear_model import LogisticRegressioniris = load_iris()
print("iris label :\n{}".format(iris.target))
logreg = LogisticRegression()
loout = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv=loout)
print("Straitified cross validation scores:{}".format(scores))
print("Mean score of straitified cross validation:{:.2f}".format(scores.mean()))

result:

Straitified cross validation scores:[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 0. 1.1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.1. 1. 1. 1. 1. 1.]
Mean score of leave-one-out validation:0.95
  相关解决方案