我试图弄清楚如何制作一个自定义评分器,该评分器将仅使用前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%的预测是有用的,所以我更关心的是模型对这些预测的表现,而不是其他地方的表现。
1条答案
按热度按时间tp5buhyn1#
从你的问题来看,
y_pred
是否包含原始分数或概率估计并不完全清楚,所以我假设它们是正类的概率。如果不是,您可能需要调整以下方法。在您的情况下,ROC AUC可能不是最合适的指标。ROC AUC得分期望阳性和阴性类别的平衡分布,这可能不是您的前x%预测的情况,特别是如果您的阳性类别很罕见或者您对最高预测更感兴趣。
更好的选择可能是 * K处的精度 *,它更侧重于正面示例的排名。下面是如何实现这一点:
字符串
此外,如果你对前K个正确预测的数量感兴趣,你可以创建一个自定义函数来实现这一点:
型
像这样使用记分器:
型
(我成功地用iris数据集测试了代码)