【问题标题】:How to do multi label classification of the below problem? Pandas Python如何对以下问题进行多标签分类?熊猫蟒
【发布时间】:2021-11-26 12:32:23
【问题描述】:

我的原始数据是这样的。 目的是建立一个模型来预测主客队获胜还是平局

 df.head()
    id  season   home_team  away_team  home_goals  away_goals result winner
0   0   2006-07  SHU        Liv        1           1          D    NaN
1   1   2006-07  Ars        AVL        1           1          D    NaN
2   2   2006-07  Eve        Wat        2           1          H    Eve
3   3   2006-07  NEW        WA         2           1          H    New
4   4   2006-07  Por        BR         3           0          H    Por

df.columns

Index(['id', 'season', 'home_team', 'away_team', 'home_goals', 'away_goals',
       'result', 'winner'],
      dtype='object')

我选择了这 3 列并对其进行了标签编码

 df[['home_team', 'away_team','winner',]].head()  

至于结果变量,我创建了这些新功能:

df.loc[df["winner"]==df["home_team"],"home_team_win"]=1
df.loc[df["winner"]!=df["home_team"],"home_team_win"]=0

df.loc[df["result"]=='D',"draw"]=1
df.loc[df["result"]!='D',"draw"]=0

我认为这两个都是我的课程(home_team_windraw

下面,我为 home_team_win 类编写了代码,我在相同的代码中应用了第二类 draw,这给了我下面提到的错误。我认为 RFE 在我的情况下不支持多个类。

X = prediction_df.drop(['home_team_win','draw'] ,axis=1) # X

y = prediction_df[['home_team_win','draw']] # y

当我使用单个类 "home_team_win" 时不会发生错误,但是当我将 "draw" 作为第二类时会发生以下错误

logReg=LogisticRegression(solver='lbfgs')

print('logReg', logReg)

X.shape
out[]:
(4560, 2)

y.shape
out[]:
(4560, 2)

rfe = RFE(logReg, 20) # 20 is test percentage

rfe = rfe.fit(X, y.values.ravel())

print('rfe', rfe)

#Checking for the features of they are important

print(rfe.support_)

错误:

ValueError:发现样本数量不一致的输入变量:[4560, 9120]

预测系统将预测主队获胜百分比和平局百分比。

预测结果为:

Home Team Win 60%
Draw 20%

【问题讨论】:

  • 您能否提供一小部分数据样本和完整的错误输出?
  • 我已经提供了所有必要的数据和信息

标签: python pandas logistic-regression


【解决方案1】:

您需要决定是独立预测您的两个标签(平局还是平局,主场赢还是主场不赢)还是要预测为 3 个不同的类别(主场赢、平局、其他)。

如果是前者,你有两个响应变量或标签,你不能用.ravel() 将它们展平。您需要使用MultiOutputClassifier,但这不适用于 RFE。

例如:

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.multioutput import MultiOutputClassifier
from sklearn.feature_selection import RFE

X = np.random.uniform(0,1,(200,50))
y = np.random.random(["Win","Draw","Lose"],(200,2))

logReg=LogisticRegression(solver='lbfgs')
clf = MultiOutputClassifier(logReg)
clf.fit(X,y)

如果您只使用 1 个响应变量,您可以取回每个类的概率,我没有您的数据框,但这样的东西应该可以工作:

df['label'] = 0
df.loc[df["winner"]==df["home_team"],"label"]=1
df.loc[df["result"]=='D',"label"]=2

然后运行逻辑回归

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 2021-09-10
    • 2023-04-03
    • 2018-10-12
    • 2020-11-01
    • 2013-11-16
    • 2020-08-10
    • 2021-07-20
    相关资源
    最近更新 更多