使用GridSearchCV自定义利润评分函数时出现TypeError:缺少必要位置参数'y'
使用GridSearchCV自定义利润评分函数时出现TypeError:缺少必要位置参数'y'
嘿,我来帮你排查这个问题!你遇到的TypeError是因为make_scorer的使用逻辑和你的评分函数签名不匹配,咱们一步步理清楚并解决它。
错误原因解析
make_scorer这个工具的设计初衷,是用来包装**只接受真实标签y_true和预测标签y_pred**的评分函数的。但你传给它的profit_scorer是一个需要estimator, X, y三个参数的函数——当GridSearchCV调用这个scorer时,make_scorer内部会默认按score_func(y_true, y_pred)的格式去调用,自然就会提示缺少y参数了。
两种可行的解决方案
方案一:直接使用profit_scorer作为scoring参数
GridSearchCV的scoring参数其实可以直接接受签名为(estimator, X, y)的可调用对象,不需要通过make_scorer包装。你只需要删掉make_scorer那一行,直接把函数传给scoring即可:
# 移除这一行:scorer = make_scorer(profit_scorer, greater_is_better=True) grid_search = GridSearchCV( estimator=rf, param_grid=param_grid, cv=5, scoring=profit_scorer, # 直接传递自定义评分函数 verbose=1) grid_search.fit(X, y)
方案二:调整函数适配make_scorer的要求
如果你更习惯用make_scorer,可以直接把calculate_profit传给它——因为calculate_profit正好符合make_scorer要求的(y_true, y_pred)签名,make_scorer会自动帮你调用模型的predict方法生成预测值,再传入函数计算利润:
# 直接用calculate_profit创建scorer scorer = make_scorer(calculate_profit, greater_is_better=True) grid_search = GridSearchCV( estimator=rf, param_grid=param_grid, cv=5, scoring=scorer, verbose=1) grid_search.fit(X, y)
小提醒
两种方案都能解决问题:方案二更简洁,因为make_scorer帮你封装了预测逻辑;方案一适合需要更复杂处理的场景(比如要访问模型的其他属性、对输入数据X做额外加工等)。
备注:内容来源于stack exchange,提问作者user29348541
相关产品推荐
相关产品推荐

