GridSearchCV结果的意外平均值

时间:2014-12-04 20:51:11

标签: python-2.7 scikit-learn

我试图理解为什么我会遇到以下情况 - 我正在使用虹膜数据,并且正在使用 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

的10个CV结果时
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。

所以,我对于平均值正在做什么以及为什么它不相同感到非常困惑。我阅读了文档,但没有找到任何可以帮助我的内容。我错过了什么?

1 个答案:

答案 0 :(得分:2)

GridSearchCV的一个参数是“iid”。它采用默认值True,描述如下:

如果为True,则假设数据在折叠中的分布相同,最小化损失是每个样本的总损失,而不是折叠的平均损失。

基本上,grid_scores_函数默认输出所有样本的平均损失,而不是折叠的平均损失。如果每个折叠中的数据点数不相同(即如果样本数不能被10整除,因为您正在进行10倍交叉验证),那么这些数字将不匹配。