トレーニングの内容に入る前にEarly Stoppingを意識する必要があります。
Early Stoppingを使用するかどうかで準備するデータセットの扱いが変わります。
Early Stopping
学習はたくさんやれば良い結果になりますが、何事もやりすぎは問題が出てしまいます。
過学習と呼ばれますが、特定の条件に最適化しすぎてテストは結果が良いけれど実際に使ったら悪くなるという状態。
人間で言うと「特定の人にはすごくかわいがられるけど、それ以外から嫌われる」みたいな感じ。
それでよければいいけれど、機械学習は汎用性を求められる(どんな状態でもある程度の結果が出る)ことが多いので、特別な状態に限定されるのかなと思ってます。
Early Stoppingを使用する場合は学習データを2つに分割する必要があります。
1つ目は、LightGBMが学習するためのデータ、2つ目はEarly Stoppingを使用するかどうか判断するためのデータ。
2つ目のデータはバリデーションデータと呼ばれます。
動作としては、1つ目の学習データを使ってLightGBMが学習を行います。その後、バリデーションデータを使って精度を確認し精度の向上がみられなかったりした場合に「学習を停止する」という動作を行います。
これにより、学習回数を抑えて過学習を抑えます。
トレーニング
ドキュメントではトレーニングのサンプルコードは以下のようになってます。
Early Stoppingとして「num_round」に10を指定しています。10回学習して精度が向上しなければ学習を停止するという指定になります。
また、Early Stoppingを使用するためにバリデーションデータを「valid_sets」に指定しています。
num_round = 10
bst = lgb.train(param, train_data, num_round, valid_sets=[validation_data])
Early Stoppingの指定方法が今後変わるようなのでこの設定は非推奨となっています。
新しい方式としてはcallback関数で指定する形になります。
bst = lgb.train(param, train_data, valid_sets=[validation_data],callbacks=[lgb.early_stopping(stopping_rounds=10, verbose=True))