2018-02-05 10:25:43 ChenVast 阅读数 6707
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39706 人正在学习 去看看 唐宇迪

holdout交叉验证K折交叉验证可以得到模型的泛化误差的可靠估计(模型在新数据集是的性能表现)。


holdout交叉验证

holdout交叉验证是机器学习模型泛化性能的一个经典且常用的方法

holdout交叉验证能将最初的数据集分为训练集和测试集

 

模型选择:对模型的的不同参数设置进行调优和比较的过程,也就是针对给定分类问题,调整参数以寻找最优值(超参)的过程。

 

使用holdout进行模型选择更好的方法:将数据划分为三个部分,训练集,测试集,验证集。

训练集:用于不同模型的拟合,模型在验证集上的性能表现作为模型选择的标准

 

不使用测试集用于模型训练以及模型选择的优势:

       评估模型应用于新数据上能够获得较小偏差



holdout过程:



holdout缺点:模型性能评估对训练集划分为训练以及验证子集的方法是敏感的,评价的结果随样本的不同而发生变化



K折交叉验证

K折交叉验证将k个训练子集重复holdout方法k次。

K折交叉验证不重复的随机将训练集划分为k个,k-1个用于训练,剩余一个用于测试,重复该过程k次,得到k个模型对模型性能的评价。

 

基于评价结果可以计算平均性能。

与holdput相比,这样得到的结果对数据划分方法敏感度相对较低

 

一般情况将K折交叉验证用于模型调优找到使得模型泛化性能最优的超参值。,找到后,在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。

 

K折交叉验证使用了无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会



K折交叉验证图:




如果训练数据集相对较小,则增大k值。

增大k值,在每次迭代过程中将会有更多的数据用于模型训练,能够得到最小偏差,同时算法时间延长。且训练块间高度相似,导致评价结果方差较高。

 

如果训练集相对较大,则减小k值。

减小k值,降低模型在不同的数据块上进行重复拟合的性能评估的计算成本,在平均性能的基础上获得模型的准确评估。



K折交叉验证的一个特例:

 留一(LOO)交叉验证法:将数据子集划分的数量等于样本数(k=n),每次只有一个样本用于测试,数据集非常小时,建议用此方法。

 

K折交叉验证改进成的 分层K折交叉验证:

       获得偏差和方差都低的评估结果,特别是类别比例相差较大时。

 

实现K折交叉验证:

使用数据集中的类标y_train初始化sklearn.cross_validation模块下的StratifiedKFold迭代器,通过n_folds参数设置块的数量。

使用kfold在k个块中迭代时,使用train中返回的索引去拟合流水线,通过pipe_lr流水线保证样本都得到适当的缩放。

使用test索引计算模型的准确率,存在score中。



# 使用k-fold交叉验证来评估模型性能。
import numpy as np
from sklearn.cross_validation import StratifiedKFold

kfold = StratifiedKFold(y=y_train, 
                        n_folds=10,
                        random_state=1)

scores = []
for k, (train, test) in enumerate(kfold):
    pipe_lr.fit(X_train[train], y_train[train])
    score = pipe_lr.score(X_train[test], y_train[test])
    scores.append(score)
    print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1, np.bincount(y_train[train]), score))
    
print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))



使用SKlearn实现分层K折交叉验证:


from sklearn.cross_validation import cross_val_score

scores = cross_val_score(estimator=pipe_lr, 
                         X=X_train, 
                         y=y_train, 
                         cv=10,
                         n_jobs=1)
print('CV accuracy scores: %s' % scores)
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))



cross_val_score方法特点:将不同分块的性能评估分布到多个CPU上进行处理。

n_jobs:CPU个数,-1为选择全部CPU







2019-01-30 16:30:56 XiaoYi_Eric 阅读数 504
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39706 人正在学习 去看看 唐宇迪

1.交叉验证简介

交叉验证(Cross Validation) 是在机器学习建立模型和验证模型参数时常用的方法。顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。用训练集来训练模型,测试集来评估模型的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的样本,在下次可能成为测试集中的样本,也就是所谓的交叉

2.为什么用交叉验证?

  • 交叉验证用在数据量不是很充足的情况(比如数据量小于一万条),能够从有限的数据中获取尽可能多的有效信息。
  • 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,能够一定程度上减小过拟合。

3.交叉验证方法

3.1 留出法交叉验证

留出法 (Hold-Out Cross Validation) 是一种简单交叉验证,即针对原始数据集,通常分为训练集、测试集。训练集用于训练模型、测试集对于模型来说是未知数据,用于评估模型的泛化能力。

比如我们随机的将样本数据分为两部分(70%的训练集,30%的测试集),然后用训练集来训练模型,测试集上验证模型及参数,最后选择损失函数评估最优的模型和参数。

from sklearn import datasets
from sklearn import model_selection

#引入sklearn库中手写数字的数据集
digits = datasets.load_digits()

#留出法
X_train, X_test, y_train, y_test = model_selection.train_test_split(digits.data, digits.target, test_size = 0.3, shuffle = True)

3.2 k折交叉验证

k折交叉验证 (k-fold Cross Validation) 过程如下所示:

  1. 不重复抽样将原始数据随机分成k份。

  2. 每次挑选其中1份作为测试集,剩余k-1份作为训练集用于训练模型。

  3. 重复第2步k次,在每个训练集上训练后得到一个模型。用这个模型在相应的测试集上测试,计算并保存模型的评估指标。

  4. 计算k组测试结果的平均值作为模型准确度的估计,并作为当前k折交叉验证下模型的性能指标。
    01

k一般取10,数据量大的时候,k可以设置的小一些。数据量小的时候,k可以设置的大一些,这样训练集占整体数据的比例就比较大,不过同时训练的模型个数也就相应增加。

from sklearn import datasets
from sklearn import model_selection

#引入sklearn库中手写数字的数据集
digits = datasets.load_digits()

#K折交叉验证
#设置K为5
kf = model_selection.KFold(n_splits=5)
#使用5折交叉验验证划分数据集,返回一个生成器对象(即索引)
digits_gen = kf.split(digits.data)
for train_idx, test_idx in digits_gen:
        X_train = digits.data[train_idx] #训练集
        X_test = digits.data[test_idx] #测试集
        y_train = digits.target[train_idx] #训练集标签
        y_test = digits.target[test_idx] #测试及标签

3.3 留一法交叉验证

留一法交叉验证 (Leave-one-out Cross Validation) 是k折交叉验证的特例,此时的k等于样本数N。因此,对于N个样本,每次选择N-1个样本来训练数据,留一个样本来验证模型的好坏。此方法主要适用于数据量非常小的情况,比如N小于50的时候,推荐采用留一交叉验证。

from sklearn import datasets
from sklearn import model_selection

#引入sklearn库中手写数字的数据集
digits = datasets.load_digits()

#留一法交叉验证
loo = model_selection.LeaveOneOut()
digits_gen = loo.split(digits.data)
for train_idx, test_idx in digits_gen:
        X_train = digits.data[train_idx]
        X_test = digits.data[test_idx]
        y_train = digits.target[train_idx]
        y_test = digits.target[test_idx]

3.4 交叉验证方法选择

那这三种情况,到底应该选择哪一种方法呢?其实很简单,如果我们只是对数据做一个初步的模型建立,不是要做深入分析的话,简单交叉验证就可以。否则就用k折交叉验证。在样本量少的时候,使用留一交叉验证。

4.推广

更多内容请关注公众号谓之小一,若有疑问可在公众号后台提问,随时回答,欢迎关注,内容转载请注明出处。
02

2019-09-05 22:23:51 weixin_44791964 阅读数 724
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39706 人正在学习 去看看 唐宇迪

机器学习好伙伴之scikit-learn的使用——K折交叉验证

在进行数学建模的时候就听过k折交叉验证,要是我当时像现在一样强就好了!
在这里插入图片描述

什么是K折交叉验证

K折交叉验证首先要将整个数据集分成K份。
1、取前面K-1份用于训练,最后一份用于测试,并取得测试结果。
2、取前面K-2份和最后一份用于训练,取第K-1份用于测试,并取得测试结果。
3、以此类推,将数据集的每一份均用于测试过一次。
4、取所有测试结果取平均。
其验证结果相比单次实验更加精准。
实现示意图如下:
在这里插入图片描述

sklearn中K折交叉验证的实现

在进行K折交叉验证之前,首先要导入K折交叉验证的模块。

from sklearn.model_selection import cross_val_score 

K折交叉验证的重要函数是:

cross_val_score(
	estimator, 
	X, y=None, 
	scoring=None, 
	cv=None, 
	n_jobs=1, 
	verbose=0, 
	fit_params=None, 
	pre_dispatch=2*n_jobs’
)

其常用参数如下:
1、estimator:用于预测的模型。
2、X:预测的特征数据
3、y:预测结果
4、scoring:调用的方法
可进行的scoring方式具体可以查阅
https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter
在这里插入图片描述
5、cv:交叉验证生成器或可迭代的次数
使用方式如下:

scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')

代表使用knn模型,输入特征为X,输出label为y,进行5折交叉验证,通过精确度的方式计分。

应用示例

代码取自莫烦python教学网站。

from sklearn.datasets import load_iris 
from sklearn.model_selection import train_test_split 
# K折交叉验证模块
from sklearn.model_selection import cross_val_score 
# 导入k聚类算法
from sklearn.neighbors import KNeighborsClassifier 

# 加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target

# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=4)

# 建立Knn模型
knn = KNeighborsClassifier()

# 使用K折交叉验证模块
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')

# 将5次的预测准确率打印出
print(scores)

#将5次的预测准确平均率打印出
print(scores.mean())

实验结果为:

[0.96666667 1.         0.93333333 0.96666667 1.        ]
0.9733333333333334
2019-12-16 13:23:02 xiao_lxl 阅读数 14
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39706 人正在学习 去看看 唐宇迪

K折交叉验证

通过测试、验证,进而评估你的算法是否能够做你想做的。

sklearn中的K折交叉验证

在这里插入图片描述
可通过简单的方式随机化 Sklearn k 折 CV 中的事件,就是将 shuffle 标志设置为 true。

之后,代码将从如下所示:

cv = KFold( len(authors), 2 )

可变为如下所示:

cv = KFold( len(authors), 2, shuffle=True )

shuffle=True 可避免所有某一特定类型的事件都属于训练集,而另一特定类型的事件则属于测试集,在这种情况下,针对一种类型事件的训练不会帮助我们成功地对另一类型的事件进行分类

from sklearn.cross_validation import KFold
t0= time()
cv = KFold( len(authors), 2, shuffle=True ) #将 shuffle 标志设置为 true来随机化 Sklearn K-fold cross validation 中的事件
for train_indices,test_indices in kf:
    # make training and testing datasets
    features_train = [word_data[ii] for ii in train_indices] #利用索引进入特征和标签
    features_test = [word_data[ii] for ii in test_indices]
    authors_train = [authors[ii] for ii in train_indices]
    authors_test = [authors[ii] for ii in train_indices]

    # TFIDF and feature selection
    vectorizer = TfidfVectorizer(sublinear_tf = True,max_df=0.5,
                                 stop_words = 'english')
    feature_train_transformed = vectorizer.fit_transform(features_train)
    feature_test_transformed = vectorizer.transform(features_test)
    selector = SelectPercentile(f_classif,percentile = 10)
    selector.fit(features_train_transformed,authors_train)
    features_train_transformed = selector.transform(features_train_transformed).toarray()
    features_test_transformed = selector.transform(features_test_transformed).toarray()

clf = GaussianNB()
clf.fit(features_train_transformed,authors_train)
print "training time:" ,round(time() - t0,3),'s'
t0=time()
pred = clf.predict(features_test_transfomed)
print "predicting time",round(time() - t0,3),'s'
acc = accuracy_score(pred,authors_test)
print "accuracy:", round(acc,3)

sklearn中的GridSearchCV

GridSearchCV 用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。它的好处是,只需增加几行代码,就能遍历多种组合。

下面是来自 sklearn 文档 的一个示例:

parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svr = svm.SVC()
clf = grid_search.GridSearchCV(svr, parameters)
clf.fit(iris.data, iris.target)

让我们逐行进行说明。

parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}

参数字典以及他们可取的值。在这种情况下,他们在尝试找到 kernel(可能的选择为 ‘linear’ 和 ‘rbf’ )和 C(可能的选择为1和10)的最佳组合。

这时,会自动生成一个不同(kernel、C)参数值组成的“网格”:

('rbf', 1)	('rbf', 10)
('linear', 1)	('linear', 10)

各组合均用于训练 SVM,并使用交叉验证对表现进行评估。

svr = svm.SVC()

这与创建分类器有点类似,就如我们从第一节课一直在做的一样。但是请注意,“clf” 到下一行才会生成—这儿仅仅是在说采用哪种算法。另一种思考方法是,“分类器”在这种情况下不仅仅是一个算法,而是算法加参数值。请注意,这里不需对 kernel 或 C 做各种尝试;下一行才处理这个问题。

clf = grid_search.GridSearchCV(svr, parameters)

这是第一个不可思议之处,分类器创建好了。 我们传达算法 (svr) 和参数 (parameters) 字典来尝试,它生成一个网格的参数组合进行尝试。

clf.fit(iris.data, iris.target)

第二个不可思议之处。 拟合函数现在尝试了所有的参数组合,并返回一个合适的分类器,自动调整至最佳参数组合。现在您便可通过 clf.best_params_ 来获得参数值。

SVM 的哪些参数使用特征脸示例中的 GridSearchCV 进行自动调谐?
C和gamma

你的首个(过拟合)POI 标识符的准确度是多少?

将先开始构建想象得到的最简单(未经过验证的)POI 识别符。 本节课的初始代码 (validation/validate_poi.py) 相当直白——它的作用就是读入数据,并将数据格式化为标签和特征的列表。 创建决策树分类器(仅使用默认参数),在所有数据(你将在下一部分中修复这个问题!)上训练它,并打印出准确率。 这是一颗过拟合树,不要相信这个数字!尽管如此,准确率是多少?


import pickle
import sys
sys.path.append("../tools/")
from feature_format import featureFormat, targetFeatureSplit

sort_keys = '../tools/python2_lesson13_keys.pkl'
data_dict = pickle.load(open("../final_project/final_project_dataset.pkl", "r") )

### first element is our labels, any added elements are predictor
### features. Keep this the same for the mini-project, but you'll
### have a different feature list when you do the final project.
features_list = ["poi", "salary"]

data = featureFormat(data_dict, features_list)
labels, features = targetFeatureSplit(data)

from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf.fit(features, labels)
pred_dt = clf.predict(features)

from sklearn.metrics import accuracy_score
acc_dt = accuracy_score(pred_dt, labels)
print acc_dt  # 0.989473684211

适当部署的测试范围的准确度

现在,你将添加训练和测试,以便获得一个可靠的准确率数字。 使用 sklearn.cross_validation 中的 train_test_split 验证; 将 30% 的数据用于测试,并设置 random_state 参数为 42(random_state 控制哪些点进入训练集,哪些点用于测试;将其设置为 42 意味着我们确切地知道哪些事件在哪个集中; 并且可以检查你得到的结果)。更新后的准确率是多少?

适当部署的测试范围的准确度是多少?



import pickle
import sys
sys.path.append("../tools/")
from feature_format import featureFormat, targetFeatureSplit

sort_keys = '../tools/python2_lesson13_keys.pkl'
data_dict = pickle.load(open("../final_project/final_project_dataset.pkl", "r") )

### first element is our labels, any added elements are predictor
### features. Keep this the same for the mini-project, but you'll
### have a different feature list when you do the final project.
features_list = ["poi", "salary"]

data = featureFormat(data_dict, features_list)
labels, features = targetFeatureSplit(data)
from sklearn i
mport tree
from sklearn.model_selection import train_test_split

features_train, features_test, labels_train, labels_test = \
train_test_split(features, labels, test_size = 0.3, random_state = 42)
clf = tree.DecisionTreeClassifier()
clf.fit(features_train, labels_train)
pred_dt = clf.predict(features_test)

from sklearn.metrics import accuracy_score
acc_dt = accuracy_score(pred_dt, labels_test)
print acc_dt  # 0.724137931034

0.724137931034

在上次测验中99%的准确率之后,测试数据让我们回到了现实中

2015-10-13 22:20:44 u012526120 阅读数 4508
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39706 人正在学习 去看看 唐宇迪

1. 验证集

在使用一个机器学习模型时,通常有一些参数需要设置,比如:

  • KNN中的k,距离函数;
  • SVM算法中的(C, gamma);
  • GBDT中的迭代次数,树的深度;

这些参数称为超参数(hyperparameters),好的参数可以极大提高算法的预测性能。选择合适的模型参数过程称为模型选择(model selection)。那么如何选择这些参数呢?在模型学习过程中,通常做法是将数据分为训练集和测试集,其中训练集用来训练模型,测试集用来预测模型在未知数据上的预测性能。需要注意的是,绝对不能用测试集来调整这些超参数

用测试集来调整参数的危害之一是,模型可能在测试集上取得较好地预测性能,然而当我们实际部署模型时,却发现性能很差。实际上,模型对测试集产生了过拟合。换种思路看这个问题的话,若我们使用测试集调整参数,实际上我们已经将测试集当做训练集来使用,这样模型在看的见的数据上取得不错的性能,当部署模型到实际应用时,模型对于没见过的数据预测性能很差,也就是说模型泛化能力很弱。

正确的做法是在整个过程中,测试集只能被使用一次,而且是在最后一步。那么怎么样调整这些参数呢,可以将训练集分为两部分,其中数据多的部分用来训练模型,数据少的部分,用来调整参数,这部分也称为验证集。

2. 交叉验证

当我们用来训练模型的数据规模(包括训练集和验证集)不大时,将其中部分数据划分为验证集用来调整参数有些浪费,增加了模型过拟合的可能性。这时可以采用K重交叉验证的办法。

K重交叉验证相比把数据集分为(test, validation, train sets)的做法可以充分利用所有的数据,另一方面,也可以避免过拟合。做法为:将训练集分为K份,选择其中K-1份作为train set,另一份作为validation set,训练K次,同时也测试K次,将K次的平均作为该参数下的validation结果。然后对于不同的参数,重复这样的训练,选择准确率最高的参数作为最后的参数。需要注意的是,在训练过程中不接触test set。5重交叉验证的一个例子如下图所示:
这里写图片描述

在python中使用K重交叉验证的一个示例代码为:

def calc_params(X, y, clf, param_values, param_name, K):
    # initialize training and testing scores with zeros
    train_scores = np.zeros(len(param_values))
    test_scores = np.zeros(len(param_values))

    # iterate over the different parameter values
    for i, param_value in enumerate(param_values):
        print param_name, ' = ', param_value

        # set classifier parameters
        clf.set_params(**{param_name:param_value})

        # initialize the K scores obtained for each fold
        k_train_scores = np.zeros(K)
        k_test_scores = np.zeros(K)

        # create KFold cross validation
        cv = KFold(n_samples, K, shuffle=True, random_state=0)

        # iterate over the K folds
        for j, (train, test) in enumerate(cv):
            # fit the classifier in the corresponding fold
            # and obtain the corresponding accuracy scores on train and test sets
            clf.fit([X[k] for k in train], y[train])
            k_train_scores[j] = clf.score([X[k] for k in train], y[train])
            k_test_scores[j] = clf.score([X[k] for k in test], y[test])

        # store the mean of the K fold scores
        train_scores[i] = np.mean(k_train_scores)
        test_scores[i] = np.mean(k_test_scores)

    # plot the training and testing scores in a log scale
    plt.semilogx(param_values, train_scores, alpha=0.4, lw=2, c='b')
    plt.semilogx(param_values, test_scores, alpha=0.4, lw=2, c='g')

    plt.xlabel(param_name + " values")
    plt.ylabel("Mean cross validation accuracy")

    # return the training and testing scores on each parameter value
    return train_scores, test_scores

采用3重交叉验证的函数调用代码:

alphas = np.logspace(-7, 0, 8)
train_scores, test_scores = calc_params(X, y, clf, alphas, 'nb__alpha', 3)
print 'training scores: ', train_scores
print 'testing scores: ', test_scores

运行结果:

nb__alpha  =  1e-07
nb__alpha  =  1e-06
nb__alpha  =  1e-05
nb__alpha  =  0.0001
nb__alpha  =  0.001
nb__alpha  =  0.01
nb__alpha  =  0.1
nb__alpha  =  1.0

training scores:  [ 1. 1. 1. 1.  1.  1.  0.99683333  0.97416667]
testing scores:  [ 0.7713  0.7766  0.7823  0.7943  0.8033 0.814  0.8073  0.7453]

可以看出,当参数为0.01时,取得最好的测试结果。

3. 交叉验证选择特征

交叉验证除了选择模型参数外,还可以用于特征的选择。对于分类或者回归算法来说,并不是说特征的数量越多越好,一般需要对提取到的特征进行选择(feature selection)。首先,需要对特征的预测能力进行排序,然后通过交叉验证,选择最优比例的特征组合,来作为最终使用的特征。

下面给出一个决策树算法通过交叉验证选择最优特征比例的python代码:

from sklearn import cross_validation

percentiles = range(1, 100, 5)
results = []
for i in range(1, 100, 5):
    fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=i)
    X_train_fs = fs.fit_transform(X_train, y_train)
    scores = cross_validation.cross_val_score(dt, X_train_fs, y_train, cv=5)
    #print i,scores.mean()
    results = np.append(results, scores.mean())

optimal_percentil = np.where(results == results.max())[0]
print "Optimal number of features:{0}".format(percentiles[optimal_percentil]), "\n"

运行结果为:

Optimal number of features:6 
Mean scores: [ 0.83332303  0.87804576  0.87195424  0.86994434  0.87399505  0.86891363
  0.86992373  0.86991342  0.87195424  0.86991342  0.87194393  0.87398475
  0.86991342  0.87093383  0.86992373  0.86074005  0.86583179  0.86790353
  0.86891363  0.8648423 ]

可以看出,最优的特征比例是6%,剩余的大部分特征是冗余的。

k折交叉验证

阅读数 7076

k折交叉验证

博文 来自: Light_blue_love
没有更多推荐了,返回首页