Cross-validation
from 2025-12-23
交差検証
Cross-validation
for fold_idx, (train_idx, test_idx) in enumerate(skf.split(X, y)):
(fold_idx, (train_idx, test_idx))のタプルを返す
fold_idxは0~k-1のindex
for文の仕組みがよくわかっていない。
Pythonのenumerate()の使い方:インデックス付きループを簡単にする便利関数
k-foldでのcvをn回繰り返して平均を取りたい
k*n回学習させる
scikit-learn
StratifiedKFoldはデータを分割するだけのために使う
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
この場合5分割なのでたとえば10行のデータなら2行ずつのインデックスがskf.split(X, y)に入る
実際にはクラスの比率の層化が入るのでズレる
?ズレるとは
model.predict_proba(X_valid)[:, 1]
1列目に欲しい結果が入っているのでそこだけ取る(0列目には不正解率が入っている)
roc_auc_score()
scikit-learnに入ってる
引数は?
roc_auc_score — scikit-learn 1.8.0 documentation
目的変数の正解と予測を(y_valid, y_pred)のように渡す
モデルをLightGBMにしたときにはどうするか
lgb.LGBMClassifier()
こっちをつかう
lgb.Booster()
違いは?
training APIとScikit-learn APIがある。後者を使う。
何時間やってんだこれ。まったく動くコードが書けない。
とりあえず普通のcvをLightGBMで行うコードを書く
RandomForestClassifierを検証する時とのとの違いは?
予測確率をcsvで書き出すところまでできたら寝よう
やめた
明日やる
claudeに質問したらわからなかった部分を的確に教えてくれた。こいつできるな!今度からclaudeに聞くわ
私が途中まで書いたコードを渡したら変に改変せずに知りたいことだけ教えてくれた。
cv時に何回も.fitをすることがあるが、これは検証時のリーク防止のためで実際のモデルは1回の学習で作る
そもそも同じモデルでアンサンブルしてもスコア向上の効果が薄いのでやる必要はない
今までモデル構築と評価を混同していたかもしれない。
×X[train_idx]
〇X.iloc[train_idx]
pandas.DataFrame.iloc — pandas 2.3.3 documentation
スマホから見ると色がかわいい
y_pred_probaは最後のfoldの予測結果だけが入っている
これをモデルに使うことはできない。(今回の場合はインスタンスの数を提出用ファイルの数に合わせる必要がある。foldではなく完全な検証用データを使って予測値を作る必要がある。)