SKLearn 交叉验证:如何将折叠示例的信息传递给我的计分器函数?
SKLearn cross-validation: How to pass info on fold examples to my scorer function?
我正在尝试制作一个自定义评分器函数,用于在 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
假设任何折叠都可能包含来自同一来源的多个测试示例...
然后对于具有相同来源的示例集,我希望我的自定义评分器 "decide" "winner" 成为模型吐出更高概率的示例。换句话说,每个源只能有一个正确的预测,但如果我的模型声称有多个评估示例 "correct" (label=1),我希望概率最高的示例与我的记分员的真相。
我的问题是记分功能需要签名:
score_func(y_true, y_pred, **kwargs)
其中 y_true
和 y_pred
仅包含 probability/label。
然而,我真正需要的是:
score_func(y_true_with_source, y_pred_with_source, **kwargs)
所以我可以按来源对 y_pred_with_source
示例进行分组,然后选择获胜者与 y_true_with_source
真相相匹配。然后我可以继续计算我的精度,例如。
有什么方法可以通过某种方式传递这些信息吗?也许是示例的索引?
听起来你在学习排序方面遇到了问题。您正在尝试从每组实例中找出排名最高的实例。目前 scikit-learn 不直接支持排名学习 - scikit-learn 几乎假定 i.i.d。实例 - 所以你必须做一些额外的工作。
我想我的第一个建议是在 API 中降低一个级别并使用 cross-validation iterators。那只会生成用于训练和验证折叠的索引。您可以使用这些索引对数据进行子集化,并在子集上调用 fit
和 predict
,删除 Source,然后使用 对其进行评分来源列。
您或许可以将其破解成 cross_val_score 方法,但它更棘手。在 scikit-learn 中,上面显示的得分函数与 cross_val_score 所采用的 scoring object(可以是函数)之间存在区别。评分对象是具有签名 scorer(estimator, X, y)
的可调用对象或函数。在我看来,您可以定义一个适用于您的指标的评分对象。您只需在将数据发送到估算器之前删除 Source 列,然后在计算指标时使用该列。如果你走这条路,我想你也必须包装分类器,这样它的 fit
方法就会跳过 Source 列。
希望对您有所帮助...祝您好运!
我正在尝试制作一个自定义评分器函数,用于在 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
假设任何折叠都可能包含来自同一来源的多个测试示例...
然后对于具有相同来源的示例集,我希望我的自定义评分器 "decide" "winner" 成为模型吐出更高概率的示例。换句话说,每个源只能有一个正确的预测,但如果我的模型声称有多个评估示例 "correct" (label=1),我希望概率最高的示例与我的记分员的真相。
我的问题是记分功能需要签名:
score_func(y_true, y_pred, **kwargs)
其中 y_true
和 y_pred
仅包含 probability/label。
然而,我真正需要的是:
score_func(y_true_with_source, y_pred_with_source, **kwargs)
所以我可以按来源对 y_pred_with_source
示例进行分组,然后选择获胜者与 y_true_with_source
真相相匹配。然后我可以继续计算我的精度,例如。
有什么方法可以通过某种方式传递这些信息吗?也许是示例的索引?
听起来你在学习排序方面遇到了问题。您正在尝试从每组实例中找出排名最高的实例。目前 scikit-learn 不直接支持排名学习 - scikit-learn 几乎假定 i.i.d。实例 - 所以你必须做一些额外的工作。
我想我的第一个建议是在 API 中降低一个级别并使用 cross-validation iterators。那只会生成用于训练和验证折叠的索引。您可以使用这些索引对数据进行子集化,并在子集上调用 fit
和 predict
,删除 Source,然后使用 对其进行评分来源列。
您或许可以将其破解成 cross_val_score 方法,但它更棘手。在 scikit-learn 中,上面显示的得分函数与 cross_val_score 所采用的 scoring object(可以是函数)之间存在区别。评分对象是具有签名 scorer(estimator, X, y)
的可调用对象或函数。在我看来,您可以定义一个适用于您的指标的评分对象。您只需在将数据发送到估算器之前删除 Source 列,然后在计算指标时使用该列。如果你走这条路,我想你也必须包装分类器,这样它的 fit
方法就会跳过 Source 列。
希望对您有所帮助...祝您好运!