Search
๐Ÿ—ƒ๏ธ

Evaluation of Model Performance

์ƒ์„ฑ์ผ
2025/04/01 14:57
ํƒœ๊ทธ
๋ฐ์ดํ„ฐ๋งˆ์ด๋‹
์ž‘์„ฑ์ž

Introduction

โ€ข
์ง€๋„ ํ•™์Šต์—์„œ๋Š” ์ƒˆ๋กœ์šด ๊ด€์ธก๊ฐ’์— ๋Œ€ํ•œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•จ.
โ€ข
์ด๋ฅผ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋•Œ ๋‹ค์–‘ํ•œ ํ‰๊ฐ€ ์ง€ํ‘œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

์˜ˆ์ธก ์„ฑ๋Šฅ ํ‰๊ฐ€

โ€ข
์˜ˆ์ธก ์ •ํ™•์„ฑ์€ ์ ํ•ฉ๋„์™€ ๋™์ผํ•œ ๊ฐœ๋…์ด ์•„๋‹˜.
โ—ฆ
์—ฌ๊ธฐ์„œ ์ ํ•ฉ๋„๋ž€, ์ถ”์ •ํ•œ ๋ชจ๋ธ์ด ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž˜ ์„ค๋ช…ํ•˜๋Š”๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์œผ๋กœ, ๋Œ€ํ‘œ์ ์œผ๋กœ ํšŒ๊ท€๋ถ„์„์—์„œ R2R^2๊ฐ€ ์žˆ๋‹ค.
โ€ข
์ ํ•ฉ๋œ ๋ชจ๋ธ์˜ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ์ฒ™๋„๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ ์ฒ™๋„๋Š” ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธก์ •๋œ๋‹ค.
โ€ข
Naive Benchmark
โ—ฆ
์•„๋ฌด๋Ÿฐ ๋ชจ๋ธ๋„ ์“ฐ์ง€ ์•Š๊ณ , ์ตœ์†Œํ•œ์œผ๋กœ ์˜ˆ์ธกํ•˜๋Š” ๊ธฐ์ค€์„ 
โ—ฆ
์ผ๋ฐ˜์ ์œผ๋กœ ํ‰๊ท  ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค
โ–ช
์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ชจ๋ธ์ด ํ•ญ์ƒ ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ํ‰๊ท ์œผ๋กœ ์˜ˆ์ธกํ•  ๋•Œ์˜ ์˜ค์ฐจ๋ฅผ baseline์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
โ€ข
์˜ˆ์ธก ์ •ํ™•์„ฑ ์ฒ™๋„
โ—ฆ
eie_i(์˜ˆ์ธก ์˜ค์ฐจ) = yiโˆ’y^iy_i -\hat y_i
โ–ช
์ˆ˜์น˜ํ˜• ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ์˜ ์˜ˆ์ธก๊ณผ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์˜ ์ฐจ์ด๋กœ ์ •์˜๋œ๋‹ค.
โ—ฆ
MAE (ํ‰๊ท  ์ ˆ๋Œ€ ์˜ค์ฐจ)
โ–ช
1nโˆ‘i=1nโˆฃeiโˆฃ\frac{1}{n}\sum^n_{i=1} |e_i|
โ—ฆ
ํ‰๊ท  ์˜ค์ฐจ
โ–ช
์˜ค์ฐจ์˜ ๋ถ€ํ˜ธ๊ฐ€ ์œ ์ง€ ๋จ
โ–ช
ํ‰๊ท ์ ์œผ๋กœ ์˜ˆ์ธก์ด ์‹ค์ œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ฏธ๋‹ฌ๋˜๋Š”์ง€, ๋„˜์–ด์„œ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
โ–ช
1nโˆ‘i=1nei\frac{1}{n}\sum^n_{i=1} e_i
โ—ฆ
MPE
โ–ช
1nโˆ‘i=1nei/yi\frac{1}{n}\sum^n_{i=1} e_i/y_i
โ—ฆ
MAPE
โ–ช
1nโˆ‘i=1nโˆฃei/yiโˆฃ\frac{1}{n}\sum^n_{i=1} |e_i/y_i|
โ—ฆ
SSE
โ–ช
12โˆ‘i=1nei2\frac{1}{2}\sum^n_{i=1} e_i^2
โ–ช
๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋Š˜๋ฉด ์˜ค์ฐจ ์—ญ์‹œ ๋™์‹œ์— ๋Š˜์–ด๋‚œ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•จ
โ—ฆ
MSE
โ–ช
1nโˆ‘i=1nei2\frac{1}{n}\sum^n_{i=1} e_i^2
โ—ฆ
RMSE
โ–ช
1nโˆ‘i=1nei2\sqrt{\frac{1}{n}\sum^n_{i=1} e_i^2}
โ–ช
๋ฐ์ดํ„ฐ ์–‘์— ๊ด€๊ณ„์—†์ด ์˜ค์ฐจ ํฌ๊ธฐ๊ฐ€ ์ผ์ •ํ•˜๋ฉฐ, ์›๋ณธ ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•œ ๋‹จ์œ„
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๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
** Accuracy=1โˆ’err=1โˆ’(FN+FP)/nAccuracy = 1 - err = 1 - (FN+FP)/n
โ€ข
๋ถ„๋ฅ˜ ๊ฒฝํ–ฅ๊ณผ ์ปท์˜คํ”„(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๋Š” ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ๋น„์œจ๋กœ ํด๋ž˜์Šค์— ์†ํ•  ํ™•๋ฅ ์„ ์ •์˜
โ–ช
์ด ๊ฒฝ์šฐ P(y=1)=ฮฑP(y=1) = \alpha ๋ฅผ ๋ชจ๋“  ๊ด€์ธก๊ฐ’์— ๋ฐฐ์ •
โ–ช
Sensitivity=P(y^=1โˆฃy=1)=ฮฑSensitivity = P(\hat y =1 | y = 1) = \alpha
โ–ช
Specificity=P(y^=0โˆฃy=0)=1โˆ’ฮฑSpecificity = P(\hat y=0 | y=0) = 1-\alpha
โ–ช
๊ทธ๋Ÿฌ๋ฏ€๋กœ 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
๋ณต์‚ฌ