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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

機械学習

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

Python

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

Q&A

1回答

1236閲覧

NeuralNetworkでデータ分析をするために型をそろえたい。

kedamame

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

機械学習

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

Python

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

0グッド

1クリップ

投稿2021/02/18 02:48

前提・実現したいこと

データ分析においてkeras・tensorflowでNNによる学習を行おうとしたところ以下のようなエラーが生じました。

発生している問題・エラーメッセージ

Epoch 1/10 179/179 [==============================] - 1s 3ms/step - loss: nan - accuracy: 0.8029 - val_loss: nan - val_accuracy: 0.7466 Epoch 2/10 179/179 [==============================] - 0s 3ms/step - loss: nan - accuracy: 0.7430 - val_loss: nan - val_accuracy: 0.7466 0.7430 - val_loss: nan - val_accuracy: 0.7466 Epoch 9/10 179/179 [==============================] - 0s 3ms/step - loss: nan - accuracy: 0.7430 - val_loss: nan - val_accuracy: 0.7466 Epoch 10/10 179/179 [==============================] - 0s 3ms/step - loss: nan - accuracy: 0.7430 - val_loss: nan - val_accuracy: 0.7466 Traceback (most recent call last): File "D:\data_set\SignateBeginnerCompetition20210216\BinaryClassification.py", line 386, in <module> score = log_loss(va_y, va_pred, eps=1e-7) File "C:\Users***\anaconda3\envs\DataAnalysis\lib\site-packages\sklearn\utils\validation.py", line 72, in inner_f return f(**kwargs) File "C:\Users***\anaconda3\envs\DataAnalysis\lib\site-packages\sklearn\metrics\_classification.py", line 2186, in log_loss y_pred = check_array(y_pred, ensure_2d=False) File "C:\Users***\anaconda3\envs\DataAnalysis\lib\site-packages\sklearn\utils\validation.py", line 72, in inner_f return f(**kwargs) File "C:\Users***\anaconda3\envs\DataAnalysis\lib\site-packages\sklearn\utils\validation.py", line 644, in check_array _assert_all_finite(array, File "C:\Users***\anaconda3\envs\DataAnalysis\lib\site-packages\sklearn\utils\validation.py", line 96, in _assert_all_finite raise ValueError( ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

該当のソースコード

python3

1 2 3 4L250から学習 5それ以前は前処理 6 7 8""" 9import pandas as pd 10import numpy as np 11 12 13#学習データファイルのパス 14TrainFilePass = r'D:fullpass\train.csv' 15#テストデータファイルのパス 16TestFilePass = r'D:fullpass\test.csv' 17 18 19#目的変数のカラム 20Target = 'Y' 21# 変換するカテゴリ変数をリストに格納 22#※LavelEncoder用の機能として… 23CategoryColums = ['sex', 'workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'native-country'] 24 25train = pd.read_csv(TrainFilePass) 26train_x = train.drop([Target], axis=1) 27train_y = train[Target] 28test_x = pd.read_csv(TestFilePass) 29 30#欠損値を埋める 31train_x = train_x.fillna('FILL') 32train_y = train_y.fillna('FILL') 33test_x = test_x.fillna('FILL') 34 35# 説明用に学習データとテストデータの元の状態を保存しておく 36train_x_saved = train_x.copy() 37test_x_saved = test_x.copy() 38 39# 学習データとテストデータを返す関数 40def load_data(): 41 train_x, test_x = train_x_saved.copy(), test_x_saved.copy() 42 return train_x, test_x 43 44 45# ----------------------------------- 46# label encoding 47# ----------------------------------- 48# データの読み込み 49train_x, test_x = load_data() 50# ----------------------------------- 51from sklearn.preprocessing import LabelEncoder 52 53# カテゴリ変数をループしてlabel encoding 54for c in CategoryColums: 55 # 学習データに基づいて定義する 56 le = LabelEncoder() 57 le.fit(train_x[c]) 58 train_x[c] = le.transform(train_x[c]) 59 test_x[c] = le.transform(test_x[c]) 60 61 # 学習データを分割 62 kf = KFold(n_splits=4, shuffle=True, random_state=72) 63 for idx_1, idx_2 in kf.split(train_x): 64 # out-of-foldで各カテゴリにおける目的変数の平均を計算 65 target_mean = data_tmp.iloc[idx_1].groupby(c)['target'].mean() 66 # 変換後の値を一時配列に格納 67 tmp[idx_2] = train_x[c].iloc[idx_2].map(target_mean) 68 69 # 変換後のデータで元の変数を置換 70 train_x[c] = tmp 71 72 73"""" 74# ----------------------------------- 75# target encoding - クロスバリデーションのfoldごとの場合 76# ----------------------------------- 77# データの読み込み 78train_x, test_x = load_data() 79# ----------------------------------- 80from sklearn.model_selection import KFold 81 82# クロスバリデーションのfoldごとにtarget encodingをやり直す 83kf = KFold(n_splits=4, shuffle=True, random_state=71) 84for i, (tr_idx, va_idx) in enumerate(kf.split(train_x)): 85 86 # 学習データからバリデーションデータを分ける 87 tr_x, va_x = train_x.iloc[tr_idx].copy(), train_x.iloc[va_idx].copy() 88 tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx] 89 90 # 変数をループしてtarget encoding 91 for c in CategoryColums: 92 # 学習データ全体で各カテゴリにおけるtargetの平均を計算 93 data_tmp = pd.DataFrame({c: tr_x[c], 'target': tr_y}) 94 target_mean = data_tmp.groupby(c)['target'].mean() 95 # バリデーションデータのカテゴリを置換 96 va_x.loc[:, c] = va_x[c].map(target_mean) 97 98 # 学習データの変換後の値を格納する配列を準備 99 tmp = np.repeat(np.nan, tr_x.shape[0]) 100 kf_encoding = KFold(n_splits=4, shuffle=True, random_state=72) 101 for idx_1, idx_2 in kf_encoding.split(tr_x): 102 # out-of-foldで各カテゴリにおける目的変数の平均を計算 103 target_mean = data_tmp.iloc[idx_1].groupby(c)['target'].mean() 104 # 変換後の値を一時配列に格納 105 tmp[idx_2] = tr_x[c].iloc[idx_2].map(target_mean) 106 107 tr_x.loc[:, c] = tmp 108 109 # 必要に応じてencodeされた特徴量を保存し、あとで読み込めるようにしておく 110""" 111 112""" 113# ----------------------------------- 114# target encoding - クロスバリデーションのfoldとtarget encodingのfoldの分割を合わせる場合 115# ----------------------------------- 116# データの読み込み 117train_x, test_x = load_data() 118# ----------------------------------- 119from sklearn.model_selection import KFold 120 121# クロスバリデーションのfoldを定義 122kf = KFold(n_splits=4, shuffle=True, random_state=71) 123 124# 変数をループしてtarget encoding 125for c in CategoryColums: 126 127 128 # targetを付加 129 data_tmp = pd.DataFrame({c: train_x[c], 'target': train_y}) 130 # 変換後の値を格納する配列を準備 131 tmp = np.repeat(np.nan, train_x.shape[0]) 132 133 # 学習データからバリデーションデータを分ける 134 for i, (tr_idx, va_idx) in enumerate(kf.split(train_x)): 135 # 学習データについて、各カテゴリにおける目的変数の平均を計算 136 target_mean = data_tmp.iloc[tr_idx].groupby(c)['target'].mean() 137 # バリデーションデータについて、変換後の値を一時配列に格納 138 tmp[va_idx] = train_x[c].iloc[va_idx].map(target_mean) 139 140 # 変換後のデータで元の変数を置換 141 train_x[c] = tmp 142# ----------------------------------- 143# ニューラルネットの実装 144# ----------------------------------- 145from keras.layers import Dense, Dropout 146from keras.models import Sequential 147from sklearn.metrics import log_loss 148from sklearn.preprocessing import StandardScaler 149 150# データのスケーリング 151scaler = StandardScaler() 152tr_x = scaler.fit_transform(tr_x) 153va_x = scaler.transform(va_x) 154test_x = scaler.transform(test_x) 155 156# ニューラルネットモデルの構築 157model = Sequential() 158model.add(Dense(256, activation='relu', input_shape=(train_x.shape[1],))) 159model.add(Dropout(0.2)) 160model.add(Dense(256, activation='relu')) 161model.add(Dropout(0.2)) 162model.add(Dense(1, activation='sigmoid')) 163 164model.compile(loss='binary_crossentropy', 165 optimizer='adam', metrics=['accuracy']) 166 167# 学習の実行 168# バリデーションデータもモデルに渡し、学習の進行とともにスコアがどう変わるかモニタリングする 169batch_size = 50 170epochs = 10 171history = model.fit(tr_x, tr_y, 172 batch_size=batch_size, epochs=epochs, 173 verbose=1, validation_data=(va_x, va_y)) 174 175# バリデーションデータでのスコアの確認 176va_pred = model.predict(va_x) 177score = log_loss(va_y, va_pred, eps=1e-7) 178print(f'logloss: {score:.4f}') 179 180# 予測 181#pred = model.predict(np.array(test_x)) 182 183

試したこと

・カテゴリー変数を数値化するためにlabelencoderを実装
・keras/tansorfrowのヴァージョン確認・再インストール(conda)
・アナコンダの再インストール、環境再構築

補足情報(FW/ツールのバージョンなど)

anaconda

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

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

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

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

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

meg_

2021/02/18 08:14

va_predに NaNかinfinityが含まれていませんか?
kedamame

2021/02/18 11:45

train_xからなので、同様にencodeされているかと思われます
meg_

2021/02/18 15:05

va_predはva_xから推定したものですよね?train_xとは別物では??
kedamame

2021/02/21 04:54

# クロスバリデーションのfoldごとにtarget encodingをやり直す kf = KFold(n_splits=4, shuffle=True, random_state=71) for i, (tr_idx, va_idx) in enumerate(kf.split(train_x)): # 学習データからバリデーションデータを分ける tr_x, va_x = train_x.iloc[tr_idx].copy(), train_x.iloc[va_idx].copy() tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx] ここで定義しているかと思います。
meg_

2021/02/21 05:03 編集

>> va_predに NaNかinfinityが含まれていませんか? に対する答えが > ここで定義しているかと思います。 でしょうか? ちょっと分からないのですが、質問に対する答えはyesでしょうか?noでしょうか? 含まれていないことは確認済みですか?
kedamame

2021/02/21 05:10

ノーでした 申し訳ありません。
guest

回答1

0

おそらく、[Python][Tensorflow] lossがNaNになったときの解決策と同じトラブルなので、

tf.logの中に1e-12くらいの小さい値を加えれば解決できます。

をやってみてはいかがでしょう。

投稿2021/02/18 04:32

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問