【问题标题】:SKLearn cross-validation: How to pass info on fold examples to my scorer function?SKLearn 交叉验证:如何将折叠示例的信息传递给我的记分器功能?
【发布时间】:2016-03-22 19:37:42
【问题描述】:

我正在尝试制作一个自定义记分器函数,用于在 scikit-learn (Python) 中交叉验证我的(二进制分类)模型。

我的原始测试数据的一些示例:

Source   Feature1   Feature2   Feature3
 123        0.1        0.2        0.3
 123        0.4        0.5        0.6
 456        0.7        0.8        0.9

假设任何折叠可能包含来自同一来源的多个测试示例...

然后对于具有相同来源的示例集,我希望我的自定义记分器“决定”“获胜者”是模型吐出更高概率的示例。换句话说,每个来源只能有一个正确的预测,但如果我的模型声称多个评估示例是“正确的”(标签 = 1),我希望概率最高的示例与事实相匹配我的得分手。

我的问题是记分器功能需要签名:

score_func(y_true, y_pred, **kwargs)

其中y_truey_pred 仅包含概率/标签。

然而,我真正需要的是:

score_func(y_true_with_source, y_pred_with_source, **kwargs)

所以我可以按来源对y_pred_with_source 示例进行分组,并选择与y_true_with_source 真相匹配的获胜者。然后我可以继续计算我的精度,例如。

有什么方法可以让我以某种方式传递这些信息吗?也许是示例的索引?

【问题讨论】:

    标签: python numpy scikit-learn cross-validation


    【解决方案1】:

    听起来您在这里遇到了学习排名问题。您正在尝试从每组实例中找到排名最高的实例。 scikit-learn 目前不直接支持学习排名 - scikit-learn 几乎假设 i.i.d.实例 - 所以你必须做一些额外的工作。

    我认为我的第一个建议是在 API 中降低一个级别并使用cross-validation iterators。这只会为训练和验证折叠生成索引。您可以使用这些索引对数据进行子集化,并在子集上调用 fitpredict,删除 Source,然后使用 Source 列对其进行评分。 p>

    您可能可以将其破解为 cross_val_score 方法,但它更棘手。在 scikit-learn 中,您在上面显示的 score 函数和 cross_val_score 采用的 scoring object(可以是一个函数)之间存在区别。评分对象是具有签名scorer(estimator, X, y) 的可调用对象或函数。在我看来,您可以定义一个适用于您的指标的评分对象。您只需在将数据发送到估算器之前删除 Source 列,然后在计算指标时使用该列。如果你走这条路,我想你也必须包装分类器,以便它的fit 方法跳过 Source 列。

    希望对您有所帮助...祝您好运!

    【讨论】:

    • 是的!我以为我可能必须实现自己的折叠迭代器和记分器,但您的清晰解释使一切井井有条。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 2019-03-18
    • 2019-07-28
    • 1970-01-01
    • 2021-02-17
    • 2012-12-31
    • 2016-04-13
    • 2014-11-24
    相关资源
    最近更新 更多