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_train
にy_train
のデータが含まれていたことにある。
考察
y_train
のデータを持ってさえいれば、それだけで推定ができる。そんなモデルでy_train
がなければ、他のパラメータがどんな数値であろうと推定結果が同じ数値になってしまう。
トレーニングデータに間違えて答えを教えてしまうなんて、、、こんな恥ずかしいことはない。
適正な loss 関数をわかっていない
はじめての機械学習で回帰問題に取り組んでいる時、ネットの海に浮かんでいるコード達を参考にしていたところ、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)
Pandas の CSV ロードでUnnamed: 0
という謎の行が追加されてしまう
前処理をしたデータを CSV ファイルで保存し、それをロードして学習させていたのだが、(それまでは正常動作していたが)ある時から急にUnnamed: 0
という名前の行が追加され、データリーケージのような挙動をするようになっていた。
前処理プログラム内でのデータを目視確認しても、該当する行は存在しないため、謎であった。
以下のように、インデックスの行を指定することで無事解決することができた。
# 変更前
df = pd.read_csv('dataset.csv')
# 変更後
df = pd.read_csv('dataset.csv', index_col=0)