如何在sklearn中使用make_scorer自定义评分功能

Posted

技术标签:

【中文标题】如何在sklearn中使用make_scorer自定义评分功能【英文标题】:How to use make_scorer Custom scoring function in sklearn 【发布时间】:2018-03-14 09:49:38 【问题描述】:

我正在尝试实现一个最高十分位召回/精度评分函数以插入到 gridsearchCV 中。但是,我无法弄清楚出了什么问题。我想做的是让我的评分函数接受概率预测、实际标签和理想情况下的十分位阈值百分比。然后我会对分数进行排序,然后确定十分位阈值内的转换率。例如。前 10% 人口的转化率。该转换率将是我输出的分数。越高越好。但是,当我运行下面的代码时,我没有得到概率分数,我不明白评分函数的输入是什么。下面的打印语句只返回 1 和 0 而不是概率。

def top_decile_conversion_rate(y_prob, y_actual):
    # Function goes in here
    print y_prob, y_actual
    return 0.5


features = pd.DataFrame("f1":np.random.randint(1,1000,500) , "f2":np.random.randint(1,1000,500), 
                         "label":[round(x) for x in np.random.random_sample(500)])


my_scorer = make_scorer(top_decile_conversion_rate, greater_is_better=True)
gs = grid_search.GridSearchCV(
    estimator=LogisticRegression(),
    param_grid='C': [i for i in range(1, 3)], 'class_weight': [None], 'penalty':['l2'],
    cv=2,
    scoring=my_scorer ) 
model = gs.fit(features[["f1","f2"]], features.label)

【问题讨论】:

在 make_scorer() 中,评分函数应该有一个签名 (y_true, y_pred, **kwargs) 在你的情况下似乎相反。另外,您的top_decile_conversion_rate 返回的是什么?请添加这些详细信息。 top_decile_conersion_rate 将返回一个介于 0 和 1 之间的数字的转化率。是的,签名是这样,但我没有看到传递给该函数的预测。 “我没有看到传递给该函数的预测”是什么意思?你能解释一下吗?预测将在内部传递给该函数。你也可以添加完整的top_decile_conersion_rate函数,以便我可以调试 更新了代码以反映要调试的完整代码。请注意,打印语句只打印出 1 和 0,而不是任何预测概率 刚刚注意到 needs_proba 参数!现在一切都很好。谢谢@VivekKumar 【参考方案1】:

解决方案是在 make_scorer 函数中添加一个名为 needs_proba=True 的参数!这工作正常。

def top_decile_conversion_rate(y_prob, y_actual):
    # Function goes in here
    print "---prob--"
    print y_prob
    print "---actual--"
    print y_actual
    print "---end--"

    return 0.5


features = pd.DataFrame("f1":np.random.randint(1,1000,500) , "f2":np.random.randint(1,1000,500), 
                         "label":[round(x) for x in np.random.random_sample(500)])


my_scorer = make_scorer(top_decile_conversion_rate, greater_is_better=True,needs_proba=True)
gs = grid_search.GridSearchCV(
    estimator=LogisticRegression(),
    param_grid='C': [i for i in range(1, 3)], 'class_weight': [None], 'penalty':['l2'],
    cv=20,
    scoring=my_scorer ) 
model = gs.fit(features[["f1","f2"]], features.label)

【讨论】:

回归类型记分器中带有print()函数的DEBUG怎么样?我尝试成功,但print() 不起作用。我想显示 y_pred 和 y_true 值,但不能 以前见 [***.com/questions/3807694/… 您需要从 gridsearch 中选择获胜模型,然后调用 predict 函数以获得您的预测。类似 gs.best_estimator_.predict(X)

以上是关于如何在sklearn中使用make_scorer自定义评分功能的主要内容,如果未能解决你的问题,请参考以下文章

sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)

sklearn基于make_scorer函数为Logistic模型构建自定义损失函数并可视化误差图(lambda selection)和系数图(trace plot)+代码实战

sklearn 交叉验证中的自定义评分功能

GridSearchCV 的 sklearn 中的自定义“k 精度”评分对象

如何在 sklearn 的集成分类器中使用自定义分类器?

如何在 sklearn 中编写自定义估算器并对其使用交叉验证?