~ scale_pos_weightってなに? 実例つきでやさしく解説 ~
最近は株やFXの予測にAI(機械学習)を使う人が増えています。
でも、初心者が一番最初にハマるポイントが何か知っていますか?
それはズバリ 「データの偏り」 です。
📊 どういう偏りがあるの?
例えばあなたが、
「5分足の9本後(つまり45分後)に +1.5%以上 上昇するタイミングを見つけたい!」
と思ってデータを作ったとします。
このとき、実際にデータを見てみると
状態 | 件数 |
---|---|
普通の動き(+1.5%未満) | 950 |
大きく上昇(+1.5%以上) | 50 |
みたいなことがよく起こります。
つまり、あなたが本当に取りたいのは全体のたった 5% のチャンス です。
🤔 これをAIに学ばせるとどうなる?
AIは素直です。
なので「950対50か。だったら全部 ‘普通’(0)と予測しちゃえば95%当たるじゃん!」と思ってしまいます。
これでは欲しかった大きな上昇のタイミングを全然見つけられません。
こういう 「予測したいもの(今回なら+1.5%以上の上昇)が少なくて、データが偏っている状態」 を
機械学習の世界では「クラスの不均衡」と呼びます。
✅ そこで scale_pos_weight の出番
この問題を解決するために、XGBoost などではscale_pos_weight
というパラメータがあります。
簡単に言うと、
「大きく上がる場面(正例)を外したら、普通の動きを外すよりずっと重いミスだよ!」
とAIに教えてあげる設定です。
🔢 数字で見てみよう
自動設定
よく使う目安が
scale_pos_weight = 負例の数 / 正例の数
このデータだと
scale_pos_weight = 950 / 50 = 19
つまり
「正例を外したら、負例を19回外したのと同じくらい重大なミスだよ」
と学習させます。
⚠️ でも自動計算だと危険なことも
この 19
は結構大きいです。
私が実際に検証したときも、自動設定にしたら
- Precision(当たりの確率)が下がり
- 総損益もマイナス
になってしまいました。
🛠 固定値で安定するケースも多い
だから実務では
scale_pos_weight = 2
scale_pos_weight = 3
のように、固定の小さな値にする人も多いです。
実際に同じデータで scale_pos_weight=2
にしたら
設定 | Precision | 総損益 |
---|---|---|
自動(19) | 0.33 | -500,000円 |
固定(2) | 0.56 | +1,000,000円 |
と、大きく改善しました。
🖥 scale_pos_weight はどこでどう使うの?
PythonのXGBoostでは、モデルを定義するときにパラメータとして渡します。
例えばこんな感じです。
import xgboost as xgb
params = {
'objective': 'binary:logistic',
'scale_pos_weight': 2,
'max_depth': 5,
'eta': 0.1
}
model = xgb.train(params, dtrain, num_boost_round=100)
scikit-learn風の XGBClassifier でも同じで、
from xgboost import XGBClassifier
model = XGBClassifier(
scale_pos_weight=2,
max_depth=5,
learning_rate=0.1
)
model.fit(X_train, y_train)
この scale_pos_weight=2
が、まさに「正例を負例の2倍重く扱う」という指示です。
🎯 まとめ:初心者ほど scale_pos_weight を試してみよう
状況 | おすすめ設定 |
---|---|
まずモデルを試すなら | 自動(負例 ÷ 正例) |
実際に利益を狙うなら | 固定(2〜3)で調整 |
さらに追い込みたいなら | グリッドやOptunaで探索 |
scale_pos_weight
は最初はちょっと難しそうに見えますが、
要は「少ないチャンスをしっかり拾うための重み調整」です。
これを上手に設定すれば、あなたのAIが大事な5%のチャンスを見逃さずに狙い撃ちしてくれるようになります。