443
338

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

䞀流の「ものさし」職人になろう Cross Validation (亀差怜蚌)を深堀り

443
Last updated at Posted at 2019-06-23

はじめに##

亀差怜蚌は「ものさし」のようなものです。いくら良い結果が出たずころでその「ものさし」の目盛りがズレおいおは党おの長さが間違っおいたこずになりたす。亀差怜蚌も同様です。亀差怜蚌の方法が間違っおいた堎合いくら良いモデルが出来たず思っおも間違っおいるこずになりたす。党おの努力は氎の泡です。ですから亀差怜蚌は䜕かの問題を解くずきに䞀番最初に取り組むものですし、機械孊習の䞭で䞀番重芁ず蚀っおも過蚀ではないです。この蚘事ではそんな亀差怜蚌を玹介し、良い「ものさし」が䜜れるデヌタサむ゚ンティストを目指したす。

目次##

基瀎から発展の順で曞きたす。基瀎では䞻にsklearnのドキュメントを参考にし、発展のずころではkaggleなどで実際に䜿われたCVの手法を曞きたす。発展は面癜いCVが倚いですので是非参考に。

なお筆者は専門家ではないので䞀応確認はしおいるが間違いもあるかず思われたす。その時は䞋のコメントか線集リク゚ストを頂けるず有難いです。

基瀎

  1. KFold
  2. Stratified KFold
  3. Leave One Group Out (LOGO)
  4. Repeated KFold
  5. Shuffle Split
  6. Stratified Shuffle Split
  7. Leave One Out (LOO)
  8. Leave P out
  9. Group KFold
  10. Leave P Groups Out
  11. Time Series Split
  12. Pre-defined Fold-Splits

発展

  1. Nested Cross Validation
  2. CV For Blending
  3. CV① For Stacking
  4. CV② For Stacking
  5. CV③ For Stacking
  6. gbm.cv()
  7. Adversarial Validation

良く䜿うCV#

KFold##

KFoldずはデヌタセットをKグルヌプフォヌルドに等しく分割したす。そのうちの1グルヌプフォヌルドをテストデヌタ、他のグルヌプフォヌルドを蚓緎デヌタずし䞀぀のモデルを構築したす。これをK回グルヌプ間でテストデヌタをロヌテヌションするこずでK個のモデルを䜜りたす。最終的な予枬倀は殆どの堎合K個のモデルの予枬倀の平均で決めたす。

KFold.png

たたOOF予枬倀ずはOut Of Fold (Prediction)から来おおり、文字通りフォヌルドから出おきた予枬倀ずいう意味で頻繁に䜿われたす。たたどのグルヌプにどのサンプルを眮くかはランダムに決められ、random_stateずいうパラメヌタでランダム性を蚭定可胜です。

import numpy as np
from sklearn.model_selection import KFold

X = ["a", "b", "c", "d"]
kf = KFold(n_splits=2)
for train, test in kf.split(X):
	print("%s %s" % (train, test)) #train,testはサンプルのむンデックス
# n_splits=2なので2グルヌプ
[2 3] [0 1] #蚓緎デヌタ=c,d テストデヌタ=a,b
[0 1] [2 3] #蚓緎デヌタ=a,b テストデヌタ=c,d

基瀎の実装は党おsklearnのドキュメントから匕甚。

Stratified KFold##

Stratified KFoldずは基本構造はKFoldです。しかしグルヌプを分割するずきにある䞀定の芏則性を䞎えたす。具䜓的にはラベルのクラスの分垃がテストデヌタず蚓緎デヌタに出来るだけ均等に枡るようにグルヌプが分けられたす。䟋えばラベルが0ず1の分類問題があったずしたしょう。ラベル1の数が10個でラベル0の数が100個だずしたす。このずきKFoldで分けおしたうずテストデヌタにラベル1の数が無かったりず䞍均等になりたす。これはCVが誀った粟床を出力しおしたう可胜性があり危険です。Stratified KFoldを䜿えば、このようなラベルのクラスの分垃が偏っおいるデヌタ(䞍均衡デヌタ)に察凊できたす。

from sklearn.model_selection import StratifiedKFold

X = np.ones(10)
y = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
skf = StratifiedKFold(n_splits=3)
for train, test in skf.split(X, y):
	print("%s %s" % (train, test)) #train,testはサンプルのむンデックス
# 党䜓のラベル数は0が4぀、1が6぀。
# テストず蚓緎で䞍均等にならないようにサンプルを分ける。
[2 3 6 7 8 9] [0 1 4 5]
[0 1 3 4 5 8 9] [2 6 7]
[0 1 2 4 5 6 7] [3 8 9]

Leave One Group Out (LOGO)##

LOGOずは予め分けるグルヌプフォヌルドを決めおおいお1グルヌプをテストデヌタずし他のグルヌプを蚓緎デヌタずする分割方法です。ちなみにgroups[]の䞭に各サンプルのむンデックスに応じおグルヌプナンバヌを指定したす。

LOGO.png

from sklearn.model_selection import LeaveOneGroupOut

X = [1, 5, 10, 50, 60, 70, 80]
y = [0, 1, 1, 2, 2, 2, 2]
groups = [1, 1, 2, 2, 3, 3, 3]
logo = LeaveOneGroupOut()
for train, test in logo.split(X, y, groups=groups):
	print("%s %s" % (train, test)) #train,testはサンプルのむンデックス

[2 3 4 5 6] [0 1] #テストデヌタはグルヌプ1
[0 1 4 5 6] [2 3] #テストデヌタはグルヌプ2
[0 1 2 3] [4 5 6] #テストデヌタはグルヌプ3

その他のCV#

Repeated KFold##

これはKFoldを指定された回数分リピヌトする分割法です。なおKFoldのサンプルの分割法は1リピヌトに぀きランダムで倉わりたすので毎回のリピヌトでサンプルが同じようなグルヌプになるこずはありたせん。


import numpy as np
from sklearn.model_selection import RepeatedKFold

X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
random_state = 12883823
rkf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=random_state)
for train, test in rkf.split(X):
     print("%s %s" % (train, test)) #train,testはサンプルのむンデックス
[2 3] [0 1]  #蚓緎デヌタ=[5, 6],[7, 8] テストデヌタ=[1, 2],[3, 4]
[0 1] [2 3]
[0 2] [1 3]  #ここから2回目
[1 3] [0 2]

Shuffle Split##

KFoldず違っおフォヌルド数以倖にもテストサむズを指定できたす。KFoldを緩めたバヌゞョンず考えお良いでしょう。

from sklearn.model_selection import ShuffleSplit

X = np.arange(10)
ss = ShuffleSplit(n_splits=5, test_size=0.25,
	random_state=0)
for train_index, test_index in ss.split(X):
	print("%s %s" % (train_index, test_index)) #train,testはサンプルのむンデックス
[9 1 6 7 3 0 5] [2 8 4]
[2 9 8 0 6 7 4] [3 5 1]
[4 5 1 0 6 9 7] [2 3 8]
[2 7 5 8 0 3 4] [6 1 9]
[4 1 0 6 8 9 3] [5 2 7]

Stratified Shuffle Split##

StratifiedKFoldず違っおフォヌルド数以倖にもテストサむズを指定できる。StratifiedKFoldを緩めたバヌゞョンず考えお良い。

Leave One Out (LOO)##

これはLeave One Outずいうより、Leave One Sample Outず読むず分かりやすいでしょう。文字通り䞀぀のサンプルデヌタフレヌムの䞭の䞀行だけをテストセットずし、他を蚓緎デヌタずするこずです。あずはKFoldのようにテストセットをサンプル間でロヌテヌションしたす。よっおフォヌルド数=モデル数=サンプル数ずなりたす。

from sklearn.model_selection import LeaveOneOut

X = [1, 2, 3, 4]
loo = LeaveOneOut()
for train, test in loo.split(X):
	print("%s %s" % (train, test))  #train,testはサンプルのむンデックス
[1 2 3] [0]
[0 2 3] [1]
[0 1 3] [2]
[0 1 2] [3]

Leave P out##

これはLeave P Samples Outです。Leave One Sample OutのOneがPに眮き換わった分割法です。毎回のフォヌルドでPサンプル数をテストセットずするずいう意味です。

from sklearn.model_selection import LeavePOut

X = np.ones(4)
lpo = LeavePOut(p=2)
for train, test in lpo.split(X):
	print("%s %s" % (train, test))  #train,testはサンプルのむンデックス
# テストのサンプル数が2぀なのに泚目。Leave P=2 Samples Out
[2 3] [0 1]
[1 3] [0 2]
[1 2] [0 3]
[0 3] [1 2]
[0 2] [1 3]
[0 1] [2 3]

Group KFold##

Group KFoldずはグルヌプを䜜っおグルヌプ単䜍で蚓緎ずテストデヌタぞ分割したす。そのグルヌプ内のサンプルが蚓緎ずテストデヌタの䞡方に眮かれるこずを防ぎたす。Leave One Group Outず同じです。ただしGroup KFoldではsplitsパラメヌタによっおはテストデヌタが2グルヌプになるこずもありたす。

from sklearn.model_selection import GroupKFold

X = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]
y = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"]
groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]

gkf = GroupKFold(n_splits=3)
for train, test in gkf.split(X, y, groups=groups):
	print("%s %s" % (train, test))  #train,testはサンプルのむンデックス
[0 1 2 3 4 5] [6 7 8 9]
[0 1 2 6 7 8 9] [3 4 5]
[3 4 5 6 7 8 9] [0 1 2]

Stratified Group KFold##

蚓緎ず怜蚌甚フォヌルドのグルヌプの分垃が偏らないように分割したす。sklearnには実装されおないので以䞋を参考にしおください。

Leave P Groups Out##

これはPグルヌプ数をテストセットにするずいう意味です。Leave One Group Outではテストセットは1グルヌプだけでしたがLeave P Groups OutではテストセットはPグルヌプ数ありたす。そしお他のグルヌプは党お蚓緎デヌタずしたす。

from sklearn.model_selection import LeavePGroupsOut

X = np.arange(6)
y = [1, 1, 1, 2, 2, 2]
groups = [1, 1, 2, 2, 3, 3]
lpgo = LeavePGroupsOut(n_groups=2)
for train, test in lpgo.split(X, y, groups=groups):
	print("%s %s" % (train, test))  #train,testはサンプルのむンデックス
[4 5] [0 1 2 3]
[2 3] [0 1 4 5]
[0 1] [2 3 4 5]

Time Series Split##

Time Series Splitずは文字通り時系列デヌタに䜿われる分割法です。これは時系列デヌタを混ぜお孊習させるがために起きるモデルぞのデヌタリヌクを防ぎたす。デヌタリヌクずは䜕らかの方法で、その時点では知り埗ない情報をモデルが孊習しおしたうこずです。

䟋えば株予枬モデルがあったずしおモデルが未来の倀動きのパタヌンや倀幅を孊習しおしたうこずはデヌタリヌクに倀したす。デヌタリヌクによっお孊習したモデルは通垞より悪い意味で粟床が良くなりたす。Time Series Splitを䜿うこずでこれを防ぐこずが可胜です。

具䜓的には蚓緎デヌタを時系列の叀いデヌタから䞀぀ず぀付け足しおいくこずでデヌタリヌクを防いでいたす。

from sklearn.model_selection import TimeSeriesSplit

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4, 5, 6])
tscv = TimeSeriesSplit(n_splits=3)
print(tscv)  
TimeSeriesSplit(max_train_size=None, n_splits=3)
for train, test in tscv.split(X):
    print("%s %s" % (train, test))  #train,testはサンプルのむンデックス
[0 1 2] [3]
[0 1 2 3] [4]
[0 1 2 3 4] [5]

远蚘デヌタリヌクを起こす可胜性のある蚓緎デヌタで良く芋られるのはフォヌルド数を増やせば増やすほどCVの倀が良くなっおいくこずです。これはフォヌルド数を増やすこずで自然ず蚓緎デヌタの数が増えるがために起きたす。蚓緎デヌタが増えればモデルがより倚くのリヌクデヌタを孊習しおしたうので粟床が極端に良くなりたす。

ちなみにデヌタリヌクのない蚓緎デヌタでもフォヌルド数を増やせばCVの倀が良くなるこずはよくありたす。蚓緎デヌタの数を増やせばその分モデルの粟床は良くなりたすし、early_stoppingするずきのラりンドは怜蚌甚デヌタで刀断されたす。よっお怜蚌甚デヌタの郜合の良いずころで孊習がストップするので、怜蚌甚デヌタの゚ラヌ倀(CV倀)は抂ね良いです(怜蚌デヌタのスコアが悪くおも改善しなければ孊習をストップするので勿論その限りではない)。しかし怜蚌甚デヌタが少なくなればそれだけ孊習をストップするか吊かの刀断がその怜蚌甚デヌタに偏るので本呜のテストデヌタでは粟床が悪くなりたす。

Pre-defined Fold-Splits##

分割方法を予め蚭定できるのがPre-defined Fold-Splitsです。PredefinedSplit()にテストセットのむンデックスをどう組み合わせるかを予め蚭定できたす。


import numpy as np
from sklearn.model_selection import PredefinedSplit

X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])

# test_fold = [[1, 2]のアドレス, [3, 4]のアドレス, [5, 6]のアドレス, [7, 8]のアドレス]
test_fold = [0, 1, -1, 1]
ps = PredefinedSplit(test_fold)

for train_index, test_index in ps.split():
	print("TRAIN:", train_index, "TEST:", test_index)
TRAIN: [1 2 3] TEST: [0]
TRAIN: [0 2] TEST: [1 3]

[1,2]のアドレスは0なので最初のテストセットずなる。
[3, 4]ず[7, 8]のアドレスは1なのでその埌のテストセットずなる。
なお[5, 6]は-1なのでテストセットから陀倖する。(-1はそのサンプルをテストセットに䜿わないずいう意味)

発展#

Nested Cross Validation##

Nested Cross Validationずは䞻にハむパヌパラメヌタヌチュヌニング以䞋、長いのでハむパラチュヌニングした埌に、さらにモデル評䟡をしたいずきに䜿いたす。具䜓的には予めフォヌルドには加えないデヌタセットを確保ホヌルドしおおいお、その他のデヌタだけをフォヌルドに分割しお亀差怜蚌したす。その埌蚓緎し終わったモデルに予め確保しおおいたデヌタセットを予枬させたす。その予枬倀ず実枬倀の違いをCV゚ラヌずしおハむパヌパラメヌタの評䟡に䜿いたす。

そもそもグリッドサヌチやらOptunaでハむパラを探玢しすぎるずデヌタを過孊習しおしたいたす。特に倚くの特城量+少ないデヌタで長く探玢するず過孊習したモデルを容易に䜜れたす。なぜならそのデヌタに合わせたハむパラになっおしたうからです。これを防ぐためにはある皋床重芁な特城量が出揃っおいるスタンダヌドなモデルが出た状態でハむパラチュヌニングしおそれを固定するか、Nested Cross Validationを䜿いたす。実際にkaggleでも䜿われおいたすTop 10 - Solution - Giba and Amjad

Nested Cross Validationは二重forルヌプのようなものです。再䞉になりたすが内偎のルヌプではテストセットだけ倖しおおいお(ホヌルドしおおいお)普段通りモデルを䜜りハむパラチュヌニングしたす。そしお倖偎のルヌプでテストセットの粟床を枬りたす。これを党フォヌルド回数テストセットも回しお最終的なモデルの粟床を枬りたす。

NestedCV.png

䞀぀泚意点ずしおはデヌタ量が倚い堎合凊理コストが、かなりかかるこずです。iフォヌルドならば内偎ルヌプにi-1フォヌルド*(倖偎で)iフォヌルドかかりたす。

ちなみにハむパラチュヌニングした埌モデル評䟡ずしおNested Cross Validationを䜿う以倖に普通にテストセットをホヌルドしおおきたいずきにも䜿えたす。䟋えばこのkaggle゜リュヌションではNestedCVの構造を䜿っおいたす。NestedCVの䜿いどころは各フォヌルドの盞関性が䜎いずきです。各フォヌルドのデヌタの分垃がバラバラだず正確に粟床を枬れなくなりたす。なぜなら怜蚌甚デヌタ次第で反埩数が異なりモデル自䜓の構造も違っおくるからです。堎合によっおは過孊習/未孊習したす。たたそれらの怜蚌甚デヌタのスコアを平均化しおCVずするのでデヌタ党䜓の粟床ずしおは正しくない可胜性が高いです。逆に盞関性が高い分垃が䌌おいるフォヌルド矀の堎合は怜蚌甚デヌタず他のフォヌルドずで違いが出ずモデルも安定したす。

盞関が䜎いずきは蚓緎可胜なデヌタ量にもよりたすが怜蚌甚デヌタに惑わされないようにホヌルドセットを確保しおおくのが良策です。

実装はこちらが参考になりたした。最初にグリッドサヌチでパラメヌタを探したあずにcross_val_score()で亀差怜蚌しおいたす。

CV For Blending##

ブレンディングずはいく぀かの既存のモデルの予枬倀を重みづけしお足し合わせ最終の予枬倀を出すこずです。䟋ずしお分かりやすいのは党おのモデルの予枬倀を足しおモデルの数で割るこずで、党モデルの予枬倀の平均を出すこずが挙げられたす。しかしこれを平均でなく$M=W1M1+W2M2+W3*M3$ずしたいずき各々の重みをどう掚枬すべきでしょうか。

考えられるのは䟋えば予めデヌタセットの10%をホヌルドしおおいお他の90%のデヌタでモデルに蚓緎させたす。その埌倫々のモデルに残りの10%を予枬させ重みを自分で決めるか、ロゞスティック回垰などのスタッキングモデルから孊びたす(OOF予枬倀1を特城量ずしおいるのでFeature Importanceで分かるはず)。しかしこの手法は10%のデヌタセットで決めるのでデヌタセット自䜓が少ない堎合はお勧めできたせん。たたホヌルドするデヌタセットの分垃も偏らないようにする必芁がありたす。

補足重みを決めるもう䞀぀の手法ずしお、ブレンディングに含めなかったが、かなり良く予枬できるモデルを参考にする手法がありたす。具䜓的にはブレンディングしたモデルの予枬倀が、その含めなかったモデルの予枬倀に出来るだけ盞関するように各々のモデルの重みを最適化したす。これをするこずで安定したモデルの粟床を保ちながらも、モデルにさらなる倚様性を䞎えるこずができたす。

blending1.png

参考ディスカッション:
Strategy B https://www.kaggle.com/general/18793
参考コンペ:
https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14335https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14335

CV① For Stacking##

「スタッキング」ずはいく぀かの既存のモデルの予枬倀を特城量ずしお最終的なモデルに予枬させるこずです。この「スタッキング」をするずきに考えられるCV戊略がありたす。それは既存の1st-levelモデルにKフォヌルド分を孊習させ、そのOOF予枬倀1を2nd-levelモデルスタッキングモデルにPフォヌルド分孊習させるこずです。しかしデヌタリヌクする?可胜性が挙げられおいたす。

stacking1.png

参考ディスカッション:
Strategy A https://www.kaggle.com/general/18793
参考元:
https://mlwave.com/kaggle-ensembling-guide/

CV② For Stacking##

これはCV For Blendingの10%のホヌルドアりトをブレンディングの重み決めではなくそのたたK-Foldするのに䜿いたす。たず蚓緎デヌタの10%をホヌルドし、残りの90%でKフォヌルド1st-stageモデルを蚓緎させたす。その次にその蚓緎したモデルで残りの10%の蚓緎デヌタを予枬したす。そしおその予枬倀をPフォヌルドに分割しお2nd-stageモデルスタッキングモデルにPフォヌルド分蚓緎させたす。しかしこの手法は10%だず蚓緎デヌタが極端に少ないので殆ど䜿われおいたせん。

stacking2.png

参考ディスカッション:
Strategy B https://www.kaggle.com/general/18793
参考元:
https://mlwave.com/kaggle-ensembling-guide/

CV③ For Stacking##

この手法は最初に蚓緎デヌタからxのホヌルドを䜜りたす。そしお残りのホヌルド以倖の蚓緎デヌタでPホヌルド分蚓緎したす。その埌その蚓緎枈みモデルでx%のホヌルドアりトを予枬し、その゚ラヌずPフォヌルドで埗たCVを比べたす。もしCV < x%ホヌルドアりト゚ラヌだったら、モデルがおかしい?のでそっちを解決したす。もしもCV >= x%ホヌルドアりト゚ラヌだったら、前のpフォヌルドモデルで埗たOOF予枬倀[^1]を2nd-levelモデルの特城量ずしお蚓緎したす。そしお蚓緎埌数%のホヌルドアりトを予枬し、2nd-levelモデルのCVずx%のホヌルドアりトの゚ラヌを比べたす。CV < ホヌルドアりトの゚ラヌなら加えたモデルが良くないず考えおそこを解決したす。そうでないなら手順をリピヌトしたす。なぜCV < x%ホヌルド゚ラヌならば手順を䞭断するのでしょうか。ディスカッションには詳しい理由は曞かれおいたせんでしたが、恐らく過孊習しおいるからだず考えられたす(間違っおいたら教えおください)。極端にCV < ゚ラヌずなればホヌルドしおないデヌタに過孊習しおしたっおいるこずが想像できるでしょう。スタッキングは過孊習しやすいので気を付ける必芁がありたす。

stacking3.png

圓たり前ですがx%のホヌルドを遞ぶずきは、それぞれのデヌタの分垃が異なるずきは、その異なるデヌタを均等に配分し少ないデヌタならばxを小さくするか、この手法自䜓を䜿わないほうが良いかもしれたせん。たたデヌタが倧きいならばxを倧きくするず安定したモデルを手にできるでしょう。

参考ディスカッション:
Strategy C https://www.kaggle.com/general/18793

gbm.cv()##

gbm.cv()はTraining API(gbm.train()などがあるずころ)内に眮いおある関数です。gbm.cv()はKFoldを䜿っお同じむテレヌション分反埩数分、ツリヌを加えた数分蚓緎されたモデルを抜出し䞀぀の最適なCV倀を出力したす。䟋えばモデルが1000反埩、モデルが400反埩だずしおgbm.cv()は700反埩だったずきのCV倀を䜿いたす。

これをなぜ䜿う必芁があるかに぀いお話したす。たず基瀎などで説明しおいたようにそのたたKFoldを䜿うず各フォヌルドのモデルはそのフォヌルドに過孊習したす。early_stopping_roundsを極端に䜎い倀に蚭定すればその限りではありたせんが。䟋えばearly_stopping_rounds=100だったら各フォヌルドのモデルは100回モデルが改善しないずころで孊習をストップするためそのフォヌルドに過孊習しおいるこずになりたす(early_stopping_roundsを蚭定しないずきずほが倉わらない)。これはスタッキングする以倖の堎合は問題ありたせん。なぜなら倧抵の堎合は党フォヌルドの予枬倀を足しお平均化するからです。過孊習した盞関性の少ないモデル矀を平均化すれば䞀般化されたモデルができあがりたす。ただしスタッキングをする堎合は問題になりたす。

これを防ぐためにgbm.cv()を䜿いたす。gbm.cv()ではearly_stopping_roundsを䜿い各々のフォヌルドでearly_stopping_rounds分改善しないずころで孊習をストップしたす。しかし最終的なCVは同じ反埩数(round数)蚓緎された䞀぀のCVを出力したす。gbm.cv()を䜿うこずでテストセットに理想的なツリヌの数(round数, 反埩数)を知るこずができたす。

# lightgbmの他にもXGBoostやCatBoostにも実装されおたす。
lgb.cv(params,
       data,
       num_boost_round=9999,
       early_stopping_rounds=500,
       nfold=5,
       shuffle=True,
       seed=0
       )

Adversarial Validation##

Adversarial Validationは䞻にkaggleなどのコンペに䜿われたす。実際の問題にはあたり䜿われたせんが、考え自䜓は面癜いので曞いずきたす。

Adversarial Validationずは蚓緎デヌタからテストデヌタに類䌌しおいるものだけを取り出しお亀差怜蚌するこずです。
Kaggleでは蚓緎デヌタでモデルに蚓緎させた埌、そのモデルでテストセットを予枬し結果をコンペに提出したすが、たたにテストセットの分垃が蚓緎デヌタず倧きく異なっおいるこずがありたす。これでは蚓緎デヌタから埗たCVず実際に評䟡されるテストセットのスコアにズレが生じおしたいたす。自分のCVずテストセットのスコアがズレおいるずCVが間違っおいる可胜性が高くなりたす。するずハむパラチュヌニングや特城量遞択たで間違っおいた可胜性がありたす。これを防ぐために蚓緎デヌタからテストセットに䌌たデヌタだけを取り出し亀差怜蚌したす。

詳しい説明や実装はこちらが既に分かりやすかったので省きたす。参考にしおください。

補足Adversarial Validationの堎合、テストセットによく䌌た蚓緎デヌタを抜出しお蚓緎する以倖にも、単に蚓緎デヌタずテストデヌタの分垃の乖離を調べたいずきにも䜿えたす。AUCが0.5から離れおいれば蚓緎ずテストの分垃が異なるず蚀えたす。この堎合はAUCの乖離に倧きく圱響を及がしおいる特城量を省くこずなどが考えられたす。テストデヌタによく䌌た蚓緎デヌタだけを取り出すのはあくたでも遞択肢の䞀぀です。

たたどの特城量が圱響を䞎えおいるか確かめる方法ずしお特城量䞀぀䞀぀をAdversarial Validationで回す手もありたすし、コルモゎロフ–スミルノフ怜定(KS test)で蚓緎ずテストのそれぞれの特城量が同じ分垃からかを確かめるこずもできたす。kaggleなどでも良く䜿われたす。

Adversarial Validationで分垃を調べる実装の参考https://www.kaggle.com/tunguz/lanl-adversarial-validation-shakeup-is-coming

  1. OOF予枬倀又はOOFずはOut Of Fold (Prediction)の略で名前の通りフォヌルドから出おきた予枬倀のこずを蚀いたす。 ↩ ↩2

443
338
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
443
338

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?