Introduction
โข
์ง๋ ํ์ต์์๋ ์๋ก์ด ๊ด์ธก๊ฐ์ ๋ํ ๋ชจ๋ธ์ ์ฑ๋ฅ์ด ์ค์ํจ.
โข
์ด๋ฅผ ํ๊ฐํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ์ฌ ์ฌ์ฉํ๋ฉฐ, ์ด๋ ๋ค์ํ ํ๊ฐ ์งํ๋ฅผ ์ ์ฉํ ์ ์์.
์์ธก ์ฑ๋ฅ ํ๊ฐ
โข
์์ธก ์ ํ์ฑ์ ์ ํฉ๋์ ๋์ผํ ๊ฐ๋
์ด ์๋.
โฆ
์ฌ๊ธฐ์ ์ ํฉ๋๋, ์ถ์ ํ ๋ชจ๋ธ์ด ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ์ ์ค๋ช
ํ๋๊ฐ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ผ๋ก, ๋ํ์ ์ผ๋ก ํ๊ท๋ถ์์์ ๊ฐ ์๋ค.
โข
์ ํฉ๋ ๋ชจ๋ธ์ ์์ธก ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ์ฒ๋๊ฐ ์ฌ์ฉ๋๋ฉฐ, ๊ฐ ์ฒ๋๋ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธก์ ๋๋ค.
โข
Naive Benchmark
โฆ
์๋ฌด๋ฐ ๋ชจ๋ธ๋ ์ฐ์ง ์๊ณ , ์ต์ํ์ผ๋ก ์์ธกํ๋ ๊ธฐ์ค์
โฆ
์ผ๋ฐ์ ์ผ๋ก ํ๊ท ๊ฒฐ๊ณผ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ๋ค
โช
์๋ก์ด ๋ฐ์ดํฐ์ ๋ํด ๋ชจ๋ธ์ด ํญ์ ํ์ต ๋ฐ์ดํฐ์ ํ๊ท ์ผ๋ก ์์ธกํ ๋์ ์ค์ฐจ๋ฅผ baseline์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ
โข
์์ธก ์ ํ์ฑ ์ฒ๋
โฆ
(์์ธก ์ค์ฐจ) =
โช
์์นํ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ ์์ธก๊ณผ ์ค์ ๋ฐ์ดํฐ ์ฌ์ด์ ์ฐจ์ด๋ก ์ ์๋๋ค.
โฆ
MAE (ํ๊ท ์ ๋ ์ค์ฐจ)
โช
โฆ
ํ๊ท ์ค์ฐจ
โช
์ค์ฐจ์ ๋ถํธ๊ฐ ์ ์ง ๋จ
โช
ํ๊ท ์ ์ผ๋ก ์์ธก์ด ์ค์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฏธ๋ฌ๋๋์ง, ๋์ด์๋์ง๋ฅผ ๋ํ๋ธ๋ค.
โช
โฆ
MPE
โช
โฆ
MAPE
โช
โฆ
SSE
โช
โช
๋ฐ์ดํฐ์ ์์ด ๋๋ฉด ์ค์ฐจ ์ญ์ ๋์์ ๋์ด๋๋ค๋ ๋จ์ ์ด ์กด์ฌํจ
โฆ
MSE
โช
โฆ
RMSE
โช
โช
๋ฐ์ดํฐ ์์ ๊ด๊ณ์์ด ์ค์ฐจ ํฌ๊ธฐ๊ฐ ์ผ์ ํ๋ฉฐ, ์๋ณธ ๋ฐ์ดํฐ์ ๋์ผํ ๋จ์
import math
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
df = pd.read_csv('dmba/ToyotaCorolla.csv')
exclude = ('Price', 'ID', "Model", 'Fuel_Type','Color')
predictors = [ i for i in df.columns if i not in exclude]
out = 'Price'
X =df[predictors]
y = df[out]
trn_x, val_x, trn_y, val_y = train_test_split(X, y, test_size=0.4, random_state= 1)
reg = LinearRegression()
reg.fit(trn_x, trn_y)
y = val_y
hat_y = reg.predict(val_x)
e = y - hat_y
#MAE
MAE = abs(e).mean()
MSE = (e**2).mean()
RMSE = math.sqrt(MSE)
Python
๋ณต์ฌ
โข
Train/Validation Error
โฆ
ํ์ต ๋ฐ์ดํฐ์์์ ์ค์ฐจ๋ ๋ชจ๋ธ์ ํ์ต ์ ๋๋ฅผ ๋ํ๋ธ๋ค.
โฆ
๊ฒ์ฆ ๋ฐ์ดํฐ์์์ ์ค์ฐจ๋ ๋ชจ๋ธ์ ์๋ก์ด ๊ด์ธก๊ฐ์์์ ์ฑ๋ฅ์ ๋ํ๋ธ๋ค.
โฆ
ํ์ต ๋ฐ์ดํฐ์์์ ์ค์ฐจ๋ ๋ฎ์ผ๋, ๊ฒ์ฆ ๋ฐ์ดํฐ์์์ ์ค์ฐจ๋ ๋์ ๊ฒฝ์ฐ โ ๊ณผ์ ํฉ(Overfitting)
โข
Cumulative gains chart and lift chart (์ฐ์ํ)
โฆ
์๋ก์ด ๊ด์ธก๊ฐ์์ ๋์ ์์ธก ๊ฐ์ด ๊ฐ์ฅ ํฐ ๊ด์ธก๊ฐ๋ค์ ๋ถ๋ถ์งํฉ์ ์ฐพ๋ ๋ฐฉ๋ฒ
โฆ
๋์ ์ด๋ ์ฐจํธ
1.
์์ธก๊ฐ์ ๋ฐ๋ผ ๋์ ๊ฐ๋ถํฐ ๋ฎ์ ๊ฐ ์์๋ก ์ ๋ ฌ
2.
๋์ ๋ ์ค์ ๊ฐ์ y์ถ label, ๋์ ๋ ๊ด์ธก ๊ฐ์ ์๋ฅผ x์ถ label๋ก ํ์ฌ ๊ทธ๋ํ ์์ฑ
3.
๋น๊ต ๋์์ผ๋ก Naive Benchmark ์ฌ์ฉ
โ ์ฌ๊ธฐ์ Naive Benchmark๋ ์
๋ ฅ์ ๋ํ ์์ธก์ด ํญ์ ์ค์ ๊ฐ์ ํ๊ท ์ด๋ฏ๋ก, ๋์ ์ด๋ ์ฐจํธ๊ฐ ์ด ๋๊ฐ์ ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง์๋ก ๋ชจ๋ธ์ด ๋์ ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์ง๋ ๊ด์ธก๊ฐ์ ์ ์ ํ ์์ธกํ๊ณ ์์์ ๋ํ๋ธ๋ค.
โฆ
Lift
โช
๊ฐ ๋ถ์ ๊ทธ๋ฃน์ ๋ํด ์์์ ๊ทธ๋ฃน์ ์ ํํด์ ์ป๋ ์ด๋์ ๋ํ ๋ชจ๋ธ๋ก ์ ํ๋ ๊ทธ๋ฃน์ ํตํด ์ป๋ ์ด๋์ ๋น
โช
์๋ฅผ ๋ค์ด ์์์ ์๋์ฐจ 57๋๋ฅผ ํ๋งคํ์ฌ ์ป์ ์ ์๋ ๊ธ์ก์ด 100์ด๊ณ , ๋ชจ๋ธ์ ํตํด ์ ํ๋ ์์ 10% ๊ทธ๋ฃน (57๋)๋ฅผ ํ๋งคํ์ฌ ์ป์ ์ ์๋ ๊ธ์ก์ด 200์ด๋ผ๋ฉด Lift = 2
โช
์ด Lift๋ฅผ y์ถ์ผ๋ก ๊ทธ๋ฃน์ ๋ถ์๋ฅผ x์ถ์ผ๋ก ํ์ฌ ๊ทธ๋ฆฐ ์ฐจํธ๊ฐ Lift chart์ด๋ค.
๋ถ๋ฅ๊ธฐ ์ฑ๋ฅ์ ํ๋จ
โข
Naive Benchmark
โฆ
์๋ฌด๋ฐ ๋ชจ๋ธ๋ ์ฐ์ง ์๊ณ , ์ต์ํ์ผ๋ก ์์ธกํ๋ ๊ธฐ์ค์
โฆ
์ฃผ์ด์ง ๊ด์ธก๊ฐ์ ๋ค์ ํด๋์ค๋ก ๋ถ๋ฅํ๋ ๊ฒ
โข
Confusion matrix
โฆ
๋ถ๋ฅ๊ธฐ๊ฐ ํน์ ๋ฐ์ดํฐ์
์ ๋ํด ์ฐ์ถํ๋ ์ ํํ ๋ถ๋ฅ์ ๋ถ์ ํํ ๋ถ๋ฅ๋ฅผ ์์ฝํจ
โฆ
์ผ๋ฐ์ ์ผ๋ก ํ์ ์์ธก ์ ๋ณด, ์ด์ ์ค์ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
โ ์๋ก์ด ๋ฐ์ดํฐ์์์ ์ฑ๋ฅ ํ๊ฐ๋ฅผ ์ํด ๊ฒ์ฆ ๋ฐ์ดํฐ์์ ๊ณ์ฐ๋ Confusion Matrix๋ฅผ ์ฌ์ฉํ๋ค.
**
โข
๋ถ๋ฅ ๊ฒฝํฅ๊ณผ ์ปท์คํ(threshold)
โฆ
๋๋ค์ ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ๊ด์ธก๊ฐ์ด ๊ฐ ํด๋์ค์ ์ํ ํ๋ฅ ์ ์ถ์ ํ๋ค.
โฆ
์ด ํ๋ฅ ์ ๊ฒฝํฅ(propensities)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โฆ
๊ด์ฌ ํด๋์ค์ ์ํ ํ๋ฅ ์ด ์ปท์คํ(threshold) ๊ฐ๋ณด๋ค ํฌ๋ฉด ํด๋น ๊ด์ธก๊ฐ์ ๊ทธ ํด๋์ค์ ๋ฐฐ์ ํ๋ค.
from sklearn.metrics import confusion_matrix
## threshold = 0.5
predicted =['owner' if p>0.5 else 'nonowner' for p in df.Probability]
confusion_matrix(df.Class, predicted)
Python
๋ณต์ฌ
โข
ํด๋์ค์ ์ค์์ฑ์ด ๋ถ๊ท ๋ฑํ ๊ฒฝ์ฐ์ ์ฑ๋ฅ
โฆ
ํ์ฌ์ ์ฌ๋ฌด ์ํ๋ฅผ ์์ธกํ๋ ๊ฒฝ์ฐ, ํ์ฐํ ์ง ์์ธกํ๋ ๊ฒ์ด ๋ฐ๋์ ๊ฒฝ์ฐ์ ๋นํด ์ค์ํ๋ค.
โฆ
์ด๋๋ ๋ฏผ๊ฐ๋(Sensitivity/Recall) ๊ณผ ํน์ด๋ (Specificity)๋ฅผ ์ค์ฌ์ผ๋ก ์ฑ๋ฅ์ ํ๊ฐํ๋ค.
โฆ
ROC ๊ณก์ ์ ์ผ์ชฝ ์๋์์ ์์ํ์ฌ, threshold ๊ฐ์ 1์์ 0์ผ๋ก ์ค์ด๋ฉด์ {๋ฏผ๊ฐ๋, ํน์ด๋} ์์ ๊ทธ๋ฆฐ ๊ฒ์ด๋ค.
โช
์ผ๋ฐ์ ์ผ๋ก x์ถ ์์ 1-ํน์ด๋๋ฅผ ์์น์ํจ๋ค.
โช
๋ฐ๋ผ์ ์ผ์ชฝ ์ ๋ชจํ์ด์ ๊ฐ๊น์ด ๊ณก์ ์ด ๋ ์ข์ ์ฑ๋ฅ์ ์๋ฏธํ๋ค.
โช
ROC ๊ณก์ ์ ์์ฝ ์ฒ๋๋ AUC์ด๋ฉฐ 1~0.5 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ค.
โ ์ํ์ ์ผ๋ก๋ 0~1 ์ฌ์ด์ ๊ฐ์ด๋, ์์ ๋ฌด์์ ์์ธก์ ๊ฒฝ์ฐ๊ฐ 0.5์ด๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก 1~0.5 ์ฌ์ด๋ผ๊ณ ํํํจ.
โฆ
Naive Benchmark๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ๋น์จ๋ก ํด๋์ค์ ์ํ ํ๋ฅ ์ ์ ์
โช
์ด ๊ฒฝ์ฐ ๋ฅผ ๋ชจ๋ ๊ด์ธก๊ฐ์ ๋ฐฐ์
โช
โช
โช
๊ทธ๋ฌ๋ฏ๋ก ROC ๊ณก์ ์ ์ง์ ํํ
from sklearn.metrics import accuracy_score, roc_curve, auc
df = pd.read_csv('dmba/liftExample.csv')
fpr, tpr, _ = roc_curve(df.actual, df.prob)
roc_auc = auc(fpr, tpr)
Python
๋ณต์ฌ