0

私はDecision TreeとMultinomial Naive Bayes Classifierへの入力用データを準備しようとしています。OneHotEncoded機能がClassifierへの入力時にエラーを引き起こす

これは私のデータは(パンダのデータフレーム)のように見えるものである

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()

分類器は、分類子がそれらをカテゴリではない数値として扱う必要があります。

私は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機能を受け入れませんか?

EDIT - スタック全体のトレースコード

/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)

+2

スタックトレース全体を表示してください。質問に追加してください。 – Merlin

+0

私は、 'sklearn'が必要なフィーチャを' fit'メソッドへの入力としてどのようにエンコードするかによって非常に困惑していることを思い出します。私は最終的にPandaの 'pd.get_dummies(df)'を使用しました。( 'sklearn'が提供する' OneHotEncoder'とは対照的に)、ランダムなフォレストに合うように試みたときに働きました。 –

+1

@RussellRichieテストデータが異なってマップされるので、 'pd.get_dummies'を使うのはお勧めできません。 – gbhrea

答えて

1

まず、あなたはchkを交換し、Ycross_val_scoreドキュメントを考慮する必要があります。次に、Yが指定されていないので、1d配列であることを願っています。そして最後に別々に使用する代わりに、Pipelineを使用して1つの分類器内のすべてのトランスを組み合わせる方が良いでしょう。このように:

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') 
+0

うわー、私の全面的な問題は、chkとYが間違った方法だった..私はこれに数日間執着してきた!ありがとうございます – gbhrea

+0

@gbhreaようこそ! – frist

関連する問題