一个模型可能比两个更好吗?

机器算法验证 回归 Python scikit-学习
2022-04-19 09:26:59

我正在尝试预测fantasy_points即将到来的比赛中的个别篮球运动员。计算球员的公式fantasy_points是:

fantasy_points = (1 * points_scored) + (1.5 * assists)

因此,如果球员 A 得到 10 分和 4 次助攻:

玩家 A fantasy_points= (1 x 10) + (1.5 x 4) = 16

我有几个赛季的球员数据。我的数据被组织成一行代表玩家在一场比赛中的表现。这包括赛前已知的解释变量(球员年龄、过去的表现变量、对手实力)和目标变量points_scoredassistsfantasy_points

| player | explanatory variables | points_scored | assists      | fantasy_points |
|--------|-----------------------|---------------|--------------|---------------------:|
| A      | ...                   | 10            | 4            |             16 |
| B      | ...                   | 3             | 10           |             18 |
| C      | ...                   | <to predict>  | <to predict> | <to predict>   |

使用 Scikit-Learn 的ElasticNet回归器以及GridSearchCV寻找最佳惩罚,我试图预测玩家在即将到来的游戏中将拥有多少幻想点。

我尝试了两种方法(未显示培训/简历):

两种模型方法:我训练了两个单独的模型:

  • 一个points_scored_model训练有素points_scored的目标

  • 一个assists_model训练有素assists的目标

为了弄清楚fantasy_points即将到来的游戏中有多少玩家,我结合了这样的预测:

predicted_points_scored = points_scored_model.predict(row_for_player_c)
predicted_assists       = assists_model.predict(row_for_player_c)

predicted_fantasy_points = \
  (1 * predicted_points_scored) + (1.5 * predicted_assists)

一种模型方法:我训练了一个模型:

  • fantasy_points_model训练有素fantasy_points的目标

然后我预测了这样的幻想点:

predicted_fantasy_points = fantasy_points_model.predict(row_for_player_c)

因为基础公式(1*points + 1.5*assists)被合并到Two Model Approach中,我想它能够比One Model Approachfantasy_points更准确地预测

我使用 R^2 分数来比较模型,结果发现One Model Approach比Two Model Approach表现更好

似乎单一模型方法关于该问题的信息较少,那么它如何才能获得更好的分数呢?此外,有没有办法利用幻想点公式来获得更好的预测?

3个回答

这是一个观点:两种模型方法受到更多限制,因此总是会导致模型较差。考虑 2m(双模型)模型 - 它看起来像:

f2m(x)=1.5(c1xT)+1.0(c2xT)

其中在单独的模型中进行了训练。我们可以将其重写为 1m(一个模型):ci

f1m(x)=cxT

这样

c=1.5c1+1.0c2

没有理由相信是最小二乘问题的最小值 c

minb(ybX)2

但是,全局 1m 模型该最小化问题的解决方案。事实上,如果你继续使用线性模型,你永远不会超过 1m 的 - 这是一个上限。R2

英文:是的,您已经为模型提供了更多信息,但这并不意味着解决方案是最优的。在一个有噪音的系统中,以及模型错误指定的保证,我认为你总是会比全局模型做得更差。

一个预测模型不可能比两个更好吗?

与其深入了解您的特定模型,不如让我们退后一步,在更一般的环境中查看这个问题。如果我们考虑任意一系列可观察值,那么模型有可能对这些值给出完美的预测,而模型也有可能给出糟糕的预测。也就是说,一个模型可能是正确的,而另一个模型是错误的。现在,如果我们通过某种聚合方法将这两个模型结合起来,第二个模型的唯一贡献就是污染第一个模型,并引入错误。因此,一个预测模型显然有可能优于两个

现在,进入你的实际模型,这里发生的事情是你已经分离了你对points scoredassists每个玩家的预测,然后你已经聚合了它们post-hoc目前尚不清楚您究竟做了什么来预测这些。你说你已经使用回归进行预测,但你没有指定任何解释变量,而且你甚至不清楚每个玩家是否有多个数据点。在任何情况下,通过分别对每个变量进行建模,这隐含地将这两个事物视为统计上独立的,而它们可能是相关的。

正如前面的答案所表明的,简单地添加一个错误的模型会降低性能。但是,有一些巧妙的方法可以解决这个问题。

广义堆叠算法(超级学习器就是一个例子)是聚合多个模型结果的另一种策略。它具有丢弃错误(或性能不佳)模型的优点,因此只保留具有良好信息的模型。本质上,它将数据分解为个片段,并将每个模型拟合到每个切片并在保留集中进行预测。然后对每个模型的结果进行回归以生成权重,性能更好的模型在最终预测中具有更大的权重。不能改善预测的模型的权重接近 0。可以使用大量不同的算法(尽管它会增加运行时间)。这篇开放获取的论文给出了进一步的解释:Rose 2013k

对于 Python 实现,我使用SuPyLearner(不在 PyPI 上,但您可以从 GitHub 下载)