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)
,这是写的文档
那么,如何才能解决这个问题?
谢谢。第一个bug是无关紧要的,因为这只是我尝试快速创建一个简单示例时引入的一个错字。非常感谢你解决我真正的问题。我其实认为我必须传递一个真正的函数,而不是一个字符串。 –
很酷我会从我的答案中删除它 – maxymoo