case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

Validation備忘録

Validationの備忘録です
Visualizing cross-validation behavior in scikit-learn — scikit-learn 0.24.1 documentationVisualizing cross-validation behavior in scikit-learn — scikit-learn 0.24.1 documentation

基本的な分割方法

Kfold

全てのデータが一度は検証データとして使われます。ただ、不均衡データには不向きです。Fold 0を見ると3クラスあるうち、茶色のクラスが学習データに含まれていないことがわかります。不均衡データに対して適用した場合うまく予測することができなくなってしまいます。
f:id:casekblog:20210214152114p:plain

GroupKfold

訓練データと検証データで同じグループが含まれないようにする分割方法です。訓練データと検証データで同じユーザのログを含めたくない場合に使えます。
f:id:casekblog:20210214152133p:plain

ShuffleSplit

データを最初にシャッフルしてから分割します。なので分割した各Foldでデータの重複を許容します。
f:id:casekblog:20210214152154p:plain

StratifiedKFold

不均衡データに適した分割方法となります。訓練データとテストデータにクラスがうまく分割されていることがわかります。
f:id:casekblog:20210214152216p:plain

複合的な分割

GroupShuffleSplit

GroupKfoldとShuffleSplitを混ぜた分割方法です。訓練データにはテストデータと同じグループは含まれないようランダムにシャッフルしてるので、検証データとして一度も使われてない Groupがあります。
f:id:casekblog:20210214152238p:plain

StratifiedShuffleSplit

StratifiedKFoldとShuffleSplitを混ぜた分割方法です。クラスの分布を担保したまま分割してるので不均衡データに強い分割方法となります。
ランダムにシャッフルしてるので、検証データとして一度も使われてないデータも出てきます。
f:id:casekblog:20210214152304p:plain

StratifiedGroupKFold

StratifiedKFoldとGroupKfoldを複合させた分割方法です。クラスの分布を担保し、かつ訓練データと検証データで同じグループのユーザが含まれないよう分割します。不均衡データかつ、訓練データとテストデータに同じユーザが含まれている場合リークを防ぐのに役立ちます。
Stratified Group KFoldを実装してみた - Naoism's Blog

時系列データの分割

目的としてはGroupKFoldと似てますが、時系列データは過去のデータしか使うことができないため、未来のデータを訓練データに含めないよう分割する必要があります。
f:id:casekblog:20210214152322p:plain