武藤?
交差検証によるパラメータ調整
データ分割・調整手順
1. train / testに分割
2. K分割交差検証によって,trainを"調整用train" / "検証データ"に分割
"調整用train"と"検証データ"の分割をK回実行する
- (shuffleしない限り)trainデータが全て"調整用train"と"検証データ"の役が回るようにする
3. 1つのパラメータ組み合わせに対して,K通りの「"調整用train"に対する"検証データ"スコア」を算出し,平均化*1
4. 平均スコアが最も高いパラメータで学習モデル構築
- Trainに対して最適パラメータで再学習*2
- GridSearchCVの場合,「.best_estimator_」の中に最適パラメータのモデルが入っているため,これを用いる.
PipeLineなしの場合
gscv = GridSearchCV(estimator(学習器), param_grid(辞書式パラメータリスト),
scoring(f1_macro/f1_microなど), cv(Kの数), verbose = 1)
gscv.fit(trainX, trainY) # 自動的にK通りの"調整用train" / "検証データ"の組み合わせで各パラメータパターンの平均スコアが算出
gscvBM = gscv.best_estimator_ # 最適パラメータのモデル
5. 学習モデルでtestを予測
print(gscvBM.score(testX, testY)) # testに対する評価
testは未知データに対する汎化性能評価のために用いられる
補足
未知データ(test)に対して交差検証は必要か?(パラメータ調整に加えて)
- J分割した各train/testパターンのtrainに対してさらにK分割してパラメータ調整するということ
- 各train(調整train/検証データ)で最適パラメータは異なるため,J通りの予測スコアを平均すること自体に意味があるのか疑問(それは単にデータ全体に対する評価になるかもしれない)
- パラメータ調整に時間を要するなら,J倍になるので非現実
参考
交差検証でシャッフルするかしないかの議論
- 自前で交差検証する際に使いそうな「StratifiedKFold」の引数で「shuffle=True/False」があり,挙動の違いのメモ.
- また,「StratifiedKFold」と「StratifiedShuffleSplit」の違いについて
StratifiedKFold(shuffle = True/False)について
- 各クラスを均等にtrain/test(or検証データ)に分割するのは変わらない
- StratifiedKFoldのドキュメントや調べた限りでは,Falseは元のデータと同様の順序でデータ分割される.Trueはデータの順序を(random_stateに基づいて)シャッフルしてからK個の組み合わせにデータ分割される.
- データの順序が元からバラバラならFalseでも良さそう?
「StratifiedShuffleSplit」について