ys memos

Blog

Deep Learningのやらかし集


tensorflow

2020/07/20

機械学習初心者の私が、やってしまったミスを集めておく。 いつか自分の助けになることを期待しているのと、 同じ境遇の人の助けになれば嬉しい。


ボストンハウシングデータセットのような推定問題を解いている際、Sequential()モデルを使っており、どうしてもどうしても R2 値が上がらなかった。 3時間くらい悩んだ結果、標準化すると良いらしく、それによってR2: 約4.5 -> 約7.8まで向上した。 DataFrame型のデータであれば、以下のような処理でできるよ!

def standardization(dataset_df):
	for key in dataset_df.keys():
		s = dataset_df[key]
		dataset_df[key = (s - s.min()) / (s.max() - s.min())
	dataset_df = dataset_df.fillna(0)
	return np.array(dataset_df, dtype=float)


トレーニングしたモデルを推定器で推定したところ、推定結果が全て同じ数値になってしまった。 この原因は、x_trainy_trainのデータが含まれていたことにある。


y_trainのデータを持ってさえいれば、それだけで推定ができる。そんなモデルでy_trainがなければ、他のパラメータがどんな数値であろうと推定結果が同じ数値になってしまう。 トレーニングデータに間違えて答えを教えてしまうなんて、、、こんな恥ずかしいことはない。


はじめての機械学習で回帰問題に取り組んでいる時、ネットの海に浮かんでいるコード達を参考にしていたところ、model::fit()をしても全然よくならなかった。

その原因として、loss 関数は複数種の API が提供されているのだが、回帰問題を解いているときにそれらを知らずに、分類問題用のクロスエントロピーという loss 関数を使ってしまっていた。 その結果、何度試しても学習できずに時間を浪費した。以下のように二乗平均誤差を用いると良い。

model.compile(
	optimizer='adam',
	loss='mean_squared_error', # 'mse'でも可
	metrics=['mae', 'mse']
)

深層学習を全く知らなかった時は、「機械学習はとりあえずデータを突っ込めばイケル!」と思い込んでいた。 しかし、実際に学習をしてみたところ、細かいチューニングが必要だということに気付かされた。 特に、回帰問題における相関を目視確認し、手動でデータを除去するのが推定精度を高めるコツだということがわかった。 pandasパッケージのDataFrame型であれば、相関を算出するメソッドが提供されている。以下のコードで簡単に確認することができる。

import pandas as pd

df = pd.read_csv('dataset.csv')

df_corr = df.corr()
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

df_corr = df_corr['ans'].sort_values()

for key, val in df_corr.items():
	print(key, val)

前処理をしたデータを CSV ファイルで保存し、それをロードして学習させていたのだが、(それまでは正常動作していたが)ある時から急にUnnamed: 0という名前の行が追加され、データリーケージのような挙動をするようになっていた。 前処理プログラム内でのデータを目視確認しても、該当する行は存在しないため、謎であった。 以下のように、インデックスの行を指定することで無事解決することができた。

# 変更前
df = pd.read_csv('dataset.csv')

# 変更後
df = pd.read_csv('dataset.csv', index_col=0)

関連タグを探す