Day 178 — 2026-10-11 | Playground Series 実戦投入⑬ — 学習率を 0.1→0.05(本数 300→600)にしても山の位置は動かなかった(低雑音は葉63/127、小得・中雑音は葉255、18ワールド全部)。得は同じ葉で −0.2〜−1.6 と小さく、費用は 2〜3倍。「葉は lr0.1 で選び、選んだ1本だけ lr0.05 で作り直す」が最悪の損 2.57→1.52 で一番安い(×10⁻⁴)

2026-10-11 金 / Phase 6(月替わりテーマ2: Playground Series 実戦投入) コーディング→分析 18ワールド(予定40から打ち切り)・540 fit・壁時計 6,826 秒

📚 背景知識(読んでから問題へ)

今の決め方(決定15、Day175〜177 で ◎)。 乱数なし LightGBM(学習率 0.1・300本)の葉 31/63/127/255 を作り、補正CV(決定13: √(C² − A_test))が最良のものを基準にする。葉255 が最良なら葉511 を1本足して比べる。40ワールドで最悪の損 0.88(×10⁻⁴)。

残っていた疑い。 学習率と本数は、葉の数と効き方が絡む。LightGBM の公式の調整ガイドは、精度を上げる手として "Use small learning_rate with large num_iterations" と "Use large num_leaves (may cause over-fitting)" を並べている([Parameters Tuning](https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html)、参照 2026-10-11)。学習率を下げると1本の木の寄与が小さくなるので、「大きい木の過学習が和らぎ、山が大きい側(葉511)へ動く」ことはありうる。動くなら、決定15 の一覧と止め方を学習率ごとに作り直す必要がある。

用語整理:

用語意味
lgb_det乱数なし LightGBM、学習率 0.1・300本・葉31(基準。差はすべてこれとの差)
leaf63〜leaf511同じ設定で葉だけ変えたもの(Day175・176 の保存物)
s31〜s511今日作った 学習率 0.05・600本・葉 31〜511(他は同じ)
真の差5本平均(提出と同じ形)の truth 60,000行 RMSLE の差
山葉を増やしていくと良くなり、どこかで悪化に転じる。その最良の葉
損方針で選んだ1本の真の RMSLE − その世界の候補10本の真の最良

数値はすべて縮小シミュレータの上の実測(S5E5 の構造を写した合成データ、Day163〜)。実データで同じになるとは限らない。

データ・保存物の構造(スキーマ)

名前形・型意味・作り方使う場所
Sex … Body_Temp, Dur_x_HR, Keytel_kcalint / float(9列)Day163〜177 と同じ合成(ワールドの乱数 3000+番号)。Calories の雑音だけ 0.05/0.03(低)・0.12/0.08(小得)・0.15/0.10(中)全候補
raw178_w*.npz(今日、w0-5 × 3世界)oof (6,30000)・evk (6,5,80000) float32・fit_s (6,)・curve (6,5,4)今日の新規: lgb_det(再現確認)+ 学習率 0.05・600本の葉 31/63/127/255/511。curve は各 fold モデルの truth 二乗誤差(150/300/450/600本)表1〜7
raw175 / raw176(lr0.1)oof・evkDay175〜177 の保存物(葉31/63/127、葉255/511)。今日の lgb_det と最大差 0.0表1〜5
T5 / Ca / C / Afloat5本平均の truth RMSLE(真)/補正CV √(C²−A_test)/生の CV/5本の分散(test 2万行)山・残り・方針の損

評価指標(RMSLE)と、今日の問い

RMSLE は log1p 空間の RMSE(小さいほど良い)。差はすべて ×10⁻⁴。下の図は、葉の数を増やしたときの真の差を2つの学習率で重ねたもの。山(最良の葉)は3世界とも学習率で動かなかった。

真の差(対 葉31・lr0.1、×10⁻⁴、下ほど良い): 葉の数 31→511灰=lr0.1・300本/金=lr0.05・600本(各6ワールド平均)。丸が大きい点=その学習率の山。山の位置は3世界とも同じ低雑音3163127255511小得3163127255511中雑音3163127255511

❓ 問題

タスクA(予想を書いてから測る)

  1. 学習率 0.05・600本にすると、同じ葉でどれくらい良くなると思うか。葉31 と葉511 で得は同じか
  2. 山の位置は動くか。動くならどちら向きか、理由を1行で
  3. 学習率を下げると費用はほぼ2倍(本数が倍)と見積もってよいか

タスクB(コーディング)

  1. day176.py の生成部を1文字も変えずに、候補を lgb_det(再現確認用)+ s31〜s511 にした day178.py を書く。各 fold モデルの truth 誤差を 150/300/450/600 本目で記録する
  2. 各世界 6ワールド(計18)で回し、lgb_det が Day175 の保存物と完全一致することを確かめる
  3. analyze178.py で、真の差・同じ葉の学習率の得・山の位置・補正CV の残り・基準選びの方針6つの損・費用を出す

タスクC(分析・戦略)

  1. 決定15 は学習率 0.05 でも同じ形で使えるか
  2. 「全部を lr0.05 で作る」「両方の学習率から選ぶ」「lr0.1 で葉を選び、その1本だけ lr0.05 で作り直す」のどれを採るか。損と費用で決める
  3. 600本は足りているか、多すぎるか

💡 ヒント

ヒント1(方向性)

「山が動くか」と「最終提出をどう作るか」は別の問い。前者は表で、後者は損と費用の両方で答える。

ヒント2(アプローチ)

同じワールド・同じ分割・同じ fold で lr0.1 と lr0.05 を作れば、同じ葉どうしの差は対で比べられる(ワールドの難しさが消える)。途中本数の誤差は predict(X, num_iteration=k) で、学習し直さずに取れる。

ヒント3(コード骨格)

SLOW = dict(learning_rate=0.05, n_estimators=600)
DET = [("lgb_det", dict()), ("s31", dict(SLOW)), ("s63", dict(SLOW, num_leaves=63)), ("s127", dict(SLOW, num_leaves=127)),
       ("s255", dict(SLOW, num_leaves=255)), ("s511", dict(SLOW, num_leaves=511))]
CURVE = [150, 300, 450, 600]
...
for i, it in enumerate(CURVE):
    p = np.log1p(np.clip(np.expm1(m.predict(XE[N_TEST:], num_iteration=it)), 1, None))
    curve[j, k, i] = ((p - ltru) ** 2).mean()

✅ 模範解答

タスクA(予想。測る前に書いたもの)

  1. 得は −1〜−3 程度。大きい木ほど過学習が和らぐので得が大きい、と予想
  2. 山は大きい側へ半段(低雑音 63/127 → 127、中雑音 255 → 255/511)動く、と予想
  3. ほぼ2倍、と予想

→ 1 は「小さい」は当たり、「大きい木ほど得」は外れ。2 は外れ。3 も外れ(2.4〜3.0倍)。下の実測を参照。

タスクB(完全なコード)

day178.py(day176.py との差分。生成部・分割・random_state は同じ):

LG = dict(objective="regression", learning_rate=0.1, n_estimators=300, num_leaves=31, min_child_samples=20,
          n_jobs=1, verbose=-1)
# Day178: 学習率 0.05・600本で葉 31/63/127/255/511 を作る。lgb_det(lr0.1・300本)は raw175 との一致確認用(決定9)
SLOW = dict(learning_rate=0.05, n_estimators=600)
DET = [("lgb_det", dict()), ("s31", dict(SLOW)), ("s63", dict(SLOW, num_leaves=63)), ("s127", dict(SLOW, num_leaves=127)),
       ("s255", dict(SLOW, num_leaves=255)), ("s511", dict(SLOW, num_leaves=511))]
CURVE = [150, 300, 450, 600]  # 1 fold モデルの truth 二乗誤差(log1p 空間)を途中の本数で記録
names = [c[0] for c in DET]
...
curve = np.full((len(names), 5, len(CURVE)), np.nan)
ltru = np.log1p(evalset.Calories.values[N_TEST:])
for k, (tr, va) in enumerate(KFold(5, shuffle=True, random_state=0).split(train)):
    ...
    for j, (nm, over) in enumerate(DET):
        t1 = time.time()
        m = lgb.LGBMRegressor(**{**LG, **over}, random_state=1000 * 0 + k).fit(X, y)
        oof[j, va] = m.predict(XV); evk[j, k] = m.predict(XE)
        fit_s[j] += time.time() - t1                     # 費用は途中本数の記録を含めない
        if j > 0:
            for i, it in enumerate(CURVE):
                p = np.log1p(np.clip(np.expm1(m.predict(XE[N_TEST:], num_iteration=it)), 1, None))
                curve[j, k, i] = ((p - ltru) ** 2).mean()
np.savez_compressed(f"raw178_w{W}.npz", oof=oof, evk=evk, ytr=train.Calories.values,
                    yev=evalset.Calories.values, names=np.array(names), fit_s=fit_s, curve=curve)

analyze178.py(要点。全文は保存物):

def score(y, ytru, O, E):
    c2 = ((lp_clip(O) - np.log1p(y)) ** 2).mean()
    a_te = E[:, :N].var(axis=0).mean()
    t5 = np.sqrt(((lp_clip(E[:, N:].mean(0)) - np.log1p(ytru)) ** 2).mean())
    return dict(C=np.sqrt(c2), Ca=np.sqrt(c2 - a_te), T5=t5, A=a_te)

def pick(row_ca, lst, edge=None, extra=None):          # 決定15: 補正CV 最良、端なら1本足す
    b = row_ca[lst].idxmin()
    if edge is not None and b == edge:
        b = row_ca[lst + [extra]].idxmin()
    return b

POL = {
    "決定15 L4(lr0.1)+端なら511": lambda r: pick(r, FAST[:4], "leaf255", "leaf511"),
    "同じ規則を lr0.05 に":       lambda r: pick(r, SLOW[:4], "s255", "s511"),
    "両方の10本から補正CV最良":   lambda r: r[ALL].idxmin(),
    "決定15 で葉を選び lr0.05 で作り直す": lambda r: TO_SLOW[pick(r, FAST[:4], "leaf255", "leaf511")],
    "常に s255": lambda r: "s255", "常に leaf255": lambda r: "leaf255",
}

実行:

# 各世界 w0-5 の18ワールドを 6 並行で作る(run.sh は Day177 の uv venv と scikit-learn 同梱の libomp を使い、w>=6 は飛ばす)
(for w in $(seq 0 15); do echo "$w 0.05 0.03 low"; [ $w -lt 12 ] && echo "$w 0.15 0.10 mid" && echo "$w 0.12 0.08 sm"; done) \
  | xargs -P 6 -L 1 sh -c './run.sh day178.py $0 $1 $2 '"$(pwd)"'/r/$3'
# 集計(引数: 今日の出力・Day175 の保存物・Day176 の保存物・Day177 で足した Day176 の残り)
python analyze178.py r <d175> <d176> <d177/r176> > out178.txt
# 方針の損の差を世界ごとの対で SE つきで出す
python extra178.py

実行結果(実測)

# ============ 実行環境: macOS (M1, メモリ8GB)・Day177 の uv venv(Python 3.13.12・lightgbm 4.7.0)
#   OMP_NUM_THREADS=1・n_jobs=1。他のセッション(postgres COPY・VM・Chrome)と同居し load average 13〜138
#   18ワールド × 6本 × 5 fold = 540 fit、壁時計 6,826 秒(1ワールド 1,338〜3,540 秒)
#   予定は40ワールドだったが、1ワールド約30分かかるため各世界 w0-5 で打ち切った(理由は「扱わなかった範囲」)
ワールド数: {'中雑音': 6, '低雑音': 6, '小得': 6}
再現(lgb_det 対 raw175、最大絶対差): OOF 0.0  fold別予測 0.0

=== 表1 真の差(対 lgb_det、×1e-4、平均±SE、良い割合)===
[低雑音 n=6]
  lr0.1・300本 : leaf63 -3.36±0.49  leaf127 -2.84±0.49  leaf255 +1.69±0.69  leaf511 +9.40±0.79
  lr0.05・600本: s31 -0.35±0.36(0.67)  s63 -4.29±0.55(1.00)  s127 -3.91±0.55(1.00)  s255 +0.44±0.82(0.33)  s511 +8.93±1.00(0.00)
[小得 n=6]
  lr0.1・300本 : leaf63 -12.38±0.38  leaf127 -22.55±0.35  leaf255 -25.63±0.63  leaf511 -17.25±0.69
  lr0.05・600本: s31 +0.22±0.28(0.33)  s63 -12.80±0.41(1.00)  s127 -23.13±0.28(1.00)  s255 -25.84±0.41(1.00)  s511 -18.01±0.81(1.00)
[中雑音 n=6]
  lr0.1・300本 : leaf63 -15.99±0.72  leaf127 -31.67±0.38  leaf255 -36.88±0.58  leaf511 -29.11±1.12
  lr0.05・600本: s31 +0.25±0.30(0.50)  s63 -16.99±0.62(1.00)  s127 -32.51±0.49(1.00)  s255 -38.50±0.58(1.00)  s511 -30.16±1.61(1.00)

=== 表2 同じ葉で lr0.05・600本 − lr0.1・300本(真、×1e-4、平均±SE、良くなった割合)===
[低雑音] 葉31 -0.35±0.36(0.67)  葉63 -0.93±0.36(0.83)  葉127 -1.06±0.27(1.00)  葉255 -1.25±0.40(0.83)  葉511 -0.46±0.43(0.67)
[小得]   葉31 +0.22±0.28(0.33)  葉63 -0.42±0.28(0.83)  葉127 -0.59±0.37(0.67)  葉255 -0.21±0.26(0.50)  葉511 -0.77±0.44(0.83)
[中雑音] 葉31 +0.25±0.30(0.50)  葉63 -1.01±0.47(0.83)  葉127 -0.84±0.28(1.00)  葉255 -1.62±0.24(1.00)  葉511 -1.05±0.58(0.67)

=== 表3 山の位置(真の最良の葉、ワールド数)===
[低雑音] lr0.1: {63: 4, 127: 2}  lr0.05: {63: 3, 127: 3}   s255−s127 +4.35±0.51(0/6)  s511−s255 +8.49±0.32(0/6)
[小得]   lr0.1: {255: 6}         lr0.05: {255: 6}          s255−s127 -2.70±0.23(6/6)  s511−s255 +7.82±0.59(0/6)
[中雑音] lr0.1: {255: 6}         lr0.05: {255: 6}          s255−s127 -5.98±0.38(6/6)  s511−s255 +8.33±1.16(0/6)
(参考 Day177 の lr0.1・40ワールド: 511−255 低 +8.16 / 小得 +8.41 / 中 +7.72 → 学習率を変えても「255→511 で約 +8 戻る」はそのまま)

=== 表4 補正CV の残り(CV差−真の差、対 lgb_det、×1e-4)と生CVの偏り ===
[低雑音] s31 生-0.33 補正後+1.25±1.05  s63 生+3.89 +0.91±1.56  s127 生+9.13 +0.47±2.64  s255 生+17.63 +2.21±3.50  s511 生+24.73 +2.64±4.27
[小得]   s31 生-1.09 +0.69±0.50  s63 生+3.80 +0.37±1.38  s127 生+11.00 +0.59±2.28  s255 生+20.30 +1.67±3.53  s511 生+29.07 +1.67±2.87
[中雑音] s31 生-2.87 -1.06±0.42  s63 生+5.16 +1.15±1.31  s127 生+12.98 +1.32±2.53  s255 生+24.20 +3.46±3.66  s511 生+30.56 +0.14±2.47
(15組中14組が 2SE 以内。例外は中雑音 s31 の −1.06±0.42(2.5SE、15回検定すれば1回は出うる大きさで、向きも他の世界とそろわない)。生の偏りは葉とともに育ち、中雑音 s511 で +30.56)
A(5本の分散、二乗×1e-4)中雑音: lgb_det 5.89  s31 5.06  s63 7.65  s127 11.03  s255 15.10  s511 19.51

=== 表5 基準選び(補正CV で選ぶ)の損(×1e-4、対 その世界の10本の真の最良)===
                                    中雑音  低雑音  小得   最悪   1ワールドの費用(中央値秒)
  決定15(lr0.1 の L4+端なら511)  2.23   2.57   0.91   2.57   約 110(概算: 葉63 は記録なし)
  決定15 で葉を選び lr0.05 で作り直す 0.78   1.52   0.62   1.52   約 110 + 選んだ1本(s63 41〜s255 147)
  同じ規則を lr0.05 に               0.78   1.37   1.59   1.59   285(+s511 のとき 343)
  両方の10本から補正CV最良           1.71   1.71   1.80   1.80   約 395〜850
  常に s255                          0.00   5.15   0.14   5.15   147
  常に leaf255                       1.62   6.40   0.34   6.40   51

=== 追加 方針の損の差(世界ごとの対、×1e-4、平均±SE、良くなった割合)===
  作り直し − 決定15        中 -1.46±0.33(6/6)  低 -1.05±0.38(5/6)  小得 -0.29±0.27(3/6)
  lr0.05規則 − 決定15      中 -1.46±0.33(6/6)  低 -1.20±1.28(5/6)  小得 +0.68±0.75(2/6)
  作り直し − lr0.05規則    中 +0.00±0.00       低 +0.15±1.10       小得 -0.97±0.63
  2つの学習率で選んだ葉が同じ割合: 中 1.00  低 0.50  小得 0.67

=== 表6 1 fold モデルの truth RMSLE(×1e-4、5 fold・ワールド平均)の途中本数 ===
                150      300      450      600     600本が最良のワールド
  低雑音 s63   1577.1   1573.4   1572.7   1573.1   1/6
  低雑音 s255  1583.5   1583.9   1586.9   1590.3   0/6(150本以前が山)
  低雑音 s511  1589.6   1595.0   1600.9   1605.6   0/6
  中雑音 s127  2269.9   2256.4   2251.4   2249.5   6/6
  中雑音 s255  2263.1   2251.5   2250.8   2252.9   0/6(450本付近が山)
  中雑音 s511  2263.7   2259.2   2264.5   2270.8   0/6(300本付近が山)
  (s31 は3世界とも 600本でまだ下がっている)

=== 表7 費用(1ワールド5fold、中央値秒、同居実測)===
  lgb_det 12  s31 25  s63 41  s127 72  s255 147  s511 343  (lr0.1: leaf255 51・leaf511 116、Day176/177 の記録)
  同じ葉の lr0.05 / lr0.1 の比: 葉255 2.9倍・葉511 3.0倍(本数の比 2倍より大きい)

タスクC(分析・戦略の模範)

  1. 決定15 の形(一覧 31〜255、端なら511)は lr0.05 でもそのまま使える。 山は 18ワールドすべてで同じ葉(低雑音 63/127、小得・中雑音 255)にあり、255→511 で約 +8 戻ることも lr0.1(Day177 の40ワールド)と同じ。補正CV の残りも15組中14組が 2SE 以内(例外は小さい木の s31 中雑音 2.5SE)で、決定13 は学習率を変えても持つ。予想(山が大きい側へ動く)は外れた。公式ガイドの「小さい学習率と多い本数」と「大きい num_leaves」は、このデータでは独立に効き、掛け合わせて山を動かすことは無かった
  2. 「葉は lr0.1 で選び、選んだ1本だけ lr0.05 で作り直す」を採る(決定18)。 最悪の損は 1.52 で6案の中で最小、決定15 そのまま(2.57)より −1.05。次点の「同じ規則を lr0.05 に」(1.59)とは差が無い(対で +0.15±1.10 / −0.97±0.63)が、費用は約半分。作り直しの得は対で中雑音 −1.46±0.33(6/6)・低雑音 −1.05±0.38(5/6)で、小得は −0.29±0.27(差なし)。全部を lr0.05 で作っても、選ぶ葉は 2つの学習率で 50〜100% 同じなので、比べる段階に遅い学習率を使う得は無い。「両方の10本から選ぶ」は候補を増やした分だけ補正CV の揺れ(Day177 で SD 3〜8)に負けて損が増えた(1.80)
  3. 600本は、葉255 以上では多すぎる。 1 fold モデルの曲線では、中雑音 s255 は 450本付近、s511 は 300本付近、低雑音 s255・s511 は 150本以前が山で、600本では 0/6。逆に葉31 はまだ下がっている。ただしこれは1本のモデルの曲線で、提出(5本平均)の山は平均で過学習が和らぐ分だけ後ろにずれる可能性がある(未計測)。本数は葉と組で決まるので、作り直しの1本は「葉ごとに本数も選ぶ」余地が残る(次回)

タスクD(決定)

#決定採った案採らなかった案と理由前提が変わったら
15(印 ◎ のまま、学習率への頑健さを追記)葉を選ぶ段は学習率 0.1・300本で、一覧 31/63/127/255+端なら51118ワールドで山の位置が lr0.05 と同じ。補正CV の残りも15組中14組が 2SE 以内一覧を学習率ごとに作り直す: 山が動かないので不要学習率 0.02 以下・本数 1,500 以上など、さらに遠い設定では未計測。そこへ行くなら 6ワールドで山を確かめ直す
18(新設、印 ○)最終提出は、決定15 で選んだ葉を学習率 0.05・600本で作り直した1本最悪の損 2.57→1.52、対の得は中雑音 6/6・低雑音 5/6。追加費用は1本(41〜147秒)(a) 全部を lr0.05 で比べる: 損 1.59 とほぼ同じで費用 2.6倍。(b) 10本から選ぶ: 損 1.80、候補が増えた分だけ選び間違う。(c) 常に s255: 低雑音で 5.15作り直しの1本が葉255 以上なら 600本は多すぎる(表6)。本数を葉ごとに選ぶ手順を足したら、ここを測り直す。6ワールドなので印は ○

📊 結果の可視化

基準選びの方針ごとの、3世界の最悪の損(×10⁻⁴、短いほど良い)と1ワールドの費用(秒)18ワールド。損は「選んだ1本の真 − その世界の10本の真の最良」決定15 で葉を選び lr0.05 で作り直す1.52(約110+1本秒)同じ規則を lr0.05 に1.59(285秒)両方の10本から補正CV最良1.80(約400〜850秒)決定15(lr0.1 のまま)2.57(約110秒)常に s2555.15(147秒)常に leaf2556.40(51秒)
中雑音・1 fold モデルの truth RMSLE(×10⁻⁴、下ほど良い)と本数葉が大きいほど早く山が来る。600本は葉255 以上には多すぎる(1本のモデルの曲線で、5本平均は未計測)225022602270150本300本450本600本中雑音 s127中雑音 s255中雑音 s511

1枚目: 葉は lr0.1 で選び、その1本だけ lr0.05 で作り直す方針が最悪の損 1.52 で最小、費用も全部を lr0.05 で作る案の約半分。2枚目: 葉255 以上では 600本が多すぎる。作り直しの1本は本数も選ぶ余地がある(次回)。

🪜 Step-by-Step 解説

Step 1: 予想を先に書く

予想を書かずに測ると、どんな結果も「やはり」と読めてしまう。今日は「山は大きい側へ動く」と書いてから測り、外れた。

Step 2: 生成部を変えず、再現を確かめる

day178.py は候補の一覧だけを変えた。基準 lgb_det は Day175 の保存物と OOF・fold 別予測とも最大差 0.0(決定9)。これで Day175〜177 の lr0.1 の保存物と同じワールドとして並べられる。

Step 3: 同じ葉どうしを対で比べる

ワールドごとの難しさは同じ葉の差で消える。得は −0.2〜−1.6 で、葉31 では差なし(+0.2〜−0.4)。「大きい木ほど得」という予想も、葉511 の得(−0.5〜−1.1)が葉255 と同程度で外れた。

Step 4: 山の位置を見る

最良の葉の数え上げ(表3)と、隣どうしの差(255−127、511−255)の両方を見る。数え上げだけだと引き分けの多い低雑音(63 と 127 の差 +0.38±0.58)で揺れて見えるので、差の向きと大きさで判断した。

Step 5: 方針を損と費用で並べる

損だけなら「同じ規則を lr0.05」と「作り直し」はほぼ同じ。費用を並べると作り直しが半分で済む。損の差は世界ごとの対で SE をつけ、小得では差が無いことも書いた。

Step 6: 本数の曲線で次の問いを見つける

600本が大きい木には多すぎることが分かった。これは今日の結論(作り直し)を壊さないが、作り直しの1本をさらに良くする余地として次回に回す。

📐 数学・統計の補足(文系向け)

学習率は「1歩の大きさ」。 勾配ブースティングは、前の木の間違いを次の木が少しずつ直していく。学習率 0.1 なら毎回間違いの1割だけ直す、0.05 なら5%だけ。1歩を小さくすると同じ距離を進むのに倍の本数が要るが、細かく刻むぶん行き過ぎ(過学習)が少し減る。今日の得 −0.2〜−1.6 は、その「刻みの細かさ」の効果の大きさ。

葉の数は「1歩でどれだけ細かく場合分けするか」。 葉が多いほど細かい規則を作れるが、データの偶然まで覚える。学習率は1歩の大きさ、葉の数は1歩の形なので、今日のデータでは両者はほぼ別々に効いた(山が動かなかった)。

なぜ費用が2倍を超えたか(仮説)。 学習率 0.1 では、後半の木は直す間違いが小さくなり、分割の得が小さくて早く止まる木が増える。0.05 では間違いが長く残るので、後半の木も最後まで葉を使い切りやすい。木1本あたりの手間が増え、本数2倍×1本の手間で 2.4〜3.0倍になった、と考えている(木ごとの葉の数は記録していないので未確認)。

二乗→RMSLE の換算は不要。 今日の表はすべて RMSLE そのものの差(×10⁻⁴)。

🏆 Kaggleでの実践的な使い方

  • 調整は速い学習率で、提出は遅い学習率で。 葉の数など木の形は lr0.1 で比べ、決めた1本だけ lr0.05(本数2倍)で作り直す。今日のデータでは損が 2.57→1.52、追加費用は1本分
  • 学習率を下げても、比べた順位はほぼ変わらない。 選ぶ葉は 2つの学習率で 50〜100% 一致。比べる段階から遅い学習率にすると、費用が 2.6倍になって損は同じ
  • 本数は葉と組で決まる。 葉255 以上で 600本は多すぎた。early stopping を使うなら fold ごとに止まる本数が違うことに注意(今日は使っていない)
  • 費用の見積もりは「本数の比」より大きく取る。 本数2倍で 2.4〜3.0倍かかった(同居環境の実測)

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
学習率を下げれば、もっと大きい木が使えるようになる「過学習が和らぐ」を一般化する今日のデータでは山は動かなかった(18/18)。得は同じ葉で −0.2〜−1.6
学習率を下げると必ず良くなる公式ガイドの「精度のため」を常に正しいと読む葉31 では差なし(+0.25〜−0.35)。大きい木では 600本が多すぎる
比べる段階も遅い学習率でやるべき「最終と同じ設定で比べるのが正しい」選ぶ葉はほぼ同じで、費用だけ 2.6倍。損も改善しない
候補は多いほど良い(両方の学習率から選ぶ)選択肢が増えれば最良に近づくと考える補正CV の揺れに負けて損が 1.52→1.80 に増えた
費用は本数に比例する1本の手間を一定と仮定する本数2倍で 2.4〜3.0倍

🧭 扱わなかった範囲と理由

  • ワールド数(18、予定40): 同居環境(load 13〜138、メモリ8GB)で1ワールド 1,338〜3,540 秒かかり、40ワールドでは約4時間の見込みだったため、各世界 w0-5 で打ち切った(run.sh で w≥6 を飛ばした)。山の位置は 18/18 でそろい、対の差も多くが 2SE を超えるので結論は変わりにくいが、決定18 の印は ○ に留める。残り22ワールドは Mac mini で回す
  • 5本平均での本数の山: 表6 は1 fold モデルの曲線。提出(5本平均)の途中本数は記録していない
  • 本数の上限を葉ごとに選ぶ(early stopping・本数の候補): 次回
  • 学習率 0.02 以下・本数 1,500 以上: 費用がさらに 2.5倍以上かかるため未計測
  • 木ごとの葉の数(費用が2倍を超えた理由の確認): 記録していない
  • 乱数ありの候補(決定14 の後段)を学習率 0.05 で: 低雑音の raw172 が tmp から消えており、作り直しが要る
  • 実データ(S5E5): 縮小シミュレータの上の数字のみ。S5E5 のルール確認・公開割合は Day171 で利用者の作業として切り出したまま
  • 原典照合: LightGBM 公式の Parameters Tuning は今日照合した("For Better Accuracy" の節)。Nadeau & Bengio・Krogh & Vedelsby は未照合のまま
  • 持ち越し: seed を変えた独立な10分割、mcs を下げる方向(5・10)、決定17 を CV設計書に1行足す、候補数 K と選択の上振れ、系統別の m(et)、公開LB と2本目の枠、avg3 での損、OOF 側と test 側の seed の揺れの分離、noKeytel・raw7 の補正後のずれ、補正CV と入れ子CV の比較、Day170 のハイブリッド・狭い10本の出し直し、SE 個数差と分割の新しさ(Day165)、Day162 の選択バイアス、真の効果ちょうど0の偽採用率

🚀 次のステップ

  • 発展: 作り直しの1本で、本数を 300/450/600 から補正CV で選ぶと損がさらに減るか(5本平均の途中本数を保存して測る)
  • 発展: 残り22ワールド(低雑音 w6-15・小得 w6-11・中雑音 w6-11)を Mac mini で回し、決定18 の印を ○→◎ にできるか確かめる
  • 次回予告: Day 179 — Playground Series 実戦投入⑭(決定18 の作り直しの1本で、本数を葉ごとに選ぶ: 5本平均の途中本数 200〜600 を保存し、補正CV で本数を選ぶ規則が 600本固定より得か、費用込みで測る)。月替わりテーマ3「画像(CV)系コンペへの応用」は 10/25 から

📝 自己評価(解いた後に記入)

自分の回答・気づき・メモ: