【问题标题】:How to match test columns with train data?如何将测试列与训练数据匹配?
【发布时间】:2018-11-20 09:57:11
【问题描述】:

尝试使用朴素贝叶斯时出错。

from sklearn.naive_bayes import GaussianNB
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/sjwhitworth/golearn/master/examples/datasets/tennis.csv')

X_train = pd.get_dummies(df[['outlook', 'temp', 'humidity', 'windy']])
y_train = df['play']

gNB = GaussianNB()
gNB.fit(X_train, y_train)

ndf=pd.DataFrame({'outlook':['sunny'], 'temp':['hot'], 'humidity':['normal'], 'windy':[False]})
X_test=pd.get_dummies(ndf[['outlook', 'temp', 'humidity', 'windy']])

gNB.predict(X_test)

ValueError: 操作数不能与形状一起广播 (1,4) (9,)

在这种情况下使用 get_dummies 方法是个好主意吗?

【问题讨论】:

  • 没有。 get_dummies 只会将那些列作为当时数据中存在的不同值。大多数情况与训练数据不同。所以在这种情况下使用LabelEncoder + OneHotEncoder。或者,如果您可以使用来自 github 的 scikit 开发版本,请使用 CategoricalEncoder。请看my answer here
  • 否则,如果您想使用get_dummies(),请在拆分为训练测试之前对整个数据使用它。但这在现实生活中或部署在生产环境中是不可能的(可行的)。

标签: machine-learning scikit-learn naivebayes


【解决方案1】:

正如 vivek 所指出的那样,显然不是一个好习惯,但如果你想这样做,这里就是代码:

from sklearn.naive_bayes import GaussianNB
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/sjwhitworth/golearn/master/examples/datasets/tennis.csv')

X_train = pd.get_dummies(df[['outlook', 'temp', 'humidity', 'windy']])
y_train = df['play']

gNB = GaussianNB()
gNB.fit(X_train, y_train)

ndf=pd.DataFrame({'outlook':['sunny'], 'temp':['hot'], 'humidity':['normal'], 'windy':[False]})
X_test=pd.get_dummies(ndf[['outlook', 'temp', 'humidity', 'windy']])

dict1 = {}
X_test.columns
for i in X_train.columns:
  if i in X_test.columns:
    dict1.update({i:[1]})
  else:
    dict1.update({i:[0]})
X_test_new = pd.DataFrame(data = dict1)


gNB.predict(X_test_new)

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 2022-01-11
    • 1970-01-01
    • 2019-05-01
    • 2013-11-30
    • 2017-02-21
    • 2021-07-19
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多