質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.32%

テキスト分類のValueError: dimension mismatchの対処で困っています。。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,756

Ya.Tatsuro

score 10

実現したいこと

テキストデータ(仕事内容(20文字程度))をjanomeで形態素解析し、CountVectorizerで配列化し、sklearn.naive_bayes(MultinomialNB)で学習させ、仕事内容から仕事分類を予測したいです。
※説明変数は仕事内容、目的変数は仕事分類、環境はpython3.6

困っていること

学習及び検証までは実施できましたが、この学習済みモデルに未知データ(学習、検証以外のデータ)を与えて、検証でやった正答率が正しいかを確認したいと思っていますが、以下エラーになり対処が分かりません。。(p_-)皆さんに教えていただければ幸いです。どうぞよろしくお願いします。m(__)m

コード

from janome.tokenizer import Tokenizer

documents = []   # 形態素用の配列を用意
t = Tokenizer()
y = []           # クラスラベル用の配列を用意
with open('./test.csv') as f:
    reader = csv.reader(f)
    next(reader) 
    for columns in reader:
        y.append(columns[1]) # 仕事分類をクラスラベルとしてまとめる
        document = [] # 1行分の仮の配列を用意
            for token in t.tokenize(columns[0]):
            document.append(token.surface) # 仮の配列に形態素を追加
        documents.append(' '.join(document))

import numpy as np
from sklearn.feature_extraction.text $import CountVectorizer

CountVect = CountVectorizer(min_df=1)
X = CountVect.fit_transform(documents)

from sklearn.externals import joblib
clf2 = joblib.load('clf.pkl') 
clf2.predict(X)
print(clf2.score(X, y))

エラー内容

ValueError                                Traceback (most recent call last)
<ipython-input-38-8c6bc2aa9621> in <module>()
      4 
      5 #■学習済みモデルから、未知データを予測する
----> 6 clf2.predict(X)
      7 print(clf2.score(X, y))
      8 

C:\Users\XXXX\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\naive_bayes.py in predict(self, X)
     63             Predicted target values for X
     64         """
---> 65         jll = self._joint_log_likelihood(X)
     66         return self.classes_[np.argmax(jll, axis=1)]
     67 

C:\Users\XXXX\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\naive_bayes.py in _joint_log_likelihood(self, X)
    705 
    706         X = check_array(X, accept_sparse='csr')
--> 707         return (safe_sparse_dot(X, self.feature_log_prob_.T) +
    708                 self.class_log_prior_)
    709 

C:\Users\XXXX\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\utils\extmath.py in safe_sparse_dot(a, b, dense_output)
    182     """
    183     if issparse(a) or issparse(b):
--> 184         ret = a * b
    185         if dense_output and hasattr(ret, "toarray"):
    186             ret = ret.toarray()

C:\Users\XXXX\AppData\Local\Continuum\Anaconda3\lib\site-packages\scipy\sparse\base.py in __mul__(self, other)
    403 
    404             if other.shape[0] != self.shape[1]:
--> 405                 raise ValueError('dimension mismatch')
    406 
    407             result = self._mul_multivector(np.asarray(other))

ValueError: dimension mismatch
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shimizukawa

    2017/07/22 09:00

    ソースコードのインデントが消滅していてコードが非常に読みづらいので、次のページを参考にして、ソースコード部分を整形してください。 https://teratail.com/help/question-tips#questionTips3-5-1

    キャンセル

  • Ya.Tatsuro

    2017/07/22 13:32 編集

    見ていただきありがとうございます‼
    すみませんでした、スペース入れても変わらなかったので、$を入れて分かるようにしてみました。どうぞ、よろしいお願いしますm(_ _)m

    キャンセル

  • shimizukawa

    2017/07/22 14:52

    いやそうじゃない。リンク先読みました? "teratailではソースコードをシンタックスハイライトすることができます。" の部分です

    キャンセル

  • Ya.Tatsuro

    2017/07/23 21:22

    誤っており、また遅くなり大変すみませんでした。再度ご確認頂けましたらと思います。

    キャンセル

回答 1

checkベストアンサー

0

学習済みモデルと与えてる未知データのベクトル行列の次元数が違うからValueErrorになってるんじゃないですかね
学習済みモデルをoutputして他で適用するのは自分は試していないので正しいかどうかはなんとも言えませんが

print(X.shape)


上記のようなコードで次元数の確認を行うことをオススメします
学習済みモデルを作成した際の次元数はどんなものだったか確認して、その次元数に合うようにすれば、エラーは消えると思いますが

あと蛇足ですがコード大変読みにくいので他の方にいただいたアドバイスはしっかり目を通すべきかと


追記

回答したあとで見つけましたが、こちらの質問が今回の本当に知りたい回答に近いと思いました。
機械学習の勉強を初めてまだ2ヶ月程度の自分はまだ当たっていませんが、私自身もいずれ当たる課題だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/23 21:41

    回答ありがとうございます!! またリンクも参考になりました。
    shapeで調べてみたところ、ご指摘の通り、学習済みモデルの次元数と未次データのベクトル配列の次元数が異なっていました。今回のやりたいことの想定としては、一度学習したモデルで実装させ、定期的にくる未知データに対して分類させたかったのです。次元数が異なることまでは分かったのですが、未知データに対し、学習時の次元数にどのように合わせたら良いのかが分かりません。自分でも調べるとともに、もし追加で参考になりそうな情報がありましたら教えて頂けましたらと思います。よろしくお願い申し上げます。

    キャンセル

  • 2017/07/24 01:05

    回答内容がある程度あっていたようで何よりでした。
    ベクトルの次元数だけ合わせるなら、次元削減によって元データの次元数と同じ次元数にしてあげれば解決だけはします。ベクトルの次元削減については、PCAやSVDなどscikit-learn内に関数が用意されているので、そこらへんを使えばさほど苦労はしないかと思います。しかし、それが果たして本当に正しいデータや解析になるのかと言えば違うという風にも感じます。
    自分もテキストのベクトル化を行う際に、今回と同じように次元数の問題に当たりました。その時は一旦未知データも含めて辞書がわりに.fit_transformさせ、その後学習用データと与える未知データのベクトル化を.transformで行いました。ただこれは、与えるデータが一応手元にあるからこそできることになります。実運用ではできないでしょうね。リンクした質問にあったような辞書を作るというのとは少し違いますが、ニュアンスとしてはほぼほぼ同じになると思います。
    実際に未知データを与えた時にどうするかは、一旦上記したように次元数だけ合わせて判定を行い、その後判定が間違ってしたら正解ラベルデータを与えて再学習という風な形が取れればいいのかなぁという風にも感じています。一旦outputしたモデルを用いて追加データ分を再学習ということがはたしてできるかどうかはちょっと試してみないとわからないかなという感じです。
    リンクした質問先にもありましたが単語の正規化ということに関しては[こちら](http://qiita.com/Hironsan/items/2466fe0f344115aff177)が参考になると考えています。リンク先はテキストの前処理についてですが、個人的に参考になった記事なので。
    単語の正規化を行うことによってかなり単語数は限られてくるとは思いますが、こちらにも辞書のようなものが結局必要になるのかなあと考えています。精度を上げるために、単語の正規化を行うことは今絶賛お試し中なので、私自身もあんまり突っ込んだことは言い切れません。私が行なっているのは、tweetの分類なので表記揺れがとても多くてなかなか苦労する部分はあります。


    ちょっと長々してしまってしっかり答えられたか怪しいですが一応こんな感じですかね。私よりもっとよくわかってる方々がここには多いので、もっと具体的な回答をできる人がいると思うので、こういう回答でいいのか不安ではありますが参考までに

    キャンセル

  • 2017/07/27 07:37

    遅くなりましたが、回答ありがとうございます。確かに未知データ含めて学習させて次元を合わせて、その後切り出してやるやり方もありますね。単語の正規化も役に立ちそうなんですね。してみます。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る