satopoooonのブログ

自分向けの備忘録

kaggleに挑戦その5 過学習、学習不足の可視化

学習曲線

データセットに対してモデルが複雑すぎる場合、過学習する傾向があり汎化性能が落ちてしまう。
トレーニングデータをさらに集めると、過学習は抑えることができるが、データをさらに集めることはコストが非常に高い。
また、実はこれ以上データを集めても無駄ということもある。 そんなとき、学習曲線を使うことでデータを集めることに価値があるか、検証できる。

f:id:satopoooon:20171226232023j:plain
有名な過学習、学習不足の絵ですね。

過学習と、学習不足が丁度良いバランスの場合、
トレーニングデータセットから作成したモデルの精度と、
そのデータを(例えば)K分割交差検証で評価したモデルの精度が同程度になります。

逆にすでに同程度の場合、これ以上サンプル数を増やしても精度は上がらないですね。
精度を上げたい場合は、モデル自体を変えた方が良いことになります。

今回作成したモデルはどうなんでしょう、、、

import matplotlib.pyplot as plt
from sklearn.learning_curve import learning_curve

train_sizes,train_scores,valid_scores = learning_curve(estimator=forest,
                            X=X_train,
                            y=y_train,
                            train_sizes=np.linspace(0.1,1.0,10),
                            cv=10,
                            n_jobs=1)

train_mean = np.mean(train_scores,axis = 1)
test_mean = np.mean(valid_scores,axis=1)

plt.plot(train_sizes,train_mean)
plt.plot(train_sizes,test_mean)
plt.show()

f:id:satopoooon:20171226233839p:plain
過学習してますねー。
データ数増やしていけば、過学習を抑えることができるってことがわかります。
実際は、データ数を増やすことはできないので、
モデルの複雑さを抑えて汎化性能を上げる必要があるかと思います。