2016-08-04 72 views
1

GridSearchCV's documentations指出我可以通过评分函数。将sklearn.metrics的评分函数传递给GridSearchCV

scoring : string, callable or None, default=None

我想使用本机accuracy_score作为评分函数。

所以这里是我的尝试。进口和一些数据:

import numpy as np 
from sklearn.cross_validation import KFold, cross_val_score 
from sklearn.grid_search import GridSearchCV 
from sklearn.metrics import accuracy_score 
from sklearn import neighbors 

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) 
Y = np.array([0, 1, 0, 0, 0, 1]) 

现在,当我用不用我的评分功能只是k折交叉验证,一切都按预期工作:

parameters = { 
    'n_neighbors': [2, 3, 4], 
    'weights':['uniform', 'distance'], 
    'p': [1, 2, 3] 
} 
model = neighbors.KNeighborsClassifier() 
k_fold = KFold(len(Y), n_folds=6, shuffle=True, random_state=0) 
clf = GridSearchCV(model, parameters, cv=k_fold) # TODO will change 
clf.fit(X, Y) 

print clf.best_score_ 

但是,当我改变行

clf = GridSearchCV(model, parameters, cv=k_fold, scoring=accuracy_score) # or accuracy_score() 

我得到的错误:ValueError: Cannot have number of folds n_folds=10 greater than the number of samples: 6.这在我看来并不代表真正的问题。

在我看来,问题是,accuracy_score不遵循签名scorer(estimator, X, y),这是写的文档


那么,如何才能解决这个问题?

回答

3

如果您将scoring=accuracy_score更改为scoring='accuracy'(请参阅多科的http://scikit-learn.org/stable/modules/model_evaluation.html以获取可按名称使用的记分器的完整列表),它将起作用。

理论上你应该能够通过自定义的得分功能,就像你正在尝试,但我的猜测是你是对的,并且accuracy_score没有正确的API。

+0

谢谢。第一个bug是无关紧要的,因为这只是我尝试快速创建一个简单示例时引入的一个错字。非常感谢你解决我真正的问题。我其实认为我必须传递一个真正的函数,而不是一个字符串。 –

+1

很酷我会从我的答案中删除它 – maxymoo