在sklearn GridSearchCV中获取Pipeline默认与自定义评估得分的正确方法
在sklearn Pipeline网格搜索中同时获取默认评分与自定义评分的正确方法
问题原因
你之前用make_scorer(pipe.score)返回nan,核心原因是未拟合的Pipeline实例的score方法无法直接作为评分函数使用。pipe.score要求模型先完成拟合才能计算得分,而GridSearchCV的scorer需要接收(y_true, y_pred)或(estimator, X, y)类型的参数,直接传入未拟合的pipe.score会因模型未训练而返回无效值。
正确实现方式
不需要直接调用未拟合Pipeline的score方法,而是通过以下两种方式指定默认评分:
1. 使用内置评分指标的字符串名称
sklearn为分类、回归等不同任务提供了内置评分名称,比如分类任务默认的accuracy、回归任务的r2,这些名称会自动对应Pipeline最后一个estimator的默认score逻辑。
2. 使用对应指标函数创建scorer
如果需要更灵活的控制,可以用make_scorer结合sklearn内置的指标函数(比如accuracy_score、r2_score)创建scorer,效果和使用字符串名称完全一致。
完整代码示例
以分类任务为例:
from sklearn.pipeline import Pipeline from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV from sklearn.metrics import accuracy_score, make_scorer # 自定义评分函数示例 def my_scoring_func(y_true, y_pred): # 这里可以编写你的自定义逻辑,比如加权准确率 return accuracy_score(y_true, y_pred) * 1.2 # 构建Pipeline pipe = Pipeline([ ('clf', SVC()) ]) # 超参数搜索网格 param_grid = {'clf__C': [0.1, 1, 10], 'clf__kernel': ['linear', 'rbf']} # 配置GridSearchCV,同时指定两种评分 grid_search = GridSearchCV( estimator=pipe, param_grid=param_grid, scoring={ # 对应Pipeline默认的评分(SVC的score默认是accuracy) 'default_score': 'accuracy', # 自定义评分 'custom_score': make_scorer(my_scoring_func) }, refit=False, # 若不需要基于某一评分重新拟合最佳模型,设为False;需要则指定对应key,比如refit='default_score' cv=5, verbose=1 ) # 拟合数据集(替换成你的X和y) # X, y = ... # grid_search.fit(X, y) # 查看交叉验证结果 # print(grid_search.cv_results_['mean_test_default_score']) # print(grid_search.cv_results_['mean_test_custom_score'])
关键说明
- 如果你不确定当前任务对应的默认评分指标,可以查看Pipeline最后一个estimator的官方文档,或者用
sklearn.metrics.get_scorer_names()获取所有可用的内置评分名称。 - 当
scoring参数传入字典时,cv_results_会包含每个评分对应的结果字段(比如mean_test_default_score、mean_test_custom_score)。
内容的提问来源于stack exchange,提问作者David Pellow
相关产品推荐
相关产品推荐

