numpy Sklearn自定义评分器,用于计算前x%预测值的ROC AUC

xdyibdwo  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(125)

我试图弄清楚如何制作一个自定义评分器,该评分器将仅使用前x%的预测值而不是所有预测值来计算ROC AUC或平均精度。
这是我计算ROC auc的最佳尝试,例如:

def top_k_roc_auc(y, y_pred):
    predictions_df = pd.DataFrame({"y": y, "y_pred": y_pred})
    k = round(len(predicitons_df) * 0.25)
    top_k_predictions = predictions_df.sort_values("y_pred", ascending=False).head(n=k)
    roc_auc = roc_auc_score(top_k_predictions["y"], top_k_predictions["y_pred"])

    return roc_auc

字符串
其中预期的行为是,它会按照概率的降序排序预测,同时保持每个可能在其关联的真值旁边,然后只计算前25%的roc auc,但当我尝试使用它时,它只是一遍又一遍地返回相同的数字(我尝试将0.25设置为1,尝试复制常规roc auc的结果,但由于某种原因得到了不同的结果)。
这样做的动机是,在实践中,只有前x%的预测是有用的,所以我更关心的是模型对这些预测的表现,而不是其他地方的表现。

tp5buhyn

tp5buhyn1#

从你的问题来看,y_pred是否包含原始分数或概率估计并不完全清楚,所以我假设它们是正类的概率。如果不是,您可能需要调整以下方法。
在您的情况下,ROC AUC可能不是最合适的指标。ROC AUC得分期望阳性和阴性类别的平衡分布,这可能不是您的前x%预测的情况,特别是如果您的阳性类别很罕见或者您对最高预测更感兴趣。
更好的选择可能是 * K处的精度 *,它更侧重于正面示例的排名。下面是如何实现这一点:

from sklearn.metrics import precision_score
import numpy as np

def precision_at_k(y_true, y_test_proba):
    threshold = np.sort(y_test_proba)[::-1][int(0.25*len(y_test_proba))]
    y_pred = np.asarray([1 if i >= threshold else 0 for i in y_test_proba])
    return precision_score(y_true, y_pred)

字符串
此外,如果你对前K个正确预测的数量感兴趣,你可以创建一个自定义函数来实现这一点:

def correct_at_k(y_true, y_test_proba):
    threshold = np.sort(y_test_proba)[::-1][int(0.25 * len(y_test_proba))]
    y_pred = np.asarray([1 if i >= threshold else 0 for i in y_test_proba])
    return sum((y_pred == 1) & (y_true == 1)) / len(y_pred[y_pred == 1])


像这样使用记分器:

from sklearn.metrics import roc_auc_score, make_scorer

my_scorer1 = make_scorer(precision_at_k, needs_proba=True)
my_scorer2 = make_scorer(correct_at_k, needs_proba=True)


(我成功地用iris数据集测试了代码)

相关问题