马赛预测 - Scikit Learn:每场比赛多行

5

目标

我希望使用Scikit-learn训练一个模型,预测马赛的结果。我有一个CSV文件,包含多个特征,如位置、年龄、重量、马名、比赛ID等

问题

在原始的CSV文件中,每匹马都表示为一行数据。每场比赛由8行数据组成,其中位置从1到8。然而,当我训练我的模型时,模型将每一行数据视为单独的事件(比赛),因此效果不佳。

方法

我尝试解决这个问题,并创建了一个新的CSV文件,其中每行数据表示一场比赛,特征由position1、age1、weight1、horse_name1、race_id1到position8、age8、weight8、horse_name8、race_id8完成(见下方)。但是,在这种情况下使用Multioutput时,我的模型根本无法训练,但注意到age1、weight1是获胜者的列,并且获得了100%的准确性。

想法

我想知道是否有解决这个问题的方法。也许可以使用原始文件,但以某种方式告诉模型具有相同race_id值的行应被视为一个事件。我可以考虑使用groupby(race_id),但无法将新组馈入模型中。此外,你可以像对文本数据进行预测时一样,为每场比赛使用一个包。

我现在卡住了,所以任何建议都会受到高度赞赏 :)

ORIGINAL DF 

position horse age weight race_id 

1        name1 3y  900    1 
2        name2 4y  800    1
3        name3 5y  760    1
...      ...   ... ...    ...
8        name8 7y  980    1
1        name9 4y  880    2
...      ...   ... ...    ...
8       name16 5y  770    2

NEW DF 

position1 horse1 weight1 race_id1 ... position8 horse8 weight8 race_id8 

1         name1  900     1            8         name8  980     1 
1         name9  880     2            8         name16 770     2   

我想知道ORIGINAL DF中的horse列是否唯一。你能分享一小部分数据集让我们帮助你吗? - Henrique Branco
既然您提到准确性,您是将其视为分类吗?将其视为回归(或排名)不是更好吗?此外,如果您对回归结果进行后处理以将其转换为1-8位置,则独立处理每行的问题并不是一个大问题。 - Shihab Shahriar Khan
@ShihabShahriarKhan,你说得对,我把它当作职位的分类来处理。我同意你的观点,将其视为回归问题,预测完成时间并按1-8排序也是一个好主意。然而,我认为如果模型将每场比赛视为一个事件,预测会更准确。例如,如果一匹马有非常好的完成时间,其他马可能也会更好,因为其他马也在赶着比赛。 - Felix
@HenriqueBranco 马匹列独特之处在于“name1”、“name2”用于表示该匹马的个体身份。然而,由于参加了多场比赛,同一匹马可能会在数据中出现多次。 我目前还没有特定的数据集,但是查看了所有可用的数据集后发现它们都具有相同的结构,我无法解决我的问题。 - Felix
我有完全相同的问题,你解决了吗?如果是这样,能否发布或链接到解决方案?谢谢。 - DublinMeUp
2个回答

1

如果我正确理解您的问题,您想将旧数据框转换为新数据框并将其提供给模型。 你可以使用这段代码:

import pandas as pd
import numpy as np

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
df = pd.DataFrame({'position': [1, 2, 3, 4],
                   'horse': ['name1', 'name2', 'name3', 'name8'],
                   'age': ['4y', '4y', '5y', '7y'],
                   'weight': [800, 978, 76, 565],
                   'race_id': [1, 1, 2, 2]})

groupby_race = df.groupby(['race_id'])
arr = []
for name, group in groupby_race:
    r = np.concatenate([row.values for index, row in group.iterrows()])
    arr.append(r)
new_df = pd.DataFrame(data=arr, columns = ['position1', 'horse1', 'age1', 'weight1', 'race_id1',
                                           'position2', 'horse2', 'age2', 'weight2', 'race_id2'])

1
不,我已经有了那个新的数据框。我的问题更多地涉及对机器学习的理解,以及如何使用旧的或新的数据框来进行良好的预测。为了创建新的数据框,我使用了这个简单的代码: s=df.assign(key=df.groupby('race_id').cumcount()+1).set_index(['race_id','key']).stack().unstack([1,2]) s.columns=s.columns.map('{0[1]}{0[0]}'.format) - Felix
你的方法非常优雅,顺便问一下Felix,你在处理特定的数据集吗?能分享一下吗? - badger
如果您的目标是完成时间,我认为问题会更容易解决,您可以独立地处理每一行。请看这篇论文: https://pdfs.semanticscholar.org/0191/19dff662e50678563bb50bccca13d433bab2.pdf?_ga=2.143262577.596549207.1587647628-204272250.1587647628 - badger
我并未使用特定的数据集,但对于所有可用的数据集,问题都是相同的。 你可能是对的,预测完成时间可能更容易或更好。然而,我认为如果每一行都被单独处理,还是会有所不同。其他马匹可能由于一匹快马的竞争力而跑得更快。例如,如果将其视为一场比赛,则具有“最佳特征”的一匹马可能会提高其他马匹在预测中的完成时间。 - Felix

0
我认为在这里可行的做法是使用sklearn库创建一个逻辑回归模型,这样我们就可以预测每匹马赢得比赛的机会。我想要考虑到每次比赛中马匹所面对的竞争对手可能会相当困难。因此,以下是我的建议:
  1. 为您的数据框分配一列,用于标记马是否获胜

  2. 将其拆分为训练和测试数据

  3. 实现sklearn.LogisticRegression

  4. 拟合LogisticRegression

  5. 报告分数

可能需要检查数据集中哪些特征是重要的,因此主成分分析有助于减少预测空间的维度。此外,逻辑回归假定我们的预测变量彼此独立,因此您可能需要先进行一些探索性分析,以查看数据集中是否存在某些共线性。
逻辑回归文档:(https://scikitlearn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)

如果您愿意分享数据集,我很想自己尝试一下!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接