我试图理解为什么我会遇到以下情况 - 我正在使用虹膜数据,并且正在使用 k - 最近邻分类器进行交叉验证,以选择最佳 k
from sklearn.neighbors import KNeighborsClassifier
from sklearn import grid_search
from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(
X, Y, test_size=0.33, random_state=42)
parameters = {'n_neighbors': range(1,21)}
knn = sklearn.neighbors.KNeighborsClassifier()
clf = grid_search.GridSearchCV(knn, parameters,cv=10)
clf.fit(X_train, Y_train)
clf
对象有结果。
print clf.grid_scores_
[mean:0.94000,std:0.08483,params:{' n_neighbors':1},意思是:0.93000,std:0.08251,params:{' n_neighbors':2},平均值:0.94000,标准:0.08456,参数:{' n_neighbors':3},平均值:0.95000,标准:0.08101,参数:{' n_neighbors':4},平均值:0.95000, std:0.08562,params:{' n_neighbors':5},意思是:0.93000,标准:0.08284,params:{' n_neighbors':6},意思是:0.95000,标准:0.08512, params:{' n_neighbors':7},意思是:0.94000,标准:0.08414,params:{' n_neighbors':8},意思是:0.94000,标准:0.08414,params:{& #39; n_neighbors':9},意思是:0.94000,标准:0.08414,params:{' n_neighbors':10},意思是:0.94000,标准:0.08483,params:{' n_neighbors& #39;:11},意思是:0.93000,标准:0.08284,参数:{' n_neighbors':12},意思是:0.93000,标准:0.08284,参数:{' n_neighbors': 13},意思是:0.94000,标准:0.08414,参数:{' n_neighbors':14},意思是:0.94000,标准:0.08483,参数:{' n_neighbors':15},意思是:0.93000, std:0.08284,params:{' n_neighbors':16},意思是:0.94000,标准:0.08483,params:{' n_neighbors':17},意思是:0.93000,标准:0.09458, params:{' n_neighbors':18},意思是:0.94000,标准:0.08483,params:{' n_neighbors':19},意思是:0.93000,标准:0.10887,params:{& #39; n_neighbors':20}]
然而,当我得到第一个案例k=1
print clf.grid_scores_[0].cv_validation_scores
我们得到了
array([ 1. , 0.90909091, 1. , 0.72727273, 0.9 ,
1. , 1. , 1. , 1. , 0.88888889])
然而,这10次观察的平均值
print clf.grid_scores_[0].cv_validation_scores.mean()
是0.942525252525,而不是对象上显示的0.940000。
所以,我对于平均值正在做什么以及为什么它不相同感到非常困惑。我阅读了文档,但没有找到任何可以帮助我的内容。我错过了什么?
答案 0 :(得分:2)
GridSearchCV的一个参数是“iid”。它采用默认值True,描述如下:
如果为True,则假设数据在折叠中的分布相同,最小化损失是每个样本的总损失,而不是折叠的平均损失。
基本上,grid_scores_函数默认输出所有样本的平均损失,而不是折叠的平均损失。如果每个折叠中的数据点数不相同(即如果样本数不能被10整除,因为您正在进行10倍交叉验证),那么这些数字将不匹配。