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

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

新規登録して質問してみよう
ただいま回答率
85.50%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

12817閲覧

クロスバリデーションができない:エラーメッセージの解決法を教えてください

trafalbad

総合スコア303

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/04/25 05:04

編集2022/01/12 10:55

ナイーブベイズ分類器でクロスバリデーションをしようと思っていますが、下記エラーが出てきてしまいました。

原因を教えていただけないでしょうか?よろしくおねがします

clf = MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)#ベイズの多項分布 x_train=xx.as_matrix().data.shape >>>(7484, 2838) y_train=Y.as_matrix().T.data.shape >>>(7484, 1) from sklearn.model_selection import cross_val_score cross_val_score(clf, x_train, y_train, cv=10) Cannot have number of splits n_splits=10 greater than the number of samples: 2.#エラーメッセージ

質問追記
クロスバリデーションのためにサンプル数が足らないとのエラーメッセージが出ていますが、サンプル数は2000ほどあります。
行が単語の塊で、列がmecabで分けた単語です。特徴ベクトル抽出にCountVectorizer、TfidfVectorizerなどのベクタライザは使用していません。普通にトレーニングセットで学習&テストセットで予測では確率はでますが、クロスバリデーションをしようとするとこのように上手くいきません。

サンプル数が十分にあるのにこのようなエラーが出てしまうのは、行列の配列など、サンプル数を的確に処理できる形にできてないなどの「サンプル数が足りない」とは別の問題があると考えられるのですがこの推測は正しいでしょうか?

質問追記2

cv=2の時のエラーメッセージは
All the n_groups for individual classes are less than n_splits=2.

です。その前に.data.shapeでトレーニングセットとテストセットの値を変形する前は逆に配列が多すぎるとでてしまいます。

x_train=xx.as_matrix() y_train=Y.as_matrix().T from sklearn.model_selection import cross_val_score cross_val_score(clf, x_train, y_train, cv=10) too many indices for array#エラーメッセージ

トレーニングデータの概要は下記の図のようになっています(見える部分の文字は特定されない情報です。)
行は単語の塊ですがインデックス表記になっています。列が単語で行の単語の塊に該当する部分の値が1になっています。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Cannot have number of splits n_splits=10 greater than the number of samples: 2.#エラーメッセージ

分割数がn_splits = 10でサンプル数より大きくなることはありません:2

クロスバリデーションの分割数と比較しサンプル数(入力データ)が少なすぎる時に発生するエラーです。
分割数(cv=10)の値を小さくするか、サンプル数を増やしてください。

公式ドキュメントのチャートシートでは、最低50サンプルから始めてくださいとなってます。


追加質問への回答です。

サンプル数が十分にあるのにこのようなエラーが出てしまうのは、行列の配列など、サンプル数を的確に処理できる形にできてないなどの「サンプル数が足りない」とは別の問題があると考えられるのですがこの推測は正しいでしょうか?

あってると思います。ベクタライザを使用していないとのことなので、

行が単語の塊で、列がmecabで分けた単語です。

データを見ないと推測でしかいえませんが、一番あやしいポイントは「列がmecabで分けた単語」です。
分けた単語をファイルに出力して、クロスバリデーション分割数でファイルを分割しラベルのパターン数分*2以上の行列になっているか確認してみてください。

□追加確認
一番重要なポイントを確認するの忘れてました。
cross_val_score関数のパラメータをcv=2に設定しても同じエラーメッセージは発生しますか?

投稿2017/04/25 06:33

編集2017/04/25 15:23
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trafalbad

2017/04/25 07:45

ベイズで単語を予測するために単語群を学習させているのですが、約1000語くらいです。 これはクロスバリデーションとしては不十分なのでしょうか?一般的にサンプル数はいくつ用いるのが普通なのでしょうか?
umyu

2017/04/25 12:35 編集

追加質問は質問(情報)は質問欄に記載してください。 >約1000語 十分かと。 文章の特徴ベクトルを変換(fit_transform)する時に使用したベクタライザ(CountVectorizer、TfidfVectorizer)に対して、get_feature_names()で学習に使用した特徴を取得できます。 念のため、確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問