Hyper Parameter Tuning with Cross Validation - jaeaehkim/trading_system_beta GitHub Wiki
Motivation
- Train data์ ๋ํด Feature Selection์ ๋ง์น๊ณ ๋ ๋ค์ Hyper Parameter Tuning์ ํ์์ ์ธ ๊ณผ์ ์ด๋ค.
- Feature๊ฐ ์ ํด์ง๊ณ ๋ ๋ค Model์ HP๋ฅผ ์ ํ๊ธฐ ์ํด CV๋ฅผ ํตํด Metric(Score function)์ ์ต๋ํ ํ๋ Parameter๋ก ์ต์ข
๊ฒฐ์ ์ง๋๋ค. ์ด์ ์ ๋ชจ๋ธ์ ๊ณผ์ ํฉ ์ํค์ง ์๊ธฐ ์ํ ๋ง์ ๊ณ ๋ฏผ์ ํ์ผ๋ฏ๋ก HP Tuning ์์
์์ ์ต๋ ์ฑ๋ฅ์ ๋ชจ๋ธ์ ์ ํํ๋ฉด ๋๋ค.
- Search ๋ฐฉ๋ฒ๋ก ์ ๋ฐฐ์ธํ
๋ฐ ์ด๊ฒ์ด Meta-Label๋ก ์ฌ๋ฌ ML ๋ชจ๋ธ ํน์ Rule-based ๋ชจ๋ธ๋ก ํ์ฅ๋๋ฉด ๊ฐ ํํธ์ ๊ณ์ ์ ์ฉํ ์ ์๊ฒ ๋๋ค.
Grid Search Cross Validation
- Grid Search๋ Hyper parameter๋ก ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด์ search ํ๋ ๋ฐฉ์์ด๋ค. CV์์ scoring function์ ๊ฐ ๊ฒฝ์ฐ๋ง๋ค ๊ณ์ฐํ์ฌ ranking์ ๋งค๊ฒจ selectionํ ์ ์๋ค.
- ๊ธฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ(Underlying structure of the data)๋ฅผ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์ ์ด๋ฅผ ํตํด ์ธ์ฌ์ดํธ๋ฅผ ์ป๋ ๋ฐฉ์์ผ๋ก ํ์ฉ ๊ฐ๋ฅํจ.
- Ensemble-Methods, Cross-Validataion-in-Model๋ฅผ ํตํด์ ์ป์ ์ง์์ ๋ฐ์ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ํํ
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.ensemble import BaggingClassifier
from scipy.stats import rv_continuous, kstest
from cv import PurgedKFold
def clfHyperFit(feat, lbl, t1, pipe_clf, param_grid, cv=3, bagging=[0, None, 1.0],
rndSearchIter=0, n_jobs=-1, pctEmbargo=0, **fit_params):
if set(lbl.values) == {0, 1}:
scoring = 'f1' # f1 for meta-labeling
else:
scoring = 'neg_log_loss' # symmetric towards all classes
# 1) hyperparameter searching, on train data
inner_cv = PurgedKFold(n_splits=cv, t1=t1, pctEmbargo=pctEmbargo)
if rndSearchIter == 0:
gs = GridSearchCV(estimator=pipe_clf, param_grid=param_grid, scoring=scoring, cv=inner_cv, n_jobs=n_jobs)
else:
gs = RandomizedSearchCV(estimator=pipe_clf, param_distributions=param_grid, scoring=scoring, cv=inner_cv, n_jobs=n_jobs, n_iter=rndSearchIter)
gs = gs.fit(feat, lbl, **fit_params).best_estimator_
# 2) fit validated model on the entirety of the data
if bagging[1] > 0:
gs = BaggingClassifier(base_estimator=TheNewPipe(gs.steps), n_estimators=int(bagging[0]), max_samples=float(bagging[1]),
max_features=float(bagging[2]), n_jobs=n_jobs)
gs = gs.fit(feat, lbl, sample_weight=fit_params[gs.base_estimator.steps[-1][0] + '__sample_weight'])
gs = Pipeline([('bag', gs)])
return gs
- ์ฝ๋ ๋ถ์
- TheNewPipe๋ Sample-Weights๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด sklearn์ Pipeline์ ์ค๋ฒ๋ผ์ด๋ฉ
- ์ต๊ทผ sklearn์์ ์
๋ฐ์ดํธ ๋์ด์์
- scoring์ Meta-Labeling ๋ฐฉ์์ ์ฐ๊ฒ ๋๋ฉด ์ข ๋ ์ธ๋ถ์ ์ผ๋ก ๊ตฌ๋ณ(primary model & sub model)ํ์ฌ ๋ชจ๋ธ์ train ํ๊ธฐ ๋๋ฌธ์ ํน์ ํด๋์ค๋ก ๋ผ๋ฒจ๋ง ๋์ด์๋ ํ๋ณธ์ด ๋๋์ผ๋ก ๋ค์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ฏ๋ก 'F1 Score'๋ก ํ๋ ๊ฒ์ ์ฝ๋์ ๋ฐ์ํ๊ณ ์ ์ฒด์ ์ธ train data์ ๋ํด์ ํ์ตํ๋ ๊ฒฝ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ๋์ผํ ์ ๋๋ก ์์ธก์ ๊ด์ฌ์ด ์์ผ๋ฏ๋ก 'accuracy' or 'neg log loss'๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. 'neg log loss'๋ฅผ ์ฐ๋ ๊ฒ์ ์ถ์ฒํ๊ณ ์ด์ ๋ ๋ค์์ ์ค๋ช
ํ๋ค.
- search space๋ param_grid๋ฅผ ํตํด ์ ์ํ๊ณ GridSearchCV, RandomizedSearchCV ์ค ์ ํํ ํ feat=X, lbl=y๋ฅผ ํตํด best_estimator๋ฅผ ์ฐพ๋๋ค.
- sample weight๋ฅผ ๋ฐ์ํ์ฌ fit
Randomized Search Cross Validation
- ์์ ์ฝ๋์์ ์ด๋ฏธ Randomized Search CV๊ฐ ๋ฐ์๋์ด ์๋ค. ์ด๊ฒ์ ์ฐ๋ ์ด์ ๋ Grid Search CV๋ ๋ณต์กํด์ง ์๋ก ๊ฐ๋นํ ์ ์๋ ์ฐ์ฐ๋.
- ์ฐ์ฐ๋์ ์ค์ด๋ฉด์ ์ข์ ํต๊ณ์ ์ฑ์ง์ ๊ฐ๋ ๋์์ ๊ฐ Hyper Parameter๋ฅผ uniform distribution์ ์ด์ฉํด์ ๋ฝ์๋ด๋ ๋ฐฉ๋ฒ์ด๊ณ ์ด๋ ์กฐํฉ์ ๊ฐ์๋ฅผ ์ฝ๊ฒ ํต์ ํ ์ ์๋ค๋ ์ธก๋ฉด์์ ์์ฃผ ์ฌ์ฉํ ์ ์๋ค. (Begstra, 2011)
Log Uniform Distribution
- ๊ฐ Hyper Parameter์ ๋ํ ๋ฆฌ์์น๋ฅผ ํตํด์ knowledge๊ฐ ์๊ธด๋ค๋ฉด Log Uniform Distribution์ ํ์ฉํ ์ ์๋ค.
- ์๋ฅผ ๋ค๋ฉด, SVM ๋ชจ๋ธ์ ๊ฒฝ์ฐ Hyper Parameter C์ ๊ฒฝ์ฐ 0.01 ~ 1์ ์ฆ๊ฐ์ 1 ~ 100์ ์ฆ๊ฐ๊ฐ ๋น์ทํ๊ฒ ๋ํ๋๋ฏ๋ก(๋ก๊ทธ์ ) ๋จ์ ๋ณ๋ก ๊ท ๋ฑํ๊ฒ ๋ฝ๋ ๊ฒ์ ๋นํจ์จ์ ์ด์ด์ ์ด๋ฐ ๋ถ๋ถ์ log ํจ์๋ฅผ ํ์ฉํด์ Hyper Parameter๋ฅผ tuning์ ๋ ๋น ๋ฅธ ์๋๋ก ์งํํ ์ ์๋ค.
Scoring and Hyper Parameter Tuning
- accuracy๋ ๋์ ํ๋ฅ ๋ก ์๋ชป๋ ๋งค์ ์์ธก ํ ๊ฒฝ์ฐ" vs "๋ฎ์ ํ๋ฅ ๋ก ์๋ชป๋ ๋งค์ ์์ธก ํ ๊ฒฝ์ฐ" ๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธ
- ํฌ์ ์ ๋ต์ด ๊ถ๊ทน์ ์ผ๋ก ๋์ ๋ฒ๊ธฐ ์ํด์๋ ๋์ ํ๋ฅ ๋ก ์์ธกํ ๊ฒฝ์ฐ๋ฅผ ์ข ๋ ์ค์ํ๊ฒ ํ์ตํด์ผ ํ๋ค.
- neg log loss์ ๊ฒฝ์ฐ๋ p_(n,k)์ ๋ ์ด๋ธ k์ ๋ํ n๋ฒ์งธ ์์ธก ํ๋ฅ ์ด๊ณ ์ด๊ฒ์ด ์์ ๋ฐ์๋์ด ์๋ค. ํ๋ฅ ์ ํฌ๊ธฐ๋ 'ํฌ์ง์
ํฌ๊ธฐ'์ ์ฐ๊ด๋์ด ์๋ค.
- y_(n,k)๋ ๋ ์ด๋ธ 1,-1์ ๊ด์ ์์ '๋ฐฉํฅ์ฑ'์ ์๋ฏธ๊ฐ ๋ค์ด๊ฐ ์๊ณ ์ด์ ์ Cross-Validataion-in-Model์ cv score function์ ํตํด sample weight๋ฅผ ์ฃผ๊ณ ์์ผ๋ฏ๋ก '์์ต๋ฅ ํฌ๊ธฐ'์ ๋ํ ์์๋ ํ์ต ๋ชฉํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค
- y_(n,k), p_(n,k) ๋ ๊ฐ์ง ์์์ ์ฌ๋ฌ ์ ์ฒ๋ฆฌ๋ฅผ ํตํด์ '๋ฐฉํฅ์ฑ', 'ํฌ์ง์
ํฌ๊ธฐ', '์์ต๋ฅ ํฌ๊ธฐ'์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์๊ณ ๊ทธ๋ฌ๋ฏ๋ก ๋จ์ํ๊ฒ accuracy๋ฅผ ์ฐ๊ธฐ ๋ณด๋ค๋ neg log loss๋ฅผ ์ฐ๋๊ฒ 'ํฌ์ ์ ๋ต ๋ชจ๋ธ'์ ๋ง๋๋ ๊ด์ ์์ ํฉ๋ฆฌ์ ์ด๋ผ ๋ณผ ์ ์์.
Application to Quant System
- Hyper parameter tuning์ ํฌ๊ฒ 3๊ฐ์ง ํํธ๋ก ๋๋๋ค๊ณ ๋ด
- Train Data๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ณผ์ ์์์ Hyper parameter
- Bar, Event, Feature, Labeling ๊ฐ๊ฐ์์ ๋ง์ Hyper Parameter๊ฐ ํ์ํจ
- Model ๋ด์ฌ Hyper Parameter
- SVM -> C, gamma
- RF -> n_estimators, max_depth, min_samples_leaf, min_weight_fraction, max_features, max_samples, max_leaf_nodes, min_impurity_decrease, class_weight, ccp_alpha
- Backtest Hyper Parameter
- bet type, bet sizing amplify, transaction fee, turn over rate, Cross Validation (k), Walk Forward update len
- Log Uniform Distribution์ ํ์ฅํด์ Bayesian์ ์ผ๋ก subjective priors๋ฅผ ๊ฐ Hyper parameter์ ๋ง๊ฒ ๋ฐ์ํ ๋ถํฌ๋ฅผ ์ด์ฉํด์ sampling ํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅ ๊ฐ๋ฅ