前提・実現したいこと
データ分析において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