码迷,mamicode.com
首页 > 其他好文 > 详细

Scikit-Learn User Guide(三)(文档翻译)

时间:2015-12-11 22:29:32      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

User Guide 第三部分 Model selection and evaluation

1 Cross-validation: evaluating estimator performance

在同一数据集上学习预测函数的参数然后进行测试是一个方法上的错误:这种模型会得到一个很好的分数,让分类器重复看到他刚刚学习过得样本,但是对于它没看过的数据却不能预测出任何有用的东西。这种情况叫做过拟合(overfitting)。为了避免这种情况发生,在(监督)机器学习实验中我们常常会将测试数据切分成为X_test,y_test。注意“实验”这个词并不是表示这仅仅是学术上的作用,因为即使在商业上机器学习的设置都是从实验性的尝试开始的。
在sklearn中你可以通过train_test_spilt(sklearn.cross_validation.train_test_spilt )帮助函数快速的将数据集切分成训练数据和测试数据。让我们记载iris数据集去训练一个线性的支持向量机模型:
>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))
我们现在可以很快的拿出40%的数据用来测试我们的分类器
>>> X_train, X_test, y_train, y_test = cross_validation.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.96...
当我们评估预测期的不同的设置(参数)时,例如说SVM分类器的C参数就需要手动设置,在测试数据集上仍然有过拟合的风险因为参数可以调整至预测期表现最佳情况。这时候,测试数据集已经“泄露”到模型中了 ,评价指标也不再报告泛华性能。为了解决这个问题,数据集的另一部分可以被拿出来作为所谓的“验证数据集”:在训练数据集上进行训练,经过这样的评估实验结果看起来很成功以后,最后的评估可以在测试数据集上进行。
然而,将可用的数据切分成3个部分,我们彻底的降低了可以用来训练模型的样本数量,而得出的结果也随机的决定于我们选择的数据集组合(train,validation)。
解决这个问题的程序叫做交叉验证(cross-validation)[CV]。CV也需要拿出测试数据集去进行最后的评估,但是验证数据集就不再需要了。有一种基本的方式叫做k-fold CV,训练数据集被切分成K个小数据集,对K个folds剩下的步骤如下:
用K-1个folds作为训练数据训练模型;
模型的结果会被剩余部分的数据验证(这里会用test set计算模型的性能比如准确性)
那么k-fold交叉验证的性能报告就是在训练中计算出来的平均值。这个方法计算起来很麻烦,但是不会浪费太多的数据(这是测试任意数据集的关键),当样本数量很小时这是在倒转推论的一个主要的优势。
 
3.1.1计算交叉验证度量
最简单的使用交叉验证的方式是在数据集合预测器上调用cross_val_score函数
下面这个历史示范了如何评估线性kernelSVM在切分iris数据集上的准确性,训练模型然后连续计算5次评分(每次都在不同的切片上)
>>> clf = svm.SVC(kernel=‘linear‘, C=1)
>>> scores = cross_validation.cross_val_score(...    clf, iris.data, iris.target, cv=5)...
>>> scores                                             
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])
分数的平均值和95%的置信区间(confidence interval)给出如下:
>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))Accuracy: 0.98 (+/- 0.03)
默认情况下每个CV迭代过程中计算分数是通过预测期的score函数,我们可以通过使用scoring参数修改默认值:
>>> from sklearn import metrics>>> scores = cross_validation.cross_val_score(clf, iris.data, iris.target,...     cv=5, scoring=‘f1_weighted‘)>>> scores                                             
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])
<待编辑>

Scikit-Learn User Guide(三)(文档翻译)

标签:

原文地址:http://www.cnblogs.com/NightSakura/p/5040330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!