ã¯ããã«##
亀差æ€èšŒã¯ããã®ãããã®ãããªãã®ã§ãããããè¯ãçµæãåºããšããã§ãã®ããã®ãããã®ç®çãããºã¬ãŠããŠã¯å šãŠã®é·ããééã£ãŠããããšã«ãªããŸãã亀差æ€èšŒãåæ§ã§ãã亀差æ€èšŒã®æ¹æ³ãééã£ãŠããå Žåãããè¯ãã¢ãã«ãåºæ¥ããšæã£ãŠãééã£ãŠããããšã«ãªããŸããå šãŠã®åªåã¯æ°Žã®æ³¡ã§ããã§ããã亀差æ€èšŒã¯äœãã®åé¡ãè§£ããšãã«äžçªæåã«åãçµããã®ã§ãããæ©æ¢°åŠç¿ã®äžã§äžçªéèŠãšèšã£ãŠãéèšã§ã¯ãªãã§ãããã®èšäºã§ã¯ãããªäº€å·®æ€èšŒã玹ä»ããè¯ãããã®ããããäœããããŒã¿ãµã€ãšã³ãã£ã¹ããç®æããŸãã
ç®æ¬¡##
åºç€ããçºå±ã®é ã§æžããŸããåºç€ã§ã¯äž»ã«sklearnã®ããã¥ã¡ã³ããåèã«ããçºå±ã®ãšããã§ã¯kaggleãªã©ã§å®éã«äœ¿ãããCVã®ææ³ãæžããŸããçºå±ã¯é¢çœãCVãå€ãã§ãã®ã§æ¯éåèã«ã
ãªãçè ã¯å°éå®¶ã§ã¯ãªãã®ã§ïŒäžå¿ç¢ºèªã¯ããŠãããïŒééããããããšæãããŸãããã®æã¯äžã®ã³ã¡ã³ããç·šéãªã¯ãšã¹ããé ãããšæé£ãã§ãã
åºç€
- KFold
- Stratified KFold
- Leave One Group Out (LOGO)
- Repeated KFold
- Shuffle Split
- Stratified Shuffle Split
- Leave One Out (LOO)
- Leave P out
- Group KFold
- Leave P Groups Out
- Time Series Split
- Pre-defined Fold-Splits
çºå±
- Nested Cross Validation
- CV For Blending
- CVâ For Stacking
- CVâ¡ For Stacking
- CV⢠For Stacking
- gbm.cv()
- Adversarial Validation
è¯ã䜿ãCV#
KFold##
KFoldãšã¯ããŒã¿ã»ãããKã°ã«ãŒãïŒãã©ãŒã«ãïŒã«çããåå²ããŸãããã®ãã¡ã®1ã°ã«ãŒãïŒãã©ãŒã«ãïŒããã¹ãããŒã¿ãä»ã®ã°ã«ãŒãïŒãã©ãŒã«ãïŒãèšç·ŽããŒã¿ãšãäžã€ã®ã¢ãã«ãæ§ç¯ããŸãããããKåã°ã«ãŒãéã§ãã¹ãããŒã¿ãããŒããŒã·ã§ã³ããããšã§Kåã®ã¢ãã«ãäœããŸããæçµçãªäºæž¬å€ã¯æ®ã©ã®å ŽåKåã®ã¢ãã«ã®äºæž¬å€ã®å¹³åã§æ±ºããŸãã
ãŸã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[]ã®äžã«åãµã³ãã«ã®ã€ã³ããã¯ã¹ã«å¿ããŠã°ã«ãŒããã³ããŒãæå®ããŸãã
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ã«ãŒãã®ãããªãã®ã§ããåäžã«ãªããŸããå åŽã®ã«ãŒãã§ã¯ãã¹ãã»ããã ãå€ããŠãããŠ(ããŒã«ãããŠãããŠ)æ®æ®µéãã¢ãã«ãäœããã€ãã©ãã¥ãŒãã³ã°ããŸãããããŠå€åŽã®ã«ãŒãã§ãã¹ãã»ããã®ç²ŸåºŠã枬ããŸãããããå šãã©ãŒã«ãåæ°ïŒãã¹ãã»ãããåããŠïŒæçµçãªã¢ãã«ã®ç²ŸåºŠã枬ããŸãã
äžã€æ³šæç¹ãšããŠã¯ããŒã¿éãå€ãå ŽååŠçã³ã¹ãããããªããããããšã§ãã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%ã®ããŒã¿ã»ããã§æ±ºããã®ã§ããŒã¿ã»ããèªäœãå°ãªãå Žåã¯ãå§ãã§ããŸããããŸãããŒã«ãããããŒã¿ã»ããã®ååžãåããªãããã«ããå¿ èŠããããŸãã
è£è¶³ïŒéã¿ã決ããããäžã€ã®ææ³ãšããŠããã¬ã³ãã£ã³ã°ã«å«ããªãã£ãããããªãè¯ãäºæž¬ã§ããã¢ãã«ãåèã«ããææ³ããããŸããå ·äœçã«ã¯ãã¬ã³ãã£ã³ã°ããã¢ãã«ã®äºæž¬å€ãããã®å«ããªãã£ãã¢ãã«ã®äºæž¬å€ã«åºæ¥ãã ãçžé¢ããããã«åã ã®ã¢ãã«ã®éã¿ãæé©åããŸãããããããããšã§å®å®ããã¢ãã«ã®ç²ŸåºŠãä¿ã¡ãªããããã¢ãã«ã«ãããªã倿§æ§ãäžããããšãã§ããŸãã
åèãã£ã¹ã«ãã·ã§ã³:
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ãã©ãŒã«ãååŠç¿ãããããšã§ãããããããŒã¿ãªãŒã¯ãã?å¯èœæ§ãæããããŠããŸãã
åèãã£ã¹ã«ãã·ã§ã³:
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%ã ãšèšç·ŽããŒã¿ã極端ã«å°ãªãã®ã§æ®ã©äœ¿ãããŠããŸããã
åèãã£ã¹ã«ãã·ã§ã³:
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 < ãšã©ãŒãšãªãã°ããŒã«ãããŠãªãããŒã¿ã«éåŠç¿ããŠããŸã£ãŠããããšãæ³åã§ããã§ããããã¹ã¿ããã³ã°ã¯éåŠç¿ããããã®ã§æ°ãä»ããå¿ èŠããããŸãã
åœããåã§ãã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






