Функции OneHotEncoded, вызывающие ошибку при вводе в классификатор

Я пытаюсь подготовить данные для ввода в дерево решений и полиномиальный наивный байесовский классификатор.

Вот как выглядят мои данные (фреймворк pandas)

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 с использованием dataLabel.ravel()

Мне нужно дискретизировать функции, чтобы классификаторы рассматривали их как категориальные, а не числовые.

Я пытаюсь сделать это с помощью 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

Почему классификатор не принимает функции с одним горячим кодом?

ИЗМЕНИТЬ - код трассировки всего стека

/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: неправильная форма ввода (64, 16)


person gbhrea    schedule 25.07.2016    source источник
comment
Покажите, пожалуйста, всю трассировку стека - добавьте ее к вопросу.   -  person Merlin    schedule 25.07.2016
comment
Я помню, как меня очень раздражало, как sklearn требуемые функции должны быть закодированы в качестве входных данных для fit метода. В конечном итоге я использовал pd.get_dummies(df) Panda (в отличие от OneHotEncoder, предоставленного sklearn), и это сработало, когда я попытался подогнать случайный лес.   -  person Russell Richie    schedule 26.07.2016
comment
@RussellRichie Я помню, что где-то читал, что использовать pd.get_dummies не рекомендуется, потому что тестовые данные будут отображаться по-другому   -  person gbhrea    schedule 26.07.2016
comment
@gbhrea, да, мне пришлось немного поиграть, чтобы сопоставить тестовые данные с той же кодировкой. Я попробую принять принятый ответ и посмотрю, как это пойдет.   -  person Russell Richie    schedule 26.07.2016


Ответы (1)


Во-первых, вы должны поменять местами chk и Y рассмотреть cross_val_score документация. Далее, вы не указали, что такое Y, поэтому я надеюсь, что это 1d-массив. И последнее, вместо использования по отдельности, лучше объединить все трансформаторы в одном классификаторе с помощью 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')
person frist    schedule 26.07.2016
comment
Ух ты, вся моя проблема заключалась в том, что chk и Y были неправильными ... Я застрял на этом несколько дней! Спасибо - person gbhrea; 26.07.2016