我正在尝试创建一个自定义的记分器函数,用于在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
假设任何折叠都可能包含来自同一来源的多个测试示例。。。
然后,对于具有相同来源的一组示例,我希望我的自定义记分员"决定"获胜者"是模型吐出更高概率的示例。换言之,每个来源只能有一个正确的预测,但如果我的模型声称不止一个评估示例是"正确的"(label=1),我希望我的评分者将概率最高的示例与事实相匹配。
我的问题是记分器函数需要签名:
score_func(y_true, y_pred, **kwargs)
其中CCD_ 1和CCD_。
然而,我真正需要的是:
score_func(y_true_with_source, y_pred_with_source, **kwargs)
所以我可以根据CCD_ 3的来源对其进行分组,并选择与CCD_。然后我可以继续计算我的精度,例如。
有没有办法让我以某种方式传递这些信息?也许是例子的索引?
听起来这里有一个学习排名问题。您正在尝试从每组实例中查找排名最高的实例。目前,scikit learn不直接支持学习排名——scikit learn几乎假设有i.i.d.实例——所以你必须做一些额外的工作。
我认为我的第一个建议是在API中降低一个级别,并使用交叉验证迭代器。这只会产生训练和验证折叠的指数。您可以使用这些索引对数据进行子集划分,并在子集上调用fit
和predict
,删除Source,然后使用Source列对其进行评分。
您可能可以使用cross_val_score方法来破解它,但它更为棘手。在scikit中,学习上面显示的score函数和cross_val_score获取的评分对象(可以是一个函数)之间的区别。评分对象是具有签名scorer(estimator, X, y)
的可调用对象或函数。在我看来,你可以定义一个适用于你的指标的评分对象。在向估计器发送数据之前,您只需要删除Source列,然后在计算度量时使用该列。如果你走这条路,我认为你也必须包装分类器,这样它的fit
方法就会跳过Source列。
希望能有所帮助。。。祝你好运