๋ชฉํ
- ์์ธก๋ชจ๋ธ์ ์ํ ํ ๊ฐ์ ์ ํ, ๊ทธ ๋ถํฌ๋ฅผ ํ์ธ
- train/val set ์ฌ์ด ๋๋ target/features ์ฌ์ด์ ์ผ์ด๋๋ ์ ๋ณด ๋์ถ(leakage) ์๋ฐฉ
- ์ํฉ์ ๋ง๋ ๊ฒ์ฆ ์งํ(metrics; ํ๊ฐ์งํ) ์ฌ์ฉ
๋ฐ์ดํฐ ๊ณผํ์ ์ค๋ฌด ํ๋ก์ธ์ค
- ๋น์ฆ๋์ค ๋ฌธ์
- ์ค๋ฌด์๋ค๊ณผ ๋ํ๋ฅผ ํตํด ๋ฌธ์ ๋ฐ๊ฒฌ
- ๋ฐ์ดํฐ ๋ฌธ์
- ๋ฌธ์ ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒฌ ๋ฐ ์์ง
- ๋ฐ์ดํฐ ๋ฌธ์ ํด๊ฒฐ
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์๊ฐํ
- ๋จธ์ ๋ฌ๋, ํต๊ณ
- ๋น์ฆ๋์ค ๋ฌธ์ ํด๊ฒฐ
- ๋ฐ์ดํฐ ๋ฌธ์ ํด๊ฒฐ์ ํตํด ์ค๋ฌด์๋ค๊ณผ ๋น์ฆ๋์ค ๋ฌธ์ ํด๊ฒฐ
ํ๊ฒ ์ ์ ๋ฐ ๊ทธ ๋ถํฌ ํ์ธ
- ์ง๋ํ์ต(Supervised learning)์์ ์์ธกํ ํ๊ฒ์ ์ ์
- ํ๊ฒ์ ๋ฐ๋ผ ํ๊ท(Regression) / ๋ถ๋ฅ(Classification) ๋ฌธ์ ๊ตฌ๋ถ
- ๊ตฌ๋ถ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ๋ ์กด์ฌ
- ๋ํ, ์ด์ฐํ, ์์ํ, ๋ฒ์ฃผํ ํน์ฑ์ ํ๊ท๋ฌธ์ ๋๋ ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ๋ก๋ ๋ณผ ์ ์์ต๋๋ค.
- ํ๊ท, ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ๋ค๋ ์ด์ง๋ถ๋ฅ ๋ฌธ์ ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์์) ํ๊ฒ๊ฐ์ด ๋ค์ค ํด๋์ค ๋ถ๋ฅํ์ผ๋ก ํ์ 1 ~ 5์ ์ธ ๊ฒฝ์ฐ, ์ผ์ ๊ธฐ์ค(3.5)์ ์ก๊ณ ๊ทธ ์ด์์ True(1), ๋ฏธ๋ง์ False(0)์ผ๋ก ํ๋จํ์ฌ ์ด์ง๋ถ๋ฅ ๋ฌธ์ ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
ํ)
df.describe(include='all').T
# ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํ ํต๊ณ ์์ฝ ๋ณด๋ ๊ฒ ๊ฐ๋ฅํ๊ณ .T๋ฅผ ์จ์ ์นผ๋ผ๋ช
์ด ๋ก์ฐ์, ๊ฐ ํต๊ณ๊ฐ์ด ์นผ๋ผ์ผ๋ก ๊ฐ์ ๋ณด๊ธฐ ํธํ๋ค.
์ ๋ณด ๋์(Leakage ; ๋์ถ)
- target ์ธ์ ์์ธก ์์ ์ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ํ์ต์ด ์ด๋ค์ง ๊ฒฝ์ฐ(์ฆ, ๋ฏธ๋๊ฐ ๋ฐ์๋ ํน์ฑ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ)
- Train set๊ณผ Val set์ ์์ ํ ๋ถ๋ฆฌํ์ง ๋ชปํ์ ๊ฒฝ์ฐ(์ค๋ณต๋ ๊ฒฝ์ฐ ๊ฒ์ฆ ๋จ๊ณ์์ ์ ํ๋๊ฐ ๋น์ฝ์ ์ผ๋ก ๋๊ฒ ๋์ฌ ์ ์์)
- ๋ฐ์ดํฐ์ ๋ํ ์์ ํ ํ๋จ์ด ์์ค ๋, ๋ชจ๋ธ ํ์ต ํ ํ๊ฐ๋ฅผ ์งํ ์ ์์ธก์ด 100%์ ๊ทผ์ ํ๋ค๋ฉด 'Leakage'๊ฐ ๋ฐ์ํ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ๋งค์ฐ๋งค์ฐ ๋์!!!
Q. ํ๊ฒ๊ณผ ์๊ด๊ด๊ณ๊ฐ ๋์ ํน์ฑ์ 'Leakage'๋ก ํ๋จํ ์ ์์๊น? ์๊ฐํด๋ณด๊ธฐ
๋ชจ๋ธ ํ๊ฐ์งํ(Metrics)
- ๋ณดํต Scikit-learn metrics(sklearn.metrics)์ ์ฌ๋ฌ ํ๊ฐ์งํ๋ค์ด ๋ค ์์ต๋๋ค.
- ํ๊ท(Regression)/๋ถ๋ฅ(Classification)์ ๋ฐ๋ผ ํ๊ฐ์งํ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
๋ฐ์ดํฐ ํธํฅ(accuracy๋ง์ผ๋ก ๋ชจ๋ธ ์ ๋ฅ์ ํ๋จํ๋ฉด ์๋๋ ์ด์ )
- ex) ์ ๋ฐ๋ณ ์ ๋ฌด๋ฅผ ์์ธกํ๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต์ํฌ ๋, ์๋์ ์ผ๋ก '์ค์ ๋ก ์์ ๊ฑธ๋ฆฐ ์ฌ๋๋ค์ ์'(True, 1) ๋ณด๋ค '์์ ๊ฑธ๋ฆฌ์ง ์์ ์ฌ๋๋ค์ ์'(False, 0)์ด ๋ ๋ง์ ์ ๋ฐ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์์ฐ์ค๋ฝ๊ฒ '์์ ๊ฑธ๋ฆฌ์ง ์์ ์ฌ๋๋ค์ ๋ฐ์ดํฐ'๊ฐ ๊ธฐ์ค์ด ๋์ด ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ํ์ต๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ค ํน์ ํ๋ช ๊ฐ๊ฐ์ธ์ ๋ํด ์ ๋ฐ๋ณ ์ ๋ฌด๋ฅผ ํ๋จํด์ผํ๋ฏ๋ก ์ด๋ฐ ํธํฅ์ด ๋ฐ์๋๋ฉด ์๋ฉ๋๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด target์ ๊ฐ class(True(1)/False(0))์ ๋ค๋ฅธ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํฉ๋๋ค.(๋ฐ์ดํฐ ์๊ฐ ๋ ์ ์ ์ชฝ์ ๋ฌด๊ฒ๋ฅผ ๋ ์ค์ด์ค)
- ์ถ๊ฐ) ๋ชจ๋ธ ํ์ต ์ , 0์ด 90๊ฐ/ 1์ด 10๊ฐ์ธ ํ๊ฒ์ ๋ํด ๊ธฐ์ค ๋ชจ๋ธ๋ก y_pred=0 ์ ์ธํ ํ์ฌ accuracy๋ฅผ 90%๋ผ๊ณ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ์ด ๊ฒฝ์ฐ๋, ๋ฐ์ดํฐ ์์ฒด๊ฐ 0์ด 90๊ฐ๋ก ๋ง๊ธฐ ๋๋ฌธ์ ์ ํ๋๊ฐ 90%๊ฐ ๋์จ ๊ฒ์ด๊ณ ์ด 90%๋ ์ธ๋ป ๋ณด๊ธฐ์ ๊ต์ฅํ ๋์ ์์น๊ฐ์ง๋ง ์ฐ๋ฆฌ์๊ฒ ์ ์๋ฏธํ ์์น๋ ์๋๋๋ค.
์๋์ ๊ฒฝ์ฐ True label(์ธ๋ก์ถ)์์ True๊ฐ False๋ณด๋ค ํ์ ํ ์ ์
์ ํ๋ ๋ํ 0.83์ผ๋ก ๋์๋ณด์ด์ง๋ง, True์ precision ๋ฐ recall ๊ฐ์ด ํ์ ํ ๋จ์ด์ง๋๋ค.
ROC cuve๋ y=x ์ ๊ณผ ๊ฑฐ์ ๋น์ทํ๋ฏ๋ก ์ข์ ๋ชจ๋ธ์ด ์๋์ ์ ์ ์์ต๋๋ค. (AUC score = 0.5992)
๋ถ๊ท ํ ํด๋์ค(target ๋ฐ์ดํฐ๊ฐ ํธํฅ๋์ด์๋ ๊ฒฝ์ฐ)
1) ๋ถ๋ฅ(Classification)
ํ๊ฒ๊ฐ ๋น์จ ํ์ธ
y_train.value_counts(normalize=True)
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ๋ฐ์ดํฐ ์๊ฐ ์ ์ ๋ฒ์ฃผ ๋ฐ์ดํฐ์ ์์ค์ ๊ณ์ฐํ ๋ ๊ฐ์ค์น๋ฅผ ๋ ๊ณฑํ์ฌ ๊ท ํ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ
- sklearn์ ๋ชจ๋ธ๋ค์
class_weight
๊ณผ ๊ฐ์ ํด๋์ค์ balance๋ฅผ ๋ง์ถฐ์ฃผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- sklearn์ ๋ชจ๋ธ๋ค์
- ์ ์ ๋ฒ์ฃผ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ์ํ๋ง(oversampling)ํ๊ฑฐ๋ ๋ฐ๋๋ก ๋ง์ ๋ฒ์ฃผ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฒ ์ํ๋ง(undersampling)ํ๋ ๋ฐฉ๋ฒ
1๋ฒ ๋ฐฉ๋ฒ์ ์์)
- class_weight์์ ์ํ๋ ๋น์จ์ ์ ์ฉํ๊ฑฐ๋, class_weight ='balanced' ๋๋ 'balanced_subsample'(๋ฐฉ๋ฒ์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ ๋ฐ๋ก ๊ตฌ๊ธ๋ง)
class_weight ๋น์จ์ ๊ฐ๊ฐ 0.5:0.5๋ก ๋ง์ถ๊ธฐ ์ํ ๋ฐฉ๋ฒ
# class weights ๊ณ์ฐ
# n_samples / (n_classes * np.bincount(y))
custom = len(y_train)/(2*np.bincount(y_train)) # ๊ทธ๋ฅ value_counts๋ก ํด๋ ๋ ๊ฒ ๊ฐ๋ค.
custom
# ํ์ดํ๋ผ์ธ์ ๋ง๋ค์ด ๋ด
์๋ค.
pipe = make_pipeline(
OrdinalEncoder(),
DecisionTreeClassifier(max_depth=5, class_weight={False:custom[0],True:custom[1]}, random_state=2)
)
# DecisionTreeClassifier(max_depth=5, class_weight='balanced', random_state=2) -> ์ด๊ฑด balanced ๋ฐฉ๋ฒ
์๋์ ๊ฐ์ด ์ ๋ฆฌ๋ ๋ชจ์ต
True์ precision๊ณผ recall ๊ฐ์ด ์ฆ๊ฐ
์๊ฐ์ ์ผ๋ก ํฐ ์ฐจ์ด๋ ์์ง๋ง AUC score = 0.6241 ๋ก ๋ค์ ์ฆ๊ฐํ์์ ์ ์ ์์ต๋๋ค.
ํ๊ท(Regression)
- ํ๊ฒ์ ๋ถํฌ๋ฅผ ํ์ธ(๋น๋์นญ ์ฌ๋ถ)
- ์ ํ ํ๊ท ๋ชจ๋ธ
- ์ผ๋ฐ์ ์ผ๋ก ํน์ฑ๊ณผ ํ๊ฒ๊ฐ ์ ํ๊ด๊ณ๋ฅผ ๊ฐ์
- ํน์ฑ๊ณผ ํ๊ฒ์ ๋ถํฌ๊ฐ ์ ๊ท๋ถํฌ ํํ์ผ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์
๋๋ค.
์ฆ, ํ๊ฒ์ด ์๊ณก๋ ํํ์ ๋ถํฌ(skewed)์ธ ๊ฒฝ์ฐ ์์ธก ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
sns.displot(target);
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์์ ์์๋ 'Right(Positively) skewed์ด๋ฏ๋ก ๊ฐ์ด ํฐ ์ด์์น๋ฅผ ์ ๊ฑฐํด๋ด ๋๋ค.
- ์ด๋ ์ ๋๋ ๊ฐ์ ๋์์ง๋ง ์ฌ์ ํ skewed ํฉ๋๋ค.
- ๋ก๊ทธ๋ณํ(Log-Transform) : log๋ฅผ ์ทจํด ์ ๊ท๋ถํฌ๋ก ๋ง๋ ํ, ํ์ตํ๊ณ ์ดํ ๋ค์ exponential๋ก ๋๋ ค ์๋ ๊ฐ์ผ๋ก ๋ด๋์
- ํ๊ฒ์ด right-skewed์ผ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- log1p :
ln(1 + x)
- expm1 :
exp(x) - 1
- log1p :
from category_encoders import OrdinalEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
from sklearn.compose import TransformedTargetRegressor
pipe = make_pipeline(
OrdinalEncoder(),
SimpleImputer(),
RandomForestRegressor(random_state=2)
)
tt = TransformedTargetRegressor(regressor=pipe,
func=np.log1p, inverse_func=np.expm1) # ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
tt.fit(X_train, y_train)
tt.score(X_val, y_val)
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]35.Feature Importance (0) | 2022.01.04 |
---|---|
[TIL]34.Data Wrangling (0) | 2022.01.03 |
[TIL]32.Section2 Sprint2 Chall(Sprint2 ํค์๋ ์ค์ฌ ์ ๋ฆฌ) (0) | 2021.12.31 |
[TIL]31.Model Selection(๋ชจ๋ธ ์ ํ) (0) | 2021.12.30 |
[TIL]30.Evaluation Metrics for Classification(Precision, Recall, f1score, threshold, ROC curve, AUC) (0) | 2021.12.29 |