二項分類を行いたい20000のトレーニング例のデータセットがあります。問題は、データセットが大幅に不均衡であり、ポジティブクラスに含まれるのは約1000個だけであるということです。予測を行うためにxgboost(R)を使用しようとしています。
私はオーバーサンプリングとアンダーサンプリングを試しましたが、何をしても、どういうわけか、予測によって常にすべてが多数派クラスとして分類されます。
Xgboostでパラメーターを調整する方法についてこの記事を読んでみました。 https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/
ただし、データセットの不均衡に役立つパラメータについてのみ言及し、それらを調整する方法については言及していません。
不均衡なデータセットを処理するためにxgboostの学習パラメーターを調整する方法、およびそのような場合の検証セットを生成する方法について、誰かがアドバイスをいただければ幸いです。
XGBoost
のドキュメントによると、scale_pos_weight
パラメータは、不均衡なクラスを処理するパラメータです。ドキュメントを参照してください ここ
scale_pos_weight、[default = 1]正と負の重みのバランスを制御します。これは不均衡なクラスに役立ちます。考慮すべき一般的な値:sum(負の場合)/ sum(正の場合)詳細については、パラメーターの調整を参照してください。例については、Higgs Kaggleコンペティションデモも参照してください:R、py1、py2、py3
Rでこのようなことを試してください
bstSparse <- xgboost(data =xgbTrain , max_depth = 4, eta = 0.2, nthread = 2, nrounds = 200 ,
eval_metric = "auc" , scale_pos_weight = 48, colsample_bytree = 0.7,
gamma = 2.5,
eval_metric = "logloss",
objective = "binary:logistic")
ここで、scale_pos_weightは不均衡です。私のベースライン発生率は約4%です。ハイパーパラメータ最適化を使用します。 scale_pos_weightでも試すことができます
ニューラルネットワークで役立つ手法は、観測にノイズを導入することです。 Rには、これを行うための「ジッター」関数があります。 1000のまれなケースでは、機能に少量のジッターを適用するだけで、さらに1000のケースが得られます。コードを再度実行して、予測がポジティブクラスのいずれかを取得しているかどうかを確認します。さらにケースを追加したり、ジッターの量を変えたりして実験することができます。 HTH、cousin_pete