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

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

ただいまの
回答率

90.86%

  • Python 3.x

    4806questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 109

gymgym

score 59

feature_df01 = get_train("OpenBCI-RAW-ita01.txt", 6.67, list01)
feature_df02 = get_train("OpenBCI-RAW-ita02.txt", 7.14, list02)
feature_df03 = get_train("OpenBCI-RAW-ita03.txt", 7.52, list03)

train_feature = pd.concat([feature_df01, feature_df02])

labels_t = feature_df03['labels']
labels_t = np.array(labels_t.values.flatten())
del feature_df03['labels']

labels = train_feature['labels']
labels = np.array(labels.values.flatten())
del train_feature['labels']

y_train = labels[:90]
y_test = labels_t

pca = PCA(n_components=50)
pca.fit(train_feature)
X_train = pca.transform(train_feature)

train_feature = pd.DataFrame(train_feature)

lda = LDA(n_components=2)
lda.fit(X_train, y_train)
X_train = lda.transform(X_train)

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

for i in range(1, 45):
    X = feature_df03.ix[i, :]
    X = X.reshape(1, -1)
    X = pca.transform(X)
    X = lda.transform(X)

    np.append(X_test, X)

X_test1 = X_test[:15, :]
y_test1 = y_test[:15]
X_test2 = X_test[15:30, :]
y_test2 = y_test[15:30]
X_test3 = X_test[30:45, :]
y_test3 = y_test[30:45]

print(X_test1.shape,X_test2.shape,X_test3.shape)
print(len(y_test1),len(y_test2),len(y_test3))
forest = RandomForestClassifier(n_estimators=300, min_samples_split=2, max_depth=3, max_features='auto')
forest.fit(X_train, y_train)

w1 = f1_score(y_test1, forest.predict(X_test1),average = 'micro')

w2 = f1_score(y_test2, forest.predict(X_test2),average = 'micro')

w3 = f1_score(y_test3, forest.predict(X_test3),average = 'micro')

print(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').


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/01 19:44

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

    キャンセル

  • 2018/05/01 19:59

    不定ですので、実装次第ということですね。
    そしてその後にその部分に値を代入することなく放置しているように見えます。

    それ以前にX_trainとX_testの準備の仕方に問題があるように思うのですが…
    https://www.kaggle.com/hakeem/stacked-then-averaged-models-0-5697
    別にこちらのコードが良いというわけではありませんが、普通次元削減で特徴量を用意する場合、複数の手法を並列して実行して(同じXに対して実行して)、それを合わせてXとするのが一般的だと思います。

    ですので、とりあえず目前のエラーを解決してもモデルがどうなるのかは…

    キャンセル

  • 2018/05/01 20:11

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

    キャンセル

  • 2018/05/01 20:27 編集

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

    キャンセル

  • 2018/05/01 20:33

    直列のPipelineと並列のFeatureUnionですね。

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

    キャンセル

  • 2018/05/01 20:36 編集

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

    キャンセル

+1

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

 追記

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

X_test = np.empty((45, 2), dtype='float32') # 未初期化なのでNanなどが入るときがある。文句は言えない

for i in range(1, 45):
    X = feature_df03.ix[i, :]
    X = X.reshape(1, -1)
    X = pca.transform(X)
    X = lda.transform(X)

    np.append(X_test, X) # 返り値を捨ててるので単に無意味(捨ててなくても無意味そうだけど・・・)

# X_testは未初期化のまま
# nanなどが入ったまま分ける!
X_test1 = X_test[:15, :]
y_test1 = y_test[:15]
X_test2 = X_test[15:30, :]
y_test2 = y_test[15:30]
X_test3 = X_test[30:45, :]
y_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とすれば(決してうまい処理ではないけど)意図した通りの挙動になると思います。
うまい処理としては、これくらいで良いと思います。

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


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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

 エラーについて

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

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

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

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


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

 解決策(?)

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


ここで

dtype='float64'

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Python 3.x

    4806questions

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