我在scikit-learn中创建动态管道,并将评分函数设置为GridSearchCV
的参数字符串:
gs = GridSearchCV(pipeline, grid, scoring='accuracy')
然而,当我尝试获取用于评估预测的评分函数时,我得到了以下结果:
File "app/experimenter/sklearn/sklearn-dask-tests.py", line 127, in run_pipeline print(evaluator(expected, predicted))TypeError: __call__() takes at least 4 arguments (3 given)
这是代码:
gs.fit(train_data, train_target)predicted = gs.predict(test_data)evaluator = gs.scorer_print(evaluator(expected, predicted))
从我所看到的来看,问题在于评估器实际上是make_scorer(accuracy_score)
。我猜如果我将估计器作为第一个参数添加进去,print(evaluator(expected, predicted))
可能会工作,但如何从管道中正确获取它呢?
因为当我使用gs.best_estimator_
时,我得到的是:
Pipeline(steps=[('mapper', DataFrameMapper(default=False, df_out=False, features=[('Sex', LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False))], sparse=False)), ('DecisionTree', DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=3, max_features=1, max_... min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best'))])
回答:
是的,这是GridSearchCV的预期行为。从gs.best_estimator_
返回的管道对象已经在整个train_data
上使用网格搜索中找到的最佳参数进行了拟合。
你需要将该管道对象发送到evaluator
中。但你当前对evaluator
的使用是错误的。
由make_scorer
创建的scorer_
的工作原理是,它接收测试数据,对其进行预测,然后通过与实际数据进行比较来计算得分。
因此,它的签名是:
scorer(estimator, X_test, y_test)
但你试图这样使用它:
evaluator(expected, predicted)
这不会工作,因为:
- 它不符合
scorer
的签名 - 它需要X数据,而不是预测的y数据。
所以,如果你已经有了数据的实际值和预测值,你可以简单地使用:
accuracy_score(expected, predicted)
如果你想使用scorer_
(你的evaluator
),那么你不应该提供predicted
,而是提供test_data
(从中获得predicted
)
evaluator(gs.best_estimator_, test_data, expected)