【译】交叉验证(Crossd_validation)

按自己的理解对scikit-learn中的模型选择中的交叉验证部分,进行了简单的翻译,供大家参考、学习。

Cross validation:评估算法的表现

在同一个数据集上学习算法的参数和进行预测是方法性的错误。很有可能会导致Overfitting。避免过拟合的常用方法是将一部分数据作为测试集,用以对算法进行测试。

在scikit-learn中,可以用train_test_split快速地将数据集分为训练集和测试集。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()
iris.data.shape, iris.target.shape
((150, 4), (150,))

利用train_test_split将数据分出40%作为测试集

X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size = 0.4, random_state = 0)
X_train.shape, y_train.shape
((90, 4), (90,))
X_test.shape, y_test.shape
((60, 4), (60,))
clf = svm.SVC(kernel = 'linear', C = 1).fit(X_train, y_train)
clf.score(X_test, y_test)
0.96666666666666667

当评估不同的参数设置,对算法表现的影响时,仍然存在则过拟合的风险。因为在调整参数,优化测试集的算法表现时,测试集的信息已经泄漏进模型中了。

为了解决这个问题,仍需要一部分数据作为验证集(Validation set)。这样,用训练集(Train set)的数据训练模型;用验证集对模型参数调剂,如上述程序中的C值;最后,算法的评价在测试集(Test set)上完成。

这样的做法会带来两个新的问题,一是,将数据分成了三分,降低了训练模型的数据量;二是,最后算法的表现会较依赖三个数据集的划分。

可以采用交叉验证集(Cross validation set)来解决上述两个问题。测试集仍然划分出来,用以最后对算法进行评价。但单独的验证集不再需要了。将训练集划分为k个小的数据集,称之为k-fold CV。对每个fold进行下列过程:
* 1 用其他k-1 folds作为训练数据,训练模型
* 2 模型的结果用剩下的fold评价

模型的性能用上述循环中的k-fold交叉验证集的平均值表现。这种做法增加了计算量,但提高了数据的利用效率。

计算交叉验证的度量指标(metrics)

最为简单的方法是调用cross_val_score

from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel = 'linear', C = 1)
scores = cross_val_score(clf, iris.data, iris.target, cv = 5)
scores
array([ 0.96666667,  1.        ,  0.96666667,  0.96666667,  1.        ])

默认给出的是estimator的score值,可以对其进行修改:

from sklearn import metrics
scores = cross_val_score(clf, iris.data, iris.target, cv = 5, scoring = 'f1_macro')
scores
array([ 0.96658312,  1.        ,  0.96658312,  0.96658312,  1.        ])

但cv的取值是整型时,cross_val_score默认采用KFoldStratifiedKFold str的策略。

也可以同通过传入交叉验证迭代器,以采用其他交叉验证的策略。

from sklearn.model_selection import ShuffleSplit
n_samples = iris.data.shape[0]
cv = ShuffleSplit(n_splits=3, test_size=
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值