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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

7747閲覧

Pythonでの機械学習のf1_score部分でのエラーについて

gymgym

総合スコア97

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/05/01 03:46

Python

1feature_df01 = get_train("OpenBCI-RAW-ita01.txt", 6.67, list01) 2feature_df02 = get_train("OpenBCI-RAW-ita02.txt", 7.14, list02) 3feature_df03 = get_train("OpenBCI-RAW-ita03.txt", 7.52, list03) 4 5train_feature = pd.concat([feature_df01, feature_df02]) 6 7labels_t = feature_df03['labels'] 8labels_t = np.array(labels_t.values.flatten()) 9del feature_df03['labels'] 10 11labels = train_feature['labels'] 12labels = np.array(labels.values.flatten()) 13del train_feature['labels'] 14 15y_train = labels[:90] 16y_test = labels_t 17 18pca = PCA(n_components=50) 19pca.fit(train_feature) 20X_train = pca.transform(train_feature) 21 22train_feature = pd.DataFrame(train_feature) 23 24lda = LDA(n_components=2) 25lda.fit(X_train, y_train) 26X_train = lda.transform(X_train) 27 28X_test = np.empty((45, 2), dtype='float32') 29 30for i in range(1, 45): 31 X = feature_df03.ix[i, :] 32 X = X.reshape(1, -1) 33 X = pca.transform(X) 34 X = lda.transform(X) 35 36 np.append(X_test, X) 37 38X_test1 = X_test[:15, :] 39y_test1 = y_test[:15] 40X_test2 = X_test[15:30, :] 41y_test2 = y_test[15:30] 42X_test3 = X_test[30:45, :] 43y_test3 = y_test[30:45] 44 45print(X_test1.shape,X_test2.shape,X_test3.shape) 46print(len(y_test1),len(y_test2),len(y_test3)) 47forest = RandomForestClassifier(n_estimators=300, min_samples_split=2, max_depth=3, max_features='auto') 48forest.fit(X_train, y_train) 49 50w1 = f1_score(y_test1, forest.predict(X_test1),average = 'micro') 51 52w2 = f1_score(y_test2, forest.predict(X_test2),average = 'micro') 53 54w3 = f1_score(y_test3, forest.predict(X_test3),average = 'micro') 55 56print(w1,w2,w3)

以上のようなコードを書いたのですが、

Traceback (most recent call last): File "forest_pca1.4.py", line 376, in <module> w1 = f1_score(y_test1, forest.predict(X_test1),average = 'micro') File "/Users/beta/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/sklearn/ensemble/forest.py", line 538, in predict proba = self.predict_proba(X) File "/Users/beta/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/sklearn/ensemble/forest.py", line 578, in predict_proba X = self._validate_X_predict(X) File "/Users/beta/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/sklearn/ensemble/forest.py", line 357, in _validate_X_predict return self.estimators_[0]._validate_X_predict(X, check_input=True) File "/Users/beta/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/sklearn/tree/tree.py", line 373, in _validate_X_predict X = check_array(X, dtype=DTYPE, accept_sparse="csr") File "/Users/beta/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/sklearn/utils/validation.py", line 453, in check_array _assert_all_finite(array) File "/Users/beta/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/sklearn/utils/validation.py", line 44, in _assert_all_finite " or a value too large for %r." % X.dtype) ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

以上のようなエラーが出たり出なかったりします。
どのようなことが原因なのでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

X_test = np.empty((45, 2), dtype='float32')

せめてnp.zerosとかだったりしませんか。

投稿2018/05/01 10:36

mkgrei

総合スコア8560

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

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

hayataka2049

2018/05/01 10:44

ほんとだ、nanが入るときがありますねぇ(まあ未初期化か・・・
mkgrei

2018/05/01 10:59

不定ですので、実装次第ということですね。 そしてその後にその部分に値を代入することなく放置しているように見えます。 それ以前にX_trainとX_testの準備の仕方に問題があるように思うのですが… https://www.kaggle.com/hakeem/stacked-then-averaged-models-0-5697 別にこちらのコードが良いというわけではありませんが、普通次元削減で特徴量を用意する場合、複数の手法を並列して実行して(同じXに対して実行して)、それを合わせてXとするのが一般的だと思います。 ですので、とりあえず目前のエラーを解決してもモデルがどうなるのかは…
hayataka2049

2018/05/01 11:11

>それを合わせてXとする このへんは次元削減の目的や後ろの処理にも関わってくるので一概には言えない気が。生データはでかくて手に負えないから、とりあえずSVDで次元落としてからいろいろ考えよう! とかあると思うので・・・ ちなみに私の疑問ですけど、sklearnでやるとしたら、クラスとしてまとまってるのあります? 軽くググったらFeatureUnionが出てきましたけど、これですか?
hayataka2049

2018/05/01 11:27 編集

FeatureUnionでした(自己解決)。なるほど、こんなのもあったのかぁ・・・
mkgrei

2018/05/01 11:33

直列のPipelineと並列のFeatureUnionですね。 意図しているかどうかはわからないですが、今PCAの結果をLDAに入れているので、なんだか違和感が… そんでもって、X_testの後ろにappendしているので、特徴量が反映されていない可能性も…
hayataka2049

2018/05/01 11:39 編集

そもそも、np.appendはin-placeで処理しないので(以下略)ってことですね。紛らわしいと言えば紛らわしいとは思いますけど
guest

0

tracebackによるとforest.predict(X_test1)でX_test1の値がヘンなので、バリデーションで落ちています。X_testを確認してください。

追記

落ち着いて読み返してみたら、

python

1X_test = np.empty((45, 2), dtype='float32') # 未初期化なのでNanなどが入るときがある。文句は言えない 2 3for i in range(1, 45): 4 X = feature_df03.ix[i, :] 5 X = X.reshape(1, -1) 6 X = pca.transform(X) 7 X = lda.transform(X) 8 9 np.append(X_test, X) # 返り値を捨ててるので単に無意味(捨ててなくても無意味そうだけど・・・) 10 11# X_testは未初期化のまま 12# nanなどが入ったまま分ける! 13X_test1 = X_test[:15, :] 14y_test1 = y_test[:15] 15X_test2 = X_test[15:30, :] 16y_test2 = y_test[15:30] 17X_test3 = X_test[30:45, :] 18y_test3 = y_test[30:45]

やりたいことは想像できなくはありませんが、動きません。はい。

リストと同じ感覚で、空リストを作る→appendしていくという処理を書きたかったのですよね? 残念ながら、np.empty()はshapeだけ与えた引数通り、中身はまったく不定の配列を作ってしまいます。当然nan等も含まれる場合があります。そしてnp.append()は配列に値をstackした結果を返し、元の配列は変更しません。

np.append(X_test, X)では、feature_df03.ixから読み込んだデータを次元削減したものをX_testに代入したいんですよね? 恐らくX_test[i-1] = Xとすれば(決してうまい処理ではないけど)意図した通りの挙動になると思います。
うまい処理としては、これくらいで良いと思います。

python

1X = np.array(feature_df03[1:45]) 2X_test = lda.transform(pca.transform(X))

そのままだと動かないかもしれません。適宜書き換えてください・・・。

投稿2018/05/01 06:59

編集2018/05/01 16:48
hayataka2049

総合スコア30933

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

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

0

エラーについて

NaN, infinity or a value too large for dtype('float32')

float32の数値で計算エラーを起こしています。
NaNは非数(not a number)、infinityは無限を意味しています。

あるいは32ビットの浮動小数点数で桁の上限を超えています。

Python

1File "forest_pca1.4.py", line 376, in <module> 2 w1 = f1_score(y_test1, forest.predict(X_test1),average = 'micro')

ここでエラーですね。
スタックされたエラーを順に追っていくと、推測ですが
配列X_test1がsklearnの処理でおかしな値になっているんでしょうね。

解決策(?)

Python

1X_test = np.empty((45, 2), dtype='float32')

ここで

dtype='float64'

と変えるとどうなるかですね。

あとはX_testは、NaNかinfinityかfloat64で受けるべき浮動小数データなのか
チェックする処理を追加してください。

もし エラーが発生したら、X_testの要素を文字列strに型変換し
str == ”NaN” であれば
printさせて、処理を中断させる

投稿2018/05/01 04:50

kawakawa2018

総合スコア1195

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

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

0

エラーメッセージが意味することは、f1_scoreの計算に適していないデータがインプットに含まれているというものです。したがって、y_test1とforest.predict(X_test1)を調べて、nanやinfやあり得ないような大きな値の有無を確認してはいかがでしょうか。

投稿2018/05/01 04:37

R.Shigemori

総合スコア3376

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問