【问题标题】:Predicting test data with fewer features than training set预测具有比训练集更少特征的测试数据
【发布时间】:2018-08-19 22:47:14
【问题描述】:

我正在使用 Scikit-Learn 的 KNeighborsClassifier() 库来使用球队名称预测足球比赛结果。我的训练数据有一场比赛的 18 个统计数据,例如进球数和犯规次数,而对于我的测试集,我只能使用 2 个球队名称。
问题是训练特征的数量必须与测试特征的数量相匹配,否则我会得到

ValueError: query data dimension must match training data dimension

我怎样才能克服这个问题,同时保持我的训练集包含过去的统计数据,而测试集只包含团队名称?

代码

df = pd.read_csv('2013p.csv') # Training data
dftest= pd.read_csv('2014p.csv') # Test Data


X = np.array(df.drop(['FTR','BbAvH','BbAvD','BbAvA'],1)) #features
y = np.array(df['FTR']) #labels classes

Xtest = np.array(dftest.drop(['FTHG','FTAG','FTR','HTHG','HTAG','HS','AS','HST','AST','HF','AF','HC','AC','HY','AY','HR','AR','BbAvH','BbAvD','BbAvA'],1))#features

ytest = np.array(dftest['FTR']) #labels classes

clf= neighbors.KNeighborsClassifier(n_neighbors =19)#New Classifier

clf.fit(X, y)#Fit on train data

results = clf.predict(Xtest)

数据
HomeTeam, AwayTeam, FTHG, FTAG, FTR, HTHG, HTAG, HS, AS, HST, AST, HF, AF
401, 301, 2 , 3 , -1 , 1 , 1 , 5 , 7 , 3 , 5 , 2 , 4

【问题讨论】:

  • 在这种情况下,您不能使用分类器。您需要其他实用程序,例如每支球队的统计数据、胜率等来指导这一点。显示您的数据。
  • 否则你可能会使用之前行的数据。就像你的团队的统计数据可以在测试数据中重复使用。请通过示例更清楚地解释您实际上要预测的内容。
  • 我已经添加了一个数据示例,一些列被省略了空间。这将是我的分类器将从中学习和训练的内容,然后我将仅使用主队和客队进行预测。另外,我需要使用这个分类器,比如朴素贝叶斯和线性回归和决策树

标签: python scikit-learn


【解决方案1】:

您所拥有的功能似乎不适用于您试图预测的问题。 (足球比赛结果)

这就是所谓的数据泄露,即信息从未来泄露到过去。

以下功能不适用于尚未进行的比赛:

FTHG = Full Time Home Team Goals
FTAG = Full Time Away Team Goals
FTR  = Full Time Result 
HTHG = Half Time Home Team Goals
HTAG = Half Time Away Team Goals
HS   = Home Team Shots
AS   = Away Team Shots
HST  = Home Team Shots on Target
AST  = Away Team Shots on Target
HF   = Home Team Fouls Committed
AF   = Away Team Fouls Committed

使用它们训练模型会产生不切实际的好预测。这是因为模型基本上会知道当 FTHG > FTAG 时,结果是主场胜利。

问题在于,全场主场进球只有在赛事结束后才能知晓,因此您没有预测能力。

您需要重新设计您的功能,以便仅使用事件实际开始之前可用的信息。

我开发了免费提供的足球预测 API,并且必须仔细选择功能以避免数据泄露。

例如,一些好的功能是:

  • 在主场对阵与当前对手相似的球队时赢得比赛的百分比。
  • 最近 X 场比赛的平均进球数。
  • 上一场比赛的平均进球数。

这些特征可以在实际事件发生之前就知道。

【讨论】:

    【解决方案2】:

    有趣的问题,我不是专家,但我认为您需要执行以下操作之一

    1. 根据存在的其他特征对缺失的特征进行插值
    2. 缺失特征可能具有的所有可能值的平均值
      • 也许假设每个特征的可能范围,然后使用特征的所有可能值运行预测。
      • 您必须适应的模型数量确实会出现组合爆炸式增长。您是否可以忍受这取决于您要处理多少缺失的功能以及每个预测需要多长时间

    【讨论】:

    • 平均是我做到的
    【解决方案3】:

    训练集的形状必须和测试集的形状一致,所以使用SelectKBest进行变换。

    【讨论】:

    • 在我的训练特征上使用这个,会删除除两个最重要的特征之外的所有特征吗?
    • 选择 K Best ,如果 k=2 ,选择 2 个信息量最大的特征。阅读:scikit-learn.org/stable/modules/generated/…
    • 我用过这个,但是不会丢失一些信息吗?例如,我现在运行它,它决定不会有平局。
    • 我还想到,如果火车功能之一不是主队或客队,那么使用这些功能进行测试将毫无意义
    • 是的,但这取决于您的数据。您需要相同形状的特征。
    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 2020-03-19
    • 2019-03-18
    • 2015-01-17
    • 2017-11-26
    • 2022-11-15
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多