【问题标题】:OneHotEncoded features causing error when input to ClassifierOneHotEncoded 特征在输入到分类器时导致错误
【发布时间】:2016-11-29 04:15:40
【问题描述】:

我正在尝试为决策树和多项朴素贝叶斯分类器的输入准备数据。

这就是我的数据的样子(熊猫数据框)

Label  Feat1  Feat2  Feat3  Feat4

0        1     3       2      1
1        0     1       1      2
2        2     2       1      1
3        3     3       2      3

我已将数据拆分为 dataLabel 和 dataFeatures。 使用dataLabel.ravel()准备的dataLabel

我需要离散化特征,以便分类器将它们视为分类而非数字。

我正在尝试使用 OneHotEncoder 来做到这一点

enc = OneHotEncoder()

enc.fit(dataFeatures)
chk = enc.transform(dataFeatures)
from sklearn.naive_bayes import MultinomialNB

mnb = MultinomialNB()

from sklearn import metrics
from sklearn.cross_validation import cross_val_score
scores = cross_val_score(mnb, Y, chk, cv=10, scoring='accuracy')

我收到此错误 - bad input shape (64, 16)

这是标签和输入的形状

dataLabel.shape = 72 chk.shape = 72,16

为什么分类器不接受 onehotencoded 特征?

编辑 - 整个堆栈跟踪代码

/root/anaconda2/lib/python2.7/site-packages/sklearn/utils /validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn /cross_validation.py", line 1433, in cross_val_score
for train, test in cv)
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 800, in __call__
while self.dispatch_one_batch(iterator):
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 658, in dispatch_one_batch
self._dispatch(tasks)
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 566, in _dispatch
job = ImmediateComputeBatch(batch)
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 180, in __init__
self.results = batch()
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.py", line 72, in __call__
return [func(*args, **kwargs) for func, args, kwargs in self.items]
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/cross_validation.py", line 1531, in _fit_and_score
estimator.fit(X_train, y_train, **fit_params)
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/naive_bayes.py", line 527, in fit
X, y = check_X_y(X, y, 'csr')
 File "/root/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.py", line 515, in check_X_y
y = column_or_1d(y, warn=True)
  File "/root/anaconda2/lib/python2.7/site-packages/sklearn/utils/validation.py", line 551, in column_or_1d
raise ValueError("bad input shape {0}".format(shape))

ValueError: bad input shape (64, 16)

【问题讨论】:

  • 请显示整个堆栈跟踪——将其添加到问题中。
  • 我记得我对sklearn 要求将特征编码为fit 方法的输入感到非常恼火。我最终使用了 Panda 的 pd.get_dummies(df)(而不是 sklearn 提供的 OneHotEncoder),当我尝试拟合随机森林时,它起作用了。
  • @RussellRichie 我记得在某处读到不推荐使用pd.get_dummies,因为测试数据的映射方式不同
  • @gbhrea,是的,我确实必须做一些事情来将测试数据映射到相同的编码。我会给出接受的答案,看看情况如何。

标签: python pandas machine-learning scikit-learn categorical-data


【解决方案1】:

首先,您必须交换 chkY 考虑 cross_val_score 文档。接下来,您没有指定 Y 是什么,所以我希望它是一维数组。最后一个而不是单独使用,最好使用Pipeline 将所有转换器组合在一个分类器中。像这样:

from sklearn import metrics
from sklearn.cross_validation import cross_val_score
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

clf = Pipeline([
    ('transformer', OneHotEncoder()),
    ('estimator', MultinomialNB()),
])

scores = cross_val_score(clf, dataFeatures.values, Y, cv=10, scoring='accuracy')

【讨论】:

  • 哇,我的整个问题是 chk 和 Y 是错误的方式。我已经坚持了好几天了!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2012-04-20
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多