使用比训练集更少的功能来预测测试数据

时间:2018-03-11 23:50:40

标签: python scikit-learn

我正在使用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

3 个答案:

答案 0 :(得分:1)

有趣的问题,我不是专家,但我认为您需要做以下其中一项

  1. 根据存在的其他功能插入缺失的功能
  2. 缺少的功能可能具有的所有可能值的平均值
    • 或许假定每个要素的可能范围,然后使用该要素的所有可能值运行预测。
    • 您必须适应的模型数量会出现组合爆炸。您是否可以使用它取决于您想要处理多少缺少的功能以及每次预测需要多长时间

答案 1 :(得分:0)

训练集的形状必须与测试集的形状相同,因此请使用SelectKBest对其进行转换。

答案 2 :(得分:0)

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

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

以下功能不适用于尚未播放的匹配项:

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场比赛的平均进球数。
  • 上一场比赛中设想的平均目标。

在实际事件发生之前,可以了解这些功能。