Scikit-learn 自定义评分函数需要来自数据集而非 X 和 y 的值
Posted
技术标签:
【中文标题】Scikit-learn 自定义评分函数需要来自数据集而非 X 和 y 的值【英文标题】:Scikit-learn custom score function needs values from dataset other than X and y 【发布时间】:2014-12-29 15:23:29 【问题描述】:我正在尝试根据其在历史体育博彩中的表现来评估模型。
我有一个包含以下列的数据集:
feature1 | ... | featureX | oddsPlayerA | oddsPlayerB | winner
模型将进行回归,输出是玩家 A 赢得比赛的几率
我的理解是,我可以使用自定义评分函数来返回模型在每次条件为真时下注时会赚到的“钱”,并使用该值来衡量模型的适应度。类似的条件:
if prediction_player_A_win_odds < oddsPlayerA
money += bet_playerA(oddsPlayerA, winner)
if inverse_odd(prediction_player_A_win_odds) < oddsPlayerB
money += bet_playerB(oddsPlayerB, winner)
在自定义评分函数中,我需要接收常见的参数,例如“ground_truth, predictions”(其中ground_truth 是获胜者[],预测是 prediction_player_A_win_odds[])还有字段“oddsPlayerA”和“oddsPlayerB”来自数据集(这就是问题所在!)。
如果使用与原始数据集完全相同的顺序调用自定义评分函数,则从数据集中检索所需的这些额外数据将是微不足道的。但实际上,当使用交叉验证方法时,得到的数据都是混杂的(与原始数据相比)。
我尝试了最明显的方法,即使用 [oddsA,oddsB,winner](维度 [n, 3])传递 y 变量,但 scikit 不允许这样做。
那么,如何将数据集中的数据放入既不是 X 也不是 y 但仍以相同顺序“捆绑在一起”的自定义评分函数中?
【问题讨论】:
你是如何进行交叉验证的? Scikit 提供了various iterators,它将索引返回到原始数据集中,您可以使用它来拆分训练/测试集。如果您有索引,您可以使用它们来提取您需要的对齐数据。 据我所知,只有使用 cross_validation.cross_val_score 才能传递自定义评分函数。所以我正在使用它。我可以寻找将返回索引的交叉验证方法,但是如何在不使用 cross_val_score 的情况下使用自定义评分函数? 经过一番思考,我想我可以使用预测和交叉验证与索引手动评分(或者不?我将如何训练?)。但我更希望能够使用 grid_search.GridSearchCV 之类的工具(它也允许自定义评分功能)。如果我能避免“手动”方法,我将不胜感激。 这是一个有趣的问题。我没有看到任何明显的方法来做到这一点,但这似乎是一件合理的事情。我们会看看是否有更多知识渊博的 scikit 人做出回应。 This message 在 sklearn 邮件列表上似乎在询问如何做类似的事情,根据回复没有直接的方法。您将不得不推出自己的 GridSearchCV 版本,或者传入所有数据并为实际模型使用某种包装器,从而丢弃您不想影响实际拟合的数据。 【参考方案1】:抱歉,目前无法实际执行此操作。您可以在交叉验证折叠上编写自己的循环,这应该不难。您不能使用GridSearchCV
或cross_val_score
执行此操作
【讨论】:
目前有计划吗?这似乎是一个合法且有用的功能。您所要做的就是让 GridSearchCV 也将索引传递给记分员,对吗? 是的。记分员界面非常新,还有一些我们还没有真正解决的问题。你是对的,这将是一个有用的功能。 所以已经好几年了,但我遇到了一个非常相似的场景,并没有从搜索中看到解决方案。在我复制和修改 sklearn.model_selection._validation.cross_validate 之前,我想检查一下是否有任何更新,也许是更好的方法?谢谢! 您可能比复制和修改 cross_validate 容易得多,但不,没有通用的解决方案。随时使用您的用例在 sklearn 问题跟踪器上打开一个问题,我们可能会考虑它。以上是关于Scikit-learn 自定义评分函数需要来自数据集而非 X 和 y 的值的主要内容,如果未能解决你的问题,请参考以下文章
Scikit-learn - 具有自定义成本和梯度函数的随机梯度下降
交叉验证:来自 scikit-learn 参数的 cross_val_score 函数