python数据挖掘与入门实践(2.2)用sciket-learn估计器分类

接python数据挖掘与入门实践(2.1)用sciket-learn估计器分类

三、运行算法


交叉验证一般分为三类:double-fold CV 即经常所说的2折交叉;10-fold交叉LOO(leave one out)CV 即留一法交叉。
2折:将原始数据集DataSet均分为两份:一份作为训练集,即trainingSet,一份作为测试集,即testingSet,然后用训练集去做训练,用测试集去验证;之后再将训练集作为测试集,测试集作为训练集进行迭代一次,将两次所得的误差经行处理作为总体数据的预测误差。(注:这里强调一点,就是数据集一定要均分为两份,理由是:作为训练集,数据量一定要不小于测试集,所以在迭代的过程中,使得数据不出现错误情况,必须均分。)
K-折:(在这里说下K-折)是在将数据集分成K个子集,K个子集中得一个作为测试集,而其余的K-1个数据集作为训练集,最后对K个数据子集的错误计算均值,K次迭代验证是对监督学习算法的结果进行评估的方法,数据集的划分一般采用等均分或者随机划分。【来自邵峰晶等编著《数据挖掘原理与算法》中国水利水电出版社】
LOO:这个方法是K折的一种特列,就是把数据分为N份,其实每一份都是一个样本,这样迭代N次,计算最后的误差来作为预测误差。
3 度量方法:在以上的交叉验证的最后都提到了数据误差,因为没验证一次都有一次数据误差,经行K折验证,进行迭代K次,这K次误差的处理也有不同的方法,也就是度量方法,比如你取平均值ME,或者方差等都是可以的,还有平均标准误差等,都可以作为最后的验证误差。

算法描述:

1)将整个大数据集分为几个部分(fold折);

(2)对于每一部分执行以下操作:

将其中一部分作为当前训练集;

用剩余部分训练算法;

在当前测试集上测试算法;

(3)记录每次得分以及平均得分;

(4)在上述过程中,每条数据只能在测试集中出现一次,以减少(但不能完全规避))运气成分。

sciketlearn提供了几种交叉检验的方法。辅助函数cross_val_score实现了上述交叉检验的步骤。cross_val_score默认使用Stratified K Fold方法切分数据集,它大体上保证切分后得到的子数据集中类别分布相同,以避免某些子数据集出现类别分布失衡的情况。

现在导入该函数,并把完整的数据集和类别值传给它:

from sklearn.cross_validation import cross_val_score
scores=cross_val_score(estimator,X,y,scoring='accuracy')#得分
average_accuracy=np.mean(scores)*100#平均得分
print("The average accuracy is {0:.1f}%".format(average_accuracy))

The average accuracy is 82.3%
即交叉验证结果,平均正确率为82.3%。
其中scores为 [ 0.82051282  0.78632479  0.86324786]


cross_validation.cross_val_score(clf, raw_data, raw_target, cv=5, score_func=None)
参数解释:
clf:表示的是不同的分类器,可以是任何的分类器。比如支持向量机分类器。clf = svm.SVC(kernel=’linear’, C=1); 
raw_data:原始数据; 
raw_target:原始类别标号; 
cv:代表的就是不同的cross validation的方法了。引用scikit-learn上的一句话(When the cv argument is an integer, cross_val_score uses the KFold or StratifiedKFold strategies by default, the latter being used if the estimator derives from ClassifierMixin.)如果cv是一个int数字的话,那么默认使用的是KFold或者StratifiedKFold交叉,如果如果指定了类别标签则使用的是StratifiedKFold。  设置cv=5,进行5倍交叉验证
cross_val_score:这个函数的返回值就是对于每次不同的的划分raw_data时,在test_data上得到的分类的准确率。至于准确率的算法可以通过score_func参数指定,如果不指定的话,是用clf默认自带的准确率算法。


四、设置参数


几乎所有的数据挖掘算法都允许用户设置参数,这样做的好处是增强算法的泛化能力;选取好的参数值与数据集的特征息息相关。

近邻算法有多个参数,最重要的是选取多少个近邻作为预测依据。sciket_learn 管这个参数叫 n_neighbors :当这个参数过小时,分类结果易受干扰,随机性很强,反之,如果n_neighbors过大,实际近邻的影响将削弱。

如果想测试一系列的 n_neighbors 的值,比如从1到20,可以重复进行多次实验,观察不同的参数值所带来的结果之间的差异。

avg_scores=[]
all_scores=[]   #分别为平均得分和所有得分建立空表
parameter_values=list(range(1,21)) #建立从1到20的参数表
for n_neighbors in parameter_values:
 #在不同的近邻选择下创建估计器,并算出交叉验证下的不同结果得分
     estimator=KNeighborsClassifier(n_neighbors=n_neighbors)
     scores=cross_val_score(estimator,X,y,scoring='accuracy')

     avg_scores.append(np.mean(scores))
     all_scores.append(scores)
为了看起来更直观,我们可以用图表来表示 n_neighbors 的不同取值和平均分类正确率之间的关系。

从matplotlib库导入pyplot,参数为近邻数和平均正确率。

from matplotlib import pyplot as plt
plt.figure(figsize(32,20))
plt.plot(parameter_values, avg_scores, '-o', linewidth=5, markersize=24)
plt.xlabel('parameter_value')
plt.ylabel('avg_score')
得到下图:


由图可知,虽然有很多曲折变化,但整体趋势是随着近邻数的增加,正确率不断下降。

for parameter, scores in zip(parameter_values, all_scores):
     n_scores = len(scores)
     plt.plot([parameter] * n_scores, scores, '-o') 
    #x轴是近邻数,y轴是在每个近邻数上的所有得分

得到下图



由图可知,总体得分情况随近邻数变动的的变化

注:函数 zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压),看下面的例子就明白了:

a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]
zippd=zip(a,b)
zip(a,c)
zip(*zipped)

结果:
[(1, 4), (2, 5), (3, 6)]

[(1, 4), (2, 5), (3, 6)]

[(1, 2, 3), (4, 5, 6)]

具体可见http://www.cnblogs.com/frydsh/archive/2012/07/10/2585370.html

plt.plot(parameter_values, all_scores, 'bx')#散点图

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值