Scikit-learn多分类任务make_scorer自定义指标选取目标类概率咨询
三分类自定义收益函数选取目标类别概率的解决方案
核心原理
scikit-learn中分类器的predict_proba接口在多分类场景下会返回形状为(样本数, 类别数)的二维数组,每一列的顺序和分类器的classes_属性存储的类别标签顺序完全对应,你只需要提取目标类别对应的列即可实现单类别的收益计算。
具体实现步骤
- 确认目标类别的索引:先打印训练后的分类器
clf.classes_属性,找到你要计算收益的目标类别对应的索引位置,例如你的类别标签为[0,1,2],要计算标签为1的流失客户收益,对应索引就是1。 - 修改自定义收益函数,提取目标类别的概率列,同时调整真实标签的判断逻辑。
可直接复用的代码示例
def gain_fn(y_true, y_prob): # 替换下方索引为你目标类别的实际索引,示例为类别1对应索引1 target_prob = y_prob[:, 1] # 真实标签判断也对应你的目标类别取值 tp = np.where((target_prob >= 0.025) & (y_true == 1), 40000, 0) fp = np.where((target_prob >= 0.025) & (y_true != 1), -1000, 0) return np.sum(tp + fp) scorer_fn = make_scorer(gain_fn, greater_is_better = True, needs_proba=True) # RandomizedSearchCV的其余配置保持不变即可 randomcv = RandomizedSearchCV( estimator=clf, param_distributions = params_grid, cv=kfoldcv, n_iter=100, n_jobs=-1, scoring=scorer_fn )
补充注意事项
- 若你需要针对多个类别分别计算收益再累加,可分别提取多个类别的概率列,结合业务规则分别计算后再求和返回即可。
- 索引取值一定要和
clf.classes_的顺序对应,避免取错其他类别的概率导致计算结果不符合预期。
内容的提问来源于stack exchange,提问作者Antonio Velazquez Bustamante
相关产品推荐
相关产品推荐

