๋ฐ์ํ
Validation Set (๊ฒ์ฆ ์ธํธ)
Test Dataset์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ชจ๋ธ์ด ๊ณผ๋์ ํฉ์ธ์ง ๊ณผ์์ ํฉ์ธ์ง ํ๋จํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ํ ์คํธ ์ธํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ด๋ฅผ ์ธก์ ํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ Training Dataset์ ๋๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ด ๋๋ Dataset๋ฅผ Validation Set (๊ฒ์ฆ ์ธํธ)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ์ ์ฒด ๋ฐ์ดํฐ์ ์ด 100%๋ผ๊ณ ํ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ์ ์ค์์ 20%๋ง Test Dataset์ผ๋ก ๋ง๋ค๊ณ , 80%๋ฅผ Train Dataset์ผ๋ก ๊ตฌ์ฑํ์ผ๋ฉด, ์ด Training Dataset์ค 20%๋ฅผ ๋ผ์ด ๋ด์ด์ Validation Dataset์ผ๋ก ๋๋๋๋ค.
- Training Dataset์์ Model์ Trainingํ๊ณ Validation Set๋ก ๋ชจ๋ธ์ ํ๊ฐํฉ๋๋ค.
- ์ด๋ฐ์์ผ๋ก Test ํ๊ณ ์ถ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ณ ์น๋ฉด์ ๊ฐ์ฅ ์ข์ ๋ชจ๋ธ์ ๊ณ ๋ฅธํ, ์ ์ฒด ๋ฐ์ดํฐ์ ์ผ๋ก ๋ชจ๋ธ์ ๋ค์ ํ๋ จํ, TestSet์ผ๋ก ๋ชจ๋ธ์ ์ต์ข ์ ์๋ฅผ ํ๊ฐํฉ๋๋ค.
- ํ๋ฒ ์์๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
import pandas as pd
wine = pd.read_csv('https://bit.ly/wine-date')
data = wine[['alcohol', 'sugar', 'ph']].to_numpy()
target = wine['class']. to_numpy()
- ๊ทธ๋ฌ๋ฉด ์ด์ Training Set, Test Set๋ฅผ ํ๋ฒ ๋๋ ๋ณด๊ฒ ์ต๋๋ค.
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)
- train_input๊ณผ train_target์ train_test_split() ํจ์์ ๋ฃ์ด ํ๋ จ ์ธํธ์ธ sub_input๊ณผ sub_target, ๊ทธ๋ฆฌ๊ณ ๊ฒ์ฆ ์ธํธ์ธ val_input๊ณผ val_target์ ๋ง๋ญ๋๋ค.
- ์ฌ๊ธฐ์ test_size ๋งค๊ฐ๋ณ์๋ฅผ 0.2๋ก ์ง์ ํ์ฌ train_input์ ์ฝ 20%๋ฅผ val_input์ผ๋ก ์ค์ ํฉ๋๋ค.
sub_input, val_input, sub_target, val_target = train_test_split(
train_input, train_target, test_size=0.2, random_state=42)
- ๊ทธํ, Training & Test Set์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
print(sub_input.shape, val_input.shape)
# (4157, 3) (1040, 3)
- ์๋ 5,197๊ฐ์๋ ํ๋ จ ์ธํธ๊ฐ 4,157๊ฐ๋ก ์ค์ด๋ค๊ณ , ๊ฒ์ฆ ์ธํธ๋ 1,040๊ฐ๊ฐ ๋์์ต๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด์ sub_input, sub_target๊ณผ val_input, val_target์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋ง๋ค๊ณ ํ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state=42)
dt.fit(sub_input, sub_target)
print(dt.score(sub_input, sub_target))
print(dt.score(val_input, val_target))
# 0.9971133028626413
# 0.864423076923077
- ์ด๋ ๊ฒ val_input๊ณผ val_target์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๊ฐํ๋ฉด ๋ฉ๋๋ค.
- ๋ณด๋ฉด ์ด ๋ชจ๋ธ์ ํ์คํ ํ๋ จ ์ธํธ์ ๊ณผ๋์ ํฉ๋์ด ์์ต๋๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ ํ์ฌ ๋ ์ข์ ๋ชจ๋ธ์ ์ฐพ์์ผ ํฉ๋๋ค.
Cross-Validation (๊ต์ฐจ ๊ฒ์ฆ)
๊ฒ์ฆ ์ธํธ๋ฅผ ๋ง๋ค๋ฉด์ ํ๋ จ ์ธํธ๊ฐ ์ค์ด๋ค์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ๋ จ์ ์ฌ์ฉํ ์๋ก ์ข์ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง๋๋ค.
- ๊ทผ๋ฐ ๊ฒ์ฆ ์ธํธ๋ฅผ ๋๋ฌด ์ ๊ฒ ๋ผ์ด๋์ผ๋ฉด ๊ฒ์ฆ ์ ์๊ฐ ๋ค์ญ๋ ์ญํ๊ณ ๋ถ์์ ํ ์ ์์ต๋๋ค.
- ์ด๋ ๊ต์ฐจ ๊ฒ์ฆ(cross-validation)์ ์ฌ์ฉํ๋ฉด ์์ ์ ์ธ ๊ฒ์ฆ ์ ์๋ฅผ ์ป๊ณ ํ๋ จ์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3-fold Cross-Validation
ํ๋ จ ์ธํธ๋ฅผ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋์ด ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๋ ๊ฒ์ 3-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฅผ ํต์นญํ์ฌ K-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ(k-fold cross-validation)์ด๋ผ๊ณ ํ๋ฉฐ, ํ๋ จ ์ธํธ๋ฅผ ๋ช ๋ถ๋ถ์ผ๋ก ๋๋๋๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ถ๋ฆ ๋๋ค. K-๊ฒน ๊ต์ฐจ ๊ฒ์ฆ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค.
- 3-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์์๋ก ๋ค์์ง๋ง, ๋ณดํต 5-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ด๋ 10-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ์ 80~90%๊น์ง ํ๋ จ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฒ์ฆ ์ธํธ๊ฐ ์ค์ด๋ค์ง๋ง, ๊ฐ ํด๋์์ ๊ณ์ฐํ ๊ฒ์ฆ ์ ์๋ฅผ ํ๊ท ํ๊ธฐ ๋๋ฌธ์ ์์ ๋ ์ ์๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค.
- Scikit-learn์๋ cross_validate()๋ผ๋ ๊ต์ฐจ ๊ฒ์ฆ ํจ์๊ฐ ์์ต๋๋ค. ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ฐ, ๋จผ์ ํ๊ฐํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค.
- ๊ทธ๋ค์ ์์์์ฒ๋ผ ์ง์ ๊ฒ์ฆ ์ธํธ๋ฅผ ๋ผ์ด๋ด์ง ์๊ณ ํ๋ จ ์ธํธ ์ ์ฒด๋ฅผ cross_validate() ํจ์์ ์ ๋ฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ์ดํท๋ฐ์๋ cross_validate() ํจ์์ ์ ์ ์ธ cross_val_score()๋ ์์ต๋๋ค.
์ด ํจ์๋ cross_validate() ํจ์์ ๊ฒฐ๊ณผ ์ค์์ test_score ๊ฐ๋ง ๋ฐํํฉ๋๋ค.
from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)
print(scores)
{'fit_time': array([0.02602839, 0.02728128, 0.04096222, 0.01634145, 0.01161575]),
'score_time': array([0.00565434, 0.01029921, 0.00742149, 0.00183392, 0.00161386]),
'test_score': array([0.86923077, 0.84615385, 0.87680462, 0.84889317, 0.83541867])}
- 3-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์์๋ก ๋ค์์ง๋ง, ๋ณดํต 5-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ด๋ 10-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ์ 80~90%๊น์ง ํ๋ จ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ ๊ฒ์ฆ ์ธํธ๋ ์ค์ด๋ค์ง๋ง, ๊ฐ ํด๋์์ ๊ณ์ฐํ ๊ฒ์ฆ ์ ์๋ฅผ ํ๊ท ํ๊ธฐ ๋๋ฌธ์ ์์ ๋ ์ ์๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค.
- ๋ํ Scikit-learn์๋ cross_validate()๋ผ๋ ๊ต์ฐจ ๊ฒ์ฆ ํจ์๊ฐ ์์ต๋๋ค.
- ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ฐ, ๋จผ์ ํ๊ฐํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค.
- ๊ทธ๋ค์ ์์์์ฒ๋ผ ์ง์ ๊ฒ์ฆ ์ธํธ๋ฅผ ๋ผ์ด๋ด์ง ์๊ณ ํ๋ จ ์ธํธ ์ ์ฒด๋ฅผ cross_validate() ํจ์์ ์ ๋ฌํฉ๋๋ค.
- ์ฐธ๊ณ ๋ก, ์ฌ์ดํท๋ฐ์๋ cross_validate() ํจ์์ ์ ์ ์ธ cross_val_score()๋ ์์ต๋๋ค.
- ์ด ํจ์๋ cross_validate() ํจ์์ ๊ฒฐ๊ณผ ์ค์์ test_score ๊ฐ๋ง ๋ฐํํฉ๋๋ค.
- ๊ต์ฐจ๊ฒ์ฆ์ ์ต์ข ์ ์๋ test_score ํค์ ๋ด๊ธด 5๊ฐ์ ์ ์๋ฅผ ํ๊ท ํ์ฌ ์ป์ ์ ์์ต๋๋ค.
import numpy as np
print(np.mean(scores['test_score']))
# 0.855300214703487
- ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๋ฉด ์ ๋ ฅํ ๋ชจ๋ธ์์ ์ป์ ์ ์๋ ์ต์์ ๊ฒ์ฆ ์ ์๋ฅผ ๊ฐ๋ ํด ๋ณผ ์ ์์ต๋๋ค.
- ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ cross_validate()๋ ํ๋ จ ์ธํธ๋ฅผ ์ฝ๊ฒ ํด๋๋ฅผ ๋๋์ง ์์ต๋๋ค.
- ์์ train_test_split() ํจ์๋ก ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ํ๋ จ ์ธํธ๋ฅผ ์ค๋นํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์์ ํ์๋ ์์ง๋ง, ๋ง์ฝ ๊ต์ฐจ ๊ฒ์ฆ์ ํ ๋ ํ๋ จ ์ธํธ๋ฅผ ์๋ ๊ฒฝ์ฐ์๋ ๋ถํ ๊ธฐ(splitter)๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
- Scikit-learn์ ๋ถํ ๊ธฐ๋ ๊ต์ฐจ ๊ฒ์ฆ์์ ํด๋๋ฅผ ์ด๋ป๊ฒ ๋๋์ง ๊ฒฐ์ ํด ์ค๋๋ค.
- cross_validate() ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ท ๋ชจ๋ธ์ผ ๊ฒฝ์ฐ KFold ๋ถํ ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ๋ถ๋ฅ ๋ชจ๋ธ์ผ ๊ฒฝ์ฐ ํ๊น ํด๋์ค๋ฅผ ๊ณจ๊ณ ๋ฃจ ๋๋๊ธฐ ์ํด StratifiedKFold๋ฅผ ์ฌ์ฉํฉ๋๋ค.
from sklearn.model_selection import StratifiedKFold
scores = cross_validate(dt, train_input, train_target, cv=StratifiedKFold())
print(np.mean(scores['test_score']))
# 0.855300214703487
- ๋ง์ฝ, 10-Fold cross validate (10-ํด๋ ๊ต์ฐจ์ ์ฆ)์ ์ํํ๋ ค๋ฉด ์๋์ ์ฝ๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
- KFold Class๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ ํฉ๋๋ค.
HyperParameter Tuning (ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋)
๋ชจ๋ธ์ด ํ์ตํ ์ ์์ด์ ์ฌ์ฉ์๊ฐ ๊ผญ ๋ชจ๋ธ์๊ฒ ์ง์ ์ ํด์ค์ผ ํ๋ ๋ถ๋ถ์ด ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ง์ ์ ํด์ค์ผ ํ๋ ๋ถ๋ถ์ HyperParameter ๋ผ๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด๋ฐ Hyperparameter๋ฅผ ํ๋ํ๋ ์์ ์ ์ด๋ป๊ฒ ํ ๊น์?
- ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ผ๋ก, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ๊ฐ์ ๊ธฐ๋ฐํ์ฌ ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
- ๊ทธ ๋ค์, Validation(๊ฒ์ฆ ์ธํธ) & Cross-Validation(๊ต์ฐจ ๊ฒ์ฆ)์ ํตํด์ ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ๊ธ์ฉ ๋ด๊ฟ๋ณด๋ ํํ๋ก ์งํํฉ๋๋ค.
- ๊ทผ๋ฐ ์์ฃผ ์ค์ํ ์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒฐ์ ํธ๋ฆฌ ๋ชจ๋ธ์์ ์ต์ ์ max_depth ๊ฐ์ ์ฐพ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
- ๊ทธ ๋ค์ max_depth๋ฅผ ์ต์ ์ ๊ฐ์ผ๋ก ๊ณ ์ ํ๊ณ min_samples_split์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ต์ ์ ๊ฐ์ ์ฐพ์ต๋๋ค.
- ์ด๋ ๊ฒ ํ ๋งค๊ฐ๋ณ์์ ์ต์ ๊ฐ์ ์ฐพ๊ณ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์์ ์ต์ ๊ฐ์ ์ฐพ์๋ ๋ ๊น์?
- ์๋๋๋ค. max_depth์ ์ต์ ๊ฐ์ min_samples_split ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋ฐ๋๋ฉด ํจ๊ป ๋ฌ๋ผ์ง๋๋ค.
- ์ฆ, ์ด ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋์์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ต์ ์ ๊ฐ์ ์ฐพ์์ผ ํฉ๋๋ค.
- ๊ฒ๋ค๊ฐ ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ง๋ฉด ๋ฌธ์ ๋ ๋ ๋ณต์กํด์ง๋๋ค.
- ํ์ด์ฌ์ for ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ด๋ฐ ๊ณผ์ ์ ์ง์ ๊ตฌํํ ์ ์์ง๋ง, Scikit-learn์์ ์ ๊ณตํ๋ ๊ทธ๋ฆฌ๋ ์์น(GridSearch)๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
from sklearn.model_selection import GridSearchCV
params = {'min_impurity_decrease': [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}
- ํ๋ฒ GridSearchCV ํด๋์ค๋ฅผ ๊ฐ์ ธ์์ ํ์ํ ๋งค๊ฐ๋ณ์๋ฐ ํ์ํ ๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ๋์ ๋๋ฆฌํํ, 5๊ฐ์ ๊ฐ์ผ๋ก ํ ์คํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
- GridSearchCV ํด๋์ค์ ํ์ ๋์ ๋ชจ๋ธ & Params ๋ณ์๋ฅผ ์ ๋ฌํ์ฌ GridSearch ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params,n_jobs=-1)
- ๊ทธ ๋ค์ ์ผ๋ฐ ๋ชจ๋ธ์ ํ๋ จํ๋ ๊ฒ์ฒ๋ผ gs ๊ฐ์ฒด์ fit() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ทธ๋ฆฌ๋ ์์น ๊ฐ์ฒด๋ ๊ฒฐ์ ํธ๋ฆฌ ๋ชจ๋ธ์ min_impurity_decrease ๊ฐ์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ด 5๋ฒ ์คํํฉ๋๋ค.
- GridSearchCV์ cv ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ 5์ ๋๋ค. ๋ฐ๋ผ์ min_impurity_decrease ๊ฐ๋ง๋ค 5-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด (5 x 5 = 25)๊ฐ์ ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
gs.fit(train_input, train_target)
- ์ฌ์ดํท๋ฐ์ ๊ทธ๋ฆฌ๋ ์์น๋ ํ๋ จ์ด ๋๋๋ฉด 25๊ฐ์ ๋ชจ๋ธ ์ค์์ ๊ฒ์ฆ ์ ์๊ฐ ๊ฐ์ฅ ๋์ ๋ชจ๋ธ์ ๋งค๊ฐ๋ณ์ ์กฐํฉ์ผ๋ก ์ ์ฒด ํ๋ จ ์ธํธ์์ ์๋์ผ๋ก ๋ค์ ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
- ์ด ๋ชจ๋ธ์ gs ๊ฐ์ฒด์ best_estimator_ ์์ฑ์ ์ ์ฅ๋์ด ์์ต๋๋ค.
- ์ด ๋ชจ๋ธ์ ์ผ๋ฐ ๊ฒฐ์ ํธ๋ฆฌ์ฒ๋ผ ๋๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
dt = gs.best_estimator_
print(dt.score(train_input, train_target))
print(gs.best_params_)
# 0.9615162593804117
# {'min_impurity_decrease': 0.0001}
- GridSearch๋ก ์ฐพ์ ์ต์ ์ ๋งค๊ฐ๋ณ์๋ best_params_ ์์ฑ์ ์ ์ฅ๋์ด ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด๋ฒ์ 5๋ฒ์ ๊ต์ฐจ์ ์ฆ์ผ๋ก ์ป์ ์ ์๋ฅผ ์ถ๋ ฅํด ๋ณด๊ฒ ์ต๋๋ค.
print(gs.cv_results_['mean_test_score'])
# [0.86819297 0.86453617 0.86492226 0.86780891 0.86761661]
- ์ฒซ ๋ฒ์งธ ๊ฐ์ด ๊ฐ์ฅ ํฐ ๊ฒ ๊ฐ๊ตฐ์. ์๋์ผ๋ก ๊ณ ๋ฅด๋ ๊ฒ๋ณด๋ค ๋ํ์ด argmax() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฅ ํฐ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
- ๊ทธ๋ค์ ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด params ํค์ ์ ์ฅ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
- ์ด ๊ฐ์ด ์ต์์ ๊ฒ์ฆ ์ ์๋ฅผ ๋ง๋ ๋งค๊ฐ๋ณ์ ์กฐํฉ์ ๋๋ค. ์์์ ์ถ๋ ฅํ gs.best_params_์ ๋์ผํ์ง ํ์ธํด ๋ณด์ธ์.
best_index = np.argmax(gs.cv_results_['mean_test_score'])
print(gs.cv_results_['params'][best_index])
# {'min_impurity_decrease': 0.0001}
๊ทธ๋ฌ๋ฉด ์์ ๊ณผ์ ์ ํ๋ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋จผ์ ํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค.
- ๊ทธ๋ค์ ํ๋ จ ์ธํธ์์ ๊ทธ๋ฆฌ๋ ์์น๋ฅผ ์ํํ์ฌ ์ต์์ ํ๊ท ๊ฒ์ฆ ์ ์๊ฐ ๋์ค๋ ๋งค๊ฐ๋ณ์ ์กฐํฉ์ ์ฐพ์ต๋๋ค.
- ์ด ์กฐํฉ์ ๊ทธ๋ฆฌ๋ ์์น ๊ฐ์ฒด์ ์ ์ฅ๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๋ ์์น๋ ์ต์์ ๋งค๊ฐ๋ณ์์์ (๊ต์ฐจ ๊ฒ์ฆ์ ์ฌ์ฉํ ํ๋ จ ์ธํธ๊ฐ ์๋๋ผ) ์ ์ฒด ํ๋ จ ์ธํธ๋ฅผ ์ฌ์ฉํด ์ต์ข
๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
- ์ด ๋ชจ๋ธ๋ ๊ทธ๋ฆฌ๋ ์์น ๊ฐ์ฒด์ ์ ์ฅ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋ฉด, ์ด๋ฒ์๋ ๋ ๋ณต์กํ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ํด ๋ณด๊ฒ ์ต๋๋ค.
- ๊ฒฐ์ ํธ๋ฆฌ์์ min_impurity_decrease๋ ๋ ธ๋๋ฅผ ๋ถํ ํ๊ธฐ ์ํ ๋ถ์๋ ๊ฐ์ ์ต์๊ฐ์ ์ง์ ํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ค๊ฐ max_depth๋ก ํธ๋ฆฌ์ ๊น์ด๋ฅผ ์ ํํ๊ณ min_samples_split์ผ๋ก ๋ ธ๋๋ฅผ ๋๋๊ธฐ ์ํ ์ต์ ์ํ ์๋ ๊ณจ๋ผ ๋ณด๊ฒ ์ต๋๋ค.
- ๋ํ์ด arange() ํจ์(โ )๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์ ๊ฐ์์ ์์ํ์ฌ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋๋ฌํ ๋๊น์ง ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ฉ ๊ณ์ ๋ํ ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค.
- ์ฝ๋์์๋ 0.0001์์ ์์ํ์ฌ 0.001์ด ๋ ๋๊น์ง 0.0001์ ๊ณ์ ๋ํ ๋ฐฐ์ด์ ๋๋ค.
- ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ํฌํจ๋์ง ์์ผ๋ฏ๋ก ๋ฐฐ์ด์ ์์๋ ์ด 9๊ฐ์ ๋๋ค.
- ํ์ด์ฌ range() ํจ์(โก)๋ ๋น์ทํฉ๋๋ค. ํ์ง๋ง ์ด ํจ์๋ ์ ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด ๊ฒฝ์ฐ max_depth๋ฅผ 5์์ 20๊น์ง 1์ฉ ์ฆ๊ฐํ๋ฉด์ 15๊ฐ์ ๊ฐ์ ๋ง๋ญ๋๋ค.
- min_samples_split์ 2์์ 100๊น์ง 10์ฉ ์ฆ๊ฐํ๋ฉด์ 10๊ฐ์ ๊ฐ์ ๋ง๋ญ๋๋ค.
- ๋ฐ๋ผ์ ์ด ๋งค๊ฐ๋ณ์๋ก ์ํํ ๊ต์ฐจ ๊ฒ์ฆ ํ์๋ 9 × 15 × 10 = 1,350๊ฐ์ ๋๋ค.
- ๊ธฐ๋ณธ 5-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๋ฏ๋ก ๋ง๋ค์ด์ง๋ ๋ชจ๋ธ์ ์๋ 6,750๊ฐ ์ ๋๋ค.
- ํ๋ฒ, n_jobs ๋งค๊ฐ๋ณ์๋ฅผ -1๋ก ์ค์ ํ๊ณ ๊ทธ๋ฆฌ๋ ์์น๋ฅผ ์คํํด ๋ณธํ, ์ต์์ ๋งค๊ฐ๋ณ์ ์กฐํฉ์ด๋ ๊ต์ฐจ์ ์ฆ ์ ์๋ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
params = {'min_impurity_decrease': np.arange(0.0001, 0.001, 0.0001),
'max_depth': range(5, 20, 1),
'min_samples_split': range(2, 100, 10)
}
gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)
gs.fit(train_input, train_target)
print(gs.best_params_)
print(np.max(gs.cv_results_['mean_test_score']))
# {'max_depth': 14, 'min_impurity_decrease': 0.0004, 'min_samples_split': 12}
# 0.8683865773302731
GridSearchCV ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ผ์ผ์ด ๋ฐ๊พธ๋ฉฐ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ์ง ์๊ณ ์ํ๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋์ดํ ๋ค์, ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํด์ ์ต์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
Random Search (๋๋ค ์์น)
- ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ์์น์ผ ๋ ๊ฐ์ ๋ฒ์๋ ๊ฐ๊ฒฉ์ ๋ฏธ๋ฆฌ ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ ๋๋ฌด ๋ง์ ๋งค๊ฐ๋ณ์ ์กฐ๊ฑด์ด ์์ด ๊ทธ๋ฆฌ๋ ์์น ์ํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ด๋ด ๋ ๋๋ค ์์น(Random Search)๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค.
- ๋๋ค ์์น์๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ชฉ๋ก์ ์ ๋ฌํ๋ ๊ฒ์ด ์๋๋ผ ๋งค๊ฐ๋ณ์๋ฅผ ์ํ๋งํ ์ ์๋ ํ๋ฅ ๋ถํฌ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ํ๋ฅ ๋ถํฌ(probability distribution)๋ ๋ฌด์์ ๊ฐ์ ๋ฝ์ ์ ์๋ ๋ฒ์๋ฅผ ๋งํฉ๋๋ค.
from scipy.stats import uniform, randint
- Scipy์ stats ์๋ธ ํจํค์ง์ ์๋ uniform๊ณผ randint ํด๋์ค๋ ๋ชจ๋ ์ฃผ์ด์ง ๋ฒ์์์ ๊ณ ๋ฅด๊ฒ ๊ฐ์ ๋ฝ์ต๋๋ค.
- randint๋ ์ ์๊ฐ์ ๋ฝ๊ณ , uniform์ ์ค์๊ฐ์ ๋ฝ์ต๋๋ค. ๊ท ๋ฑ ๋ถํฌ์์ ์ํ๋งํ๋ค๊ณ ๋งํฉ๋๋ค.
- 0์์ 10 ์ฌ์ด์ ๋ฒ์๋ฅผ ๊ฐ๋ randint ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ 10๊ฐ์ ์ซ์๋ฅผ ์ํ๋งํด ๋ณด๊ฒ ์ต๋๋ค.
rgen = randint(0, 10)
rgen.rvs(10)
array([0, 6, 5, 1, 4, 0, 9, 4, 0, 3])
10๊ฐ๋ฐ์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ณ ๋ฅด๊ฒ ์ํ๋ง๋๋ ๊ฒ ๊ฐ์ง ์์ง๋ง ์ํ๋ง ์ซ์๋ฅผ ๋๋ฆฌ๋ฉด ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
1,000๊ฐ๋ฅผ ์ํ๋งํด์ ๊ฐ ์ซ์์ ๊ฐ์๋ฅผ ์ธ์ด ๋ณด๊ฒ ์ต๋๋ค.
np.unique(rgen.rvs(1000), return_counts=True)
# (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
# array([ 95, 90, 92, 98, 130, 86, 104, 116, 92, 97]))
- ๊ฐ์๊ฐ ๋์ด๋๋ 0์์ 9๊น์ง์ ์ซ์๊ฐ ์ด๋ ์ ๋ ๊ณ ๋ฅด๊ฒ ์ถ์ถ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- uniform ํด๋์ค์ ์ฌ์ฉ๋ฒ๋ ๋์ผํฉ๋๋ค. 0~1 ์ฌ์ด์์ 10๊ฐ์ ์ค์๋ฅผ ์ถ์ถํด ๋ณด๊ฒ ์ต๋๋ค.
ugen = uniform(0, 1)
ugen.rvs(10)
# array([0.94577774, 0.89877912, 0.63212905, 0.32615542, 0.37558058,
# 0.47341714, 0.16045226, 0.83559588, 0.26931821, 0.43901825])
- ๋์ ๋ฐ์๊ธฐ๋ฅผ ์ ์ฌํ๊ฒ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
- ๋๋ค ์์น์ randint์ uniform ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์ด ๋ช ๋ฒ ์ํ๋งํด์ ์ต์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐพ์ผ๋ผ๊ณ ๋ช ๋ นํ ์ ์์ต๋๋ค.
- ์ํ๋ง ํ์๋ ์์คํ ์์์ด ํ๋ฝํ๋ ๋ฒ์ ๋ด์์ ์ต๋ํ ํฌ๊ฒ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ํ์ํ ๋งค๊ฐ๋ณ์์ ๋์ ๋๋ฆฌ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
- ์ฌ๊ธฐ์์๋ min_samples_leaf ๋งค๊ฐ๋ณ์๋ฅผ ํ์ ๋์์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
- ์ด ๋งค๊ฐ๋ณ์๋ ๋ฆฌํ ๋ ธ๋๊ฐ ๋๊ธฐ ์ํ ์ต์ ์ํ์ ๊ฐ์์ ๋๋ค.
- ์ด๋ค ๋ ธ๋๊ฐ ๋ถํ ํ์ฌ ๋ง๋ค์ด์ง ์์ ๋ ธ๋์ ์ํ ์๊ฐ ์ด ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ๋ถํ ํ์ง ์์ต๋๋ค.
params = {'min_impurity_decrease': uniform(0.0001, 0.001),
'max_depth': randint(20, 50),
'min_samples_split': randint(2, 25),
'min_samples_leaf': randint(1, 25),
}
- min_imputiry_decrease๋ 0.0001์์ 0.001 ์ฌ์ด์ ์ค์ซ๊ฐ์ ์ํ๋งํฉ๋๋ค.
- max_depth๋ 20์์ 50 ์ฌ์ด์ ์ ์, min_samples_split์ 2์์ 25 ์ฌ์ด์ ์ ์, min_samples_leaf๋ 1์์ 25 ์ฌ์ด์ ์ ์๋ฅผ ์ํ๋งํฉ๋๋ค.
- ์ํ๋ง ํ์๋ ์ฌ์ดํท๋ฐ์ ๋๋ค ์์น ํด๋์ค์ธ RandomizedSearchCV์ n_iter ๋งค๊ฐ๋ณ์์ ์ง์ ํฉ๋๋ค.
from sklearn.model_selection import RandomizedSearchCV
gs = RandomizedSearchCV(DecisionTreeClassifier(random_state=42), params,
n_iter=100, n_jobs=-1, random_state=42)
gs.fit(train_input, train_target)
- params์ ์ ์๋ ๋งค๊ฐ๋ณ์ ๋ฒ์์์ ์ด 100๋ฒ(n_iter ๋งค๊ฐ๋ณ์)์ ์ํ๋งํ์ฌ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๊ณ ์ต์ ์ ๋งค๊ฐ๋ณ์ ์กฐํฉ์ ์ฐพ์ต๋๋ค. ์์ ๊ทธ๋ฆฌ๋ ์์น๋ณด๋ค ์๋ฑํ ๊ต์ฐจ ๊ฒ์ฆ ์๋ฅผ ์ค์ด๋ฉด์ ๋์ ์์ญ์ ํจ๊ณผ์ ์ผ๋ก ํ์ํ ์ ์์ต๋๋ค.
print(gs.best_params_)
# {'max_depth': 39, 'min_impurity_decrease': 0.00034102546602601173,
# 'min_samples_leaf': 7, 'min_samples_split': 13}
- ์ต๊ณ ์ ๊ต์ฐจ ๊ฒ์ฆ ์ ์ & ํ ์คํธ ์ธํธ์ ์ฑ๋ฅ๋ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
print(np.max(gs.cv_results_['mean_test_score']))
# 0.8695428296438884
dt = gs. best_estimator_
print(dt.score(test_input, test_target))
# 0.86
- ํ ์คํธ์ธํธ ์ ์๋ ๊ฒ์ฆ์ธํธ์ ๋ํ ์ ์๋ณด๋ค ์กฐ๊ธ ์์๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
Summary
Keywords
- ๊ฒ์ฆ ์ธํธ๋ ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋์ ์ํด ๋ชจ๋ธ์ ํ๊ฐํ ๋, ํ ์คํธ ์ธํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด ํ๋ จ ์ธํธ์์ ๋ค์ ๋ผ์ด๋ธ ๋ฐ์ดํฐ ์ธํธ์ ๋๋ค.
- ๊ต์ฐจ ๊ฒ์ฆ์ ํ๋ จ ์ธํธ๋ฅผ ์ฌ๋ฌ ํด๋๋ก ๋๋ ๋ค์, ํ ํด๋๊ฐ ๊ฒ์ฆ ์ธํธ์ ์ญํ ์ ํ๊ณ ๋๋จธ์ง ํด๋์์๋ ๋ชจ๋ธ์ ํ๋ จํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ต์ฐจ ๊ฒ์ฆ์ ํตํด ๋ชจ๋ ํด๋์ ๋ํด ๊ฒ์ฆ ์ ์๋ฅผ ์ป์ด ํ๊ฐํฉ๋๋ค.
- ๊ทธ๋ฆฌ๋ ์์น๋ ํ์ดํผํ๋ผ๋ฏธํฐ ํ์์ ์๋ํํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค. ํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ๋์ดํ๋ฉด ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ์ฌ ๊ฐ์ฅ ์ข์ ๊ฒ์ฆ ์ ์์ ๋งค๊ฐ๋ณ์ ์กฐํฉ์ ์ ํํ๊ณ , ๋ง์ง๋ง์ผ๋ก ์ด ๋งค๊ฐ๋ณ์ ์กฐํฉ์ผ๋ก ์ต์ข ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
- ๋๋ค ์์น๋ ์ฐ์๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ ํ์ํ ๋ ์ ์ฉํฉ๋๋ค. ํ์ํ ๊ฐ์ ์ง์ ๋์ดํ๋ ๊ฒ์ด ์๋๋ผ, ํ์๊ฐ์ ์ํ๋งํ ์ ์๋ ํ๋ฅ ๋ถํฌ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ์ง์ ๋ ํ์๋งํผ ์ํ๋งํ์ฌ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์์คํ ์์์ด ํ๋ฝํ๋ ๋งํผ ํ์๋์ ์กฐ์ ํ ์ ์์ต๋๋ค.
ํต์ฌ ํจํค์ง์ ํจ์
- cross_validate(): ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๋ ํจ์์
๋๋ค.
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ณ , ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ํน์ฑ๊ณผ ํ๊น ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
- scoring ๋งค๊ฐ๋ณ์์ ๊ฒ์ฆ์ ์ฌ์ฉํ ํ๊ฐ์งํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ฅ ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ์๋ฏธํ๋ 'accuracy', ํ๊ท ๋ชจ๋ธ์ ๊ฒฐ์ ๊ณ์๋ฅผ ์๋ฏธํ๋ 'r2'๊ฐ ๋ฉ๋๋ค.
- cv ๋งค๊ฐ๋ณ์์๋ ๊ต์ฐจ ๊ฒ์ฆ ํด๋ ์๋ ์คํ๋ฆฌํฐ ๊ฐ์ฒด๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ 5์ ๋๋ค. ํ๊ท์ผ ๋๋ KFold ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ , ๋ถ๋ฅ์ผ ๋๋ StratifiedKFold ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ 5-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํฉ๋๋ค.
- n_jobs ๋งค๊ฐ๋ณ์๋ ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ ๋ ์ฌ์ฉํ CPU ์ฝ์ด ์๋ฅผ ์ง์ ํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค.
- 1๋ก ์ง์ ํ๋ฉด ์์คํ ์ ์๋ ๋ชจ๋ ์ฝ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. return_train_score ๋งค๊ฐ๋ณ์๋ฅผ True๋ก ์ง์ ํ๋ฉด ํ๋ จ ์ธํธ์ ์ ์๋ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ False์ ๋๋ค.
- GridSearchCV: ๊ต์ฐจ ๊ฒ์ฆ์ผ๋ก ํ์ดํผํ๋ผ๋ฏธํฐ ํ์์ ์ํํฉ๋๋ค.
- ์ต์์ ๋ชจ๋ธ์ ์ฐพ์ ํ ํ๋ จ ์ธํธ ์ ์ฒด๋ฅผ ์ฌ์ฉํด ์ต์ข ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ทธ๋ฆฌ๋ ์์น๋ฅผ ์ํํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ณ , ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ํ์ํ ๋ชจ๋ธ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ ๋ฌํฉ๋๋ค.
- scoring, cv, n_jobs, return_train_score ๋งค๊ฐ๋ณ์๋ cross_validate() ํจ์์ ๋์ผํฉ๋๋ค.
- RandomizedSearchCV: ๊ต์ฐจ ๊ฒ์ฆ์ผ๋ก ๋๋คํ ํ์ดํผํ๋ผ๋ฏธํฐ ํ์์ ์ํํฉ๋๋ค.
- ์ต์์ ๋ชจ๋ธ์ ์ฐพ์ ํ ํ๋ จ ์ธํธ ์ ์ฒด๋ฅผ ์ฌ์ฉํด ์ต์ข ๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ทธ๋ฆฌ๋ ์์น๋ฅผ ์ํํ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๊ณ , ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ํ์ํ ๋ชจ๋ธ์ ๋งค๊ฐ๋ณ์์ ํ๋ฅ ๋ถํฌ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํฉ๋๋ค.
- scoring, cv, n_jobs, return_train_score ๋งค๊ฐ๋ณ์๋ cross_validate() ํจ์์ ๋์ผํฉ๋๋ค.
๋ฐ์ํ
'๐น๏ธ ํผ๊ณต๋จธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํผ๊ณต๋จธ์ ] Tree's Ensemble - Extra Tree (์์คํธ๋ผ ํธ๋ฆฌ) (0) | 2024.07.30 |
---|---|
[ํผ๊ณต๋จธ์ ] Tree's Ensemble - Random Forest (๋๋ค ํฌ๋ ์คํธ) (0) | 2024.07.30 |
[ํผ๊ณต๋จธ์ ] Decision Tree (๊ฒฐ์ ํธ๋ฆฌ) (0) | 2023.11.06 |
[ํผ๊ณต๋จธ์ ] Stochastic Gradient Descent (ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ) (0) | 2023.11.05 |
[ํผ๊ณต๋จธ์ ] Logistic Regression (๋ก์ง์คํฑ ํ๊ท) (0) | 2023.09.25 |