非常に不均衡なデータセットでLightGBMを使用して分類器を構築しようとしています。不均衡は比率にあります97:3
、つまり:
Class
0 0.970691
1 0.029309
私が使用したパラメータとトレーニングのコードは次のとおりです。
lgb_params = {
'boosting_type': 'gbdt',
'objective': 'binary',
'metric':'auc',
'learning_rate': 0.1,
'is_unbalance': 'true', #because training data is unbalance (replaced with scale_pos_weight)
'num_leaves': 31, # we should let it be smaller than 2^(max_depth)
'max_depth': 6, # -1 means no limit
'subsample' : 0.78
}
# Cross-validate
cv_results = lgb.cv(lgb_params, dtrain, num_boost_round=1500, nfold=10,
verbose_eval=10, early_stopping_rounds=40)
nround = cv_results['auc-mean'].index(np.max(cv_results['auc-mean']))
print(nround)
model = lgb.train(lgb_params, dtrain, num_boost_round=nround)
preds = model.predict(test_feats)
preds = [1 if x >= 0.5 else 0 for x in preds]
私はCVを実行して、最高のモデルと最高のラウンドを取得しました。検証セットでCVと同様のスコアで0.994AUCを取得しました。
しかし、テストセットで予測していると、非常に悪い結果が得られます。列車セットは完全にサンプリングされていると確信しています。
どのパラメータを調整する必要がありますか?問題の理由は何ですか。最高クラスが削減されるようにデータセットをリサンプリングする必要があります。
問題は、データセット内の極端なクラスの不均衡にもかかわらず、で最終的なハード分類を決定するときに、「デフォルト」のしきい値0.5を使用していることです。
preds = [1 if x >= 0.5 else 0 for x in preds]
これはnotここでは当てはまらないはずです。
これはかなり大きなトピックであり、独自の調査を行うことを強くお勧めします(しきい値または確率の不均衡なデータをカットオフをグーグルで検索してみてください))、しかしここにあなたが始めるためのいくつかの指針があります...
相互検証済み (強調を追加)の関連する回答から:
予測を行うには、インテリジェントにしきい値処理する必要があることを忘れないでください。モデルの確率が0.5より大きい場合、1を予測することが常に最善であるとは限りません。別のしきい値の方が良い場合があります。この目的のために、デフォルトの確率しきい値での予測成功だけでなく、分類器の受信者動作特性(ROC)曲線を調べる必要があります。
関連する学術論文から、 不均衡な分類で最良の分類しきい値を見つける :
2.2。テストセットの分類しきい値を設定する方法
予測結果は、最終的に予測確率に従って決定されます。通常、しきい値は0.5に設定されます。予測確率が0.5を超える場合、サンプルは正であると予測されます。それ以外の場合は、負です。ただし、0.5は、一部のケース、特に不均衡なデータセットには理想的ではありません。
(強く推奨される)Applied Predictive Modelingブログからの投稿 クラスの不均衡に対する確率しきい値の最適化 も関連しています。
上記のすべてからレッスンを持ち帰ります。AUCで十分なことはめったにありませんが、ROC曲線自体が親友であることがよくあります...
分類プロセスにおけるしきい値自体の役割に関するより一般的なレベル(少なくとも私の経験によれば、多くの実践者が間違っている)については、 分類確率しきい値 スレッド(および提供されている)も確認してください。リンク)Cross Validated;キーポイント:
新しいサンプルの各クラスの確率を出力すると、演習の統計コンポーネントが終了します。新しい観測値を1対0として分類するしきい値を選択することは、統計の一部ではなくなりました。これはdecisionコンポーネントの一部です。