将评分函数从 sklearn.metrics 传递给 GridSearchCV

Sal*_*ali 2 python scikit-learn grid-search

GridSearchCV 的文档说明我可以传递评分函数。

评分:字符串,可调用或无,默认值=无

我想使用原生的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])
Run Code Online (Sandbox Code Playgroud)

现在,当我在没有评分功能的情况下仅使用 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_
Run Code Online (Sandbox Code Playgroud)

但是当我将线路更改为

clf = GridSearchCV(model, parameters, cv=k_fold, scoring=accuracy_score) # or accuracy_score()
Run Code Online (Sandbox Code Playgroud)

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

在我看来,问题在于accuracy_score没有遵循scorer(estimator, X, y)文档中写的签名


那么我该如何解决这个问题呢?

max*_*moo 5

如果您更改scoring=accuracy_scorescoring='accuracy'请参阅文档以获取您可以通过名称使用的完整记分员列表的文档。)

从理论上讲,您应该能够像尝试一样传递自定义评分函数,但我的猜测是您是对的,accuracy_score并且没有正确的 API。