交叉验证(cross validation)原理和方法说明以及scikit-learn代码实现。

交叉验证(cross validation)

1.定义
用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(data set)进行分组,一部分做为训练集(training set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标。

2.作用
针对在训练集上训练得到的模型表现良好,但在测试集的预测结果不理想,即模型出现过拟合(overfitting),偏差(bias)低而方差(variance)高,泛化能力差的情况。也就是说交叉验证用于评估模型的预测性能。此外,也可以用于从有限数据中获取尽可能多的有效信息。

3.方法:

【1】留出法(holdout cross validation)
将原始数据集分为三部分:训练集、验证集和测试集。训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。

优点:操作简单
缺点:样本数比例,模型对数据划分敏感,分成三部分使得训练数据变少。

【2】k折交叉验证(k-fold cross validation)
将数据集无替换的随机分为k份,k-1份用来训练模型,剩下一份用来模型性能评估。重复k次,得到k个模型和性能评估结果。得到k个性能评估后,取平均求出最终性能评估。即:
第一步:不重复抽样将原始数据随机分为k份。
第二步:每一次挑选其中 1 份作为测试集,剩余k-1份作为训练集用于模型训练。
第三步:重复第二步k次,每个子集都有一次作为测试集,其余子集作为训练集。在每个训练集上训练后得到一个模型,用这个模型在相应测试集上测试,计算并保存模型的评估指标。
第四步:计算k组测试结果的平均值作为模型精度的估计,并作为当前k折交叉验证下模型的性能指标。

优点:分组后取平均减少方差,使得模型对数据划分不敏感。
缺点:k取值需要尝试。

【3】留一法(Leave one out cross validation)
当k折交叉验证法的k=m,m为样本总数时,称为留一法,即每次的测试集都只有一个样本,要进行m次训练和预测。

优点:适合数据缺乏时使用
缺点:计算繁琐,训练复杂度增加。

4.Scikit-learn代码实现

【1】留出法

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
                                                   test_size=0.4,random_state=0)
print(iris.data.shape, iris.target.shape)
print(X_train.shape,y_train.shape)
print(X_test.shape,y_test.shape)
clf = svm.SVC(kernel='linear',C=1).fit(X_train, y_train)
score = clf.score(X_test,y_test)
print('Accuracy:',score)                                                                                                 

输出结果:

((150, 4), (150,))
((90, 4), (90,))
((60, 4), (60,))
Accuracy: 0.9666666666666667

【2】k折交叉验证

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.model_selection import cross_val_score
iris = datasets.load_iris()
scores = cross_val_score(clf, iris.data, iris.target, cv=10)
print('10折结果为:',scores)
print("Accuracy: " ,scores.mean())

输出结果:

10折结果为: [1.         0.93333333 1.         1.         0.86666667 1.
 0.93333333 1.         1.         1.        ]
Accuracy:  0.9733333333333334

参考文章:
1.https://blog.csdn.net/aliceyangxi1987/article/details/73532651
2.https://www.jianshu.com/p/cdf6df99b44b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值