๋ชฉ์ : ์ฑ์ธ ์ธ๊ตฌ์ ์ธ๊ตฌํต๊ฒ / ์ง์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์๋( >50K ) ์ฌ๋ถ ์์ธก
๋ชจ๋ธ : DecisionTreeClassifier (์์ฌ๊ฒฐ์ ๋๋ฌด)
๋ฐ์ดํฐ : adult.csv
์ ์ฒ๋ฆฌ : ๋ถํ์ ๋ณ์ ์ ๊ฑฐ, ๋ฒ์ฃผํ -> ์ํซ์ธ์ฝ๋ฉ
ํ๊ฐ : Confusion Matrix + Accuracy, Precision, Recall, F1 score => ๋ชจ๋ธ์ ์์ธก๊ฒฐ๊ณผ๋ฅผ ์ ํํ๊ณ ์์ธํ๊ฒ ํ๊ฐํ๊ธฐ ์ํจ
์ปจํจ์ ๋งคํธ๋ฆญ์ค๋ก ๋ชจ๋ธ์ ์ธ๋ถ์ ์ค๋ฅ๋ฅผ ์ ๊ฒํ๊ณ , ์ฑ๋ฅํ๊ฐ์งํ๋ฅผ ํตํด ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ค์ํ ๊ด์ ์์ ์ข ํฉ์ ์ผ๋ก ํ๊ฐํ ์ ์์.
+) ์ปจํจ์ ๋งคํธ๋ฆญ์ค : ๋ถ๋ฅ ๋ฌธ์ ์์ ๋ชจ๋ธ์ด ์ผ๋ง๋ ์ ์์ธกํ๋์ง ๋ํ๋ด๋ ํ
์์ธก๊ฒฐ๊ณผ๋ฅผ ์ค์ ๊ฐ๊ณผ ๋น๊ตํด์ ๋ง์ถ ๊ฒ, ํ๋ฆฐ ๊ฒ์ ๋ณด๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌ.
ํด๋์ค๊ฐ ๋ ๊ฐ ์ด์ (๋ค์ค ๋ถ๋ฅ)์ด๊ฑฐ๋ ํด๋์ค ๊ฐ ๋ถ๊ท ํ์ด ์์ ๋ ๋ช ํํ ์ฑ๋ฅ ํ์ ๊ฐ๋ฅ
<์ฅ์ >
- ์ ํํ ์ด๋ ๋ถ๋ถ์์ ํ๋ ธ๋์ง ์ ์ ์์
- ์ ํ๋ (Accuracy) ์ธ์๋ ๋ ์ ๋ฐํ ํ๊ฐ (Precision, Recall, F1-score ๋ฑ) ๊ฐ๋ฅํด์ง
- FP (์๋ชป๋ ๊ธ์ ), FN (์๋ชป๋ ๋ถ์ ) ๊ตฌ๋ถ ๊ฐ๋ฅ
+) ์ฑ๋ฅํ๊ฐ์งํ (metrics) : ๋ชจ๋ธ์ด ์ผ๋ง๋ ์ ํํ๊ฒ ์์ธกํ๋์ง ์ ๋์ ์ผ๋ก ํ๊ฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- Accuracy (์ ํ๋): ์ ์ฒด ์์ธก ์ค ์ ํํ ์์ธกํ ๋น์จ
- Precision (์ ๋ฐ๋): ๋ชจ๋ธ์ด ๊ธ์ ์ด๋ผ๊ณ ํ ๊ฒ ์ค ์ค์ ๊ธ์ ์ธ ๋น์จ
- Recall (์ฌํ์จ): ์ค์ ๊ธ์ ์ธ ๊ฒ ์ค ๋ชจ๋ธ์ด ๊ธ์ ์ด๋ผ๊ณ ๋ง์ถ ๋น์จ
- F1-score: Precision๊ณผ Recall์ ์กฐํํ๊ท ์ผ๋ก, ๋ ๊ฐ์ง๋ฅผ ๋์์ ๊ณ ๋ คํ๋ ์งํ
< ์ ์ฒด ํ๋ฆ ์์ฝ : ๋ฐ์ดํฐ ๋ถ์ ์์ >
1. ๋ฐ์ดํฐ ์ค๋น ๋ฐ ์ฝ๊ธฐ
2. ์ ์ฒ๋ฆฌ (ํ๊ฒ ๋ณํ, ์ธ์ฝ๋ฉ, ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฑ)
3. ๋ฐ์ดํฐ ๋ถํ (train/test)
4. ๋ชจ๋ธ ์ ํ ๋ฐ ํ์ต (์์ฌ๊ฒฐ์ ๋๋ฌด)
5. ์์ธก ์ํ
6. ํ๊ฐ ์งํ๋ก ๋ชจ๋ธ ์ฑ๋ฅ ์ธก์
7. ์๊ฐํ๋ก ๋ชจ๋ธ ๋ด๋ถ ๊ตฌ์กฐ ํ์ธ
< ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ >
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import tree # ์์ฌ๊ฒฐ์ ๋๋ฌด
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay # ์ปจํจ์ ผ๋งคํธ๋ฆญ์ค, ์๊ฐํ
import sklearn.metrics as metrics # ์ฑ๋ฅํ๊ฐ์งํ
# ๋ฐ์ดํฐ ๋ก๋ฉ
df = pd.read_csv('asset/adult.csv')
df.info()
--
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 48842 entries, 0 to 48841
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 48842 non-null int64
1 workclass 48842 non-null object
2 fnlwgt 48842 non-null int64
3 education 48842 non-null object
4 education_num 48842 non-null int64
5 marital_status 48842 non-null object
6 occupation 48842 non-null object
7 relationship 48842 non-null object
8 race 48842 non-null object
9 sex 48842 non-null object
10 capital_gain 48842 non-null int64
11 capital_loss 48842 non-null int64
12 hours_per_week 48842 non-null int64
13 native_country 48842 non-null object
14 income 48842 non-null object
dtypes: int64(6), object(9)
memory usage: 5.6+ MB
# ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
df['income'] = np.where(df['income']=='>50K', 'high', 'low')
-> income ์ด์ ๋ฌธ์์ด ๋ฒ์ฃผ๋ก ๋์ด์์. ์ด์ง ๋ถ๋ฅ์ฉ์ผ๋ก ๊ฐ๊ณต
-> ์ฐ์๋ 5๋ง๋ฌ๋ฌ ์ด๊ณผํ๋ฉด hign, ๊ทธ๋ ์ง ์์ผ๋ฉด low
print(df['income'].value_counts(normalize=True)) #๋ฒ์ฃผ์ ๋น์จ ์ถ๋ ฅ
# low 0.760718
# high 0.239282
df = df.drop(columns='fnlwgt')
-> fnlwgt๋ ์ธ๊ตฌํต๊ณ๊ฐ์ค์น๋ก ๋ชจ๋ธ ์์ธก์ ์ง์ ์ ์๋ฏธ ์์ -> ์ญ์
# ์ํซ์ธ์ฝ๋ฉ์ ์ด์ฉํ ๋ฌธ์ํ์
๋ณ์๋ฅผ ์ซ์ํ์
์ผ๋ก ๋ณํ (๋ฐ์ดํฐ๋ฅผ 1์ด๋ 0์ผ๋ก ํ์)
target = df['income'] #1๊ฐ๋ณ์ (ํ๊ฒ๋ณ์ = ์ข
์๋ณ์)
df = df.drop(columns='imcome') #14ro qustn (์์ธก๋ณ์ = ๋
๋ฆฝ๋ณ์)
df = pd.get_dummies(df) #์ํซ์ธ์ฝ๋ฉ
df['income'] = target
-> ์ํซ์ธ์ฝ๋ฉ์ผ๋ก ๋ฌธ์์ด(๋ฒ์ฃผํ ๋ณ์) -> ์์นํ ๋ฒกํฐ
ํ์ผ income์ ์์ธก ๋์์ด๋ฏ๋ก ๋ฐ๋ก ๋ณด๊ด ํ ๋ค์ ํฉ์นจ
# ๋ฐ์ดํฐ ๋ถํ
df_train, df_test = train_test_split(
df, test_size=0.3, stratify=df['income'],random_state=1234
)
-> ์ ์ฒด ๋ฐ์ดํฐ 70% ํ๋ จ / 30% ํ
์คํธ ๋ถ๋ฆฌ
stratify ์ต์
์ผ๋ก high/low ํด๋์ค ๋น์จ์ ๋์ผํ๊ฒ ์ ์ง
# ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
clf = tree.DecisionTreeClassfier(random_state=1234, max_depth=3)
# ์์ฌ๊ฒฐ์ ๋๋ฌด ์์ฑ (์ต๋ ๊น์ด ์ ํ : 3)
# ๊น์ด๊ฐ ๊น์์๋ก ๋ณต์กํด์ง๊ณ , ๊ณผ์ ํฉ ์ํ ๋์์ง
train_x = df_train.drop(columns='income')
train_y = df_train['income']
model = clf.fit(X=train_x, y=train_y)
# ์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ฐํ
# ๊ทธ๋ํ ์ค์
plt.rcParams.update({
'figure.dpi' : '100', #๊ทธ๋ํ ํด์๋
'figure.figsize' : [12:8] #๊ทธ๋ํ ํฌ๊ธฐ
})
# ์์ฌ๊ฒฐ์ ๋๋ฌด ๊ทธ๋ํ
tree.plot_tree (
model, #๋ชจ๋ธ
feature_names = train_x.columns, #์์ธก๋ณ์๋ช
๋ค
class_names = ['high', 'low'], #ํ๊ฒ๋ณ์ ํด๋์ค๋ช
(์ํ๋ฒณ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ง์ถ๊ธฐ)
proportion = True, #ํด๋์ค ๋ฐฐ๋ถ ๋น์จ ํ์ ์ฌ๋ถ
filled = True, #์ฑ์ ์ฌ๋ถ
rounded = Ture, # ๋
ธ๋ ํ
๋๋ฆฌ ๋ฅ๊ธ๊ฒ ํ ๋?
impurity = False, # ๋ถ์๋ ํ์ ์ฌ๋ถ
label = 'root' #์ ๋ชฉ ํ์ ์์น
fontsize = 10 #๊ธ์ ํฌ๊ธฐ
)
plt.show()
< ์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ฐํ ์ดํดํ๊ธฐ >
๋ฐ์ดํฐ์๋ ์ฌ๋๋ค์ ์ฌ๋ฌ ์ ๋ณด (๊ฒฐํผ ์ฌ๋ถ, ๋์ด, ๊ต์ก ์์ค, ์๋ณธ ์ด๋ ๋ฑ)๊ฐ ์๊ณ , ์ด ๋๋ฌด๋ ๊ทธ๋ฐ ์ ๋ณด๋ฅผ ์ด์ฉํด ์๋์ด ๋์(high) ์ฌ๋๊ณผ ๋ฎ์(low) ์ฌ๋์ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋ค
=> ์ฆ ์ด ๋๋ฌด๋ ์ง๋ฌธ์ ํตํด high๋ low๋๋ฅผ ๊ฒฐ์ ํ๊ณ ์์.
* Node : ๋ค๋ชจ ์์
- ์กฐ๊ฑด (์ง๋ฌธ) : ์ด๋ค ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋์ง ๊ฒฐ์ (๊ฒฐํผํ๋? ์๋ณธ ์ด๋? ๋ฑ)
- samples : ์ด ์ง๋ฌธ์์ ๊ณ ๋ คํ๋ ๋ฐ์ดํฐ์ ๋น์จ
- value : [high ๋น์จ, low ๋น์จ] -> ์๋์ด ๋๊ฑฐ๋ ๋ฎ์ ์ฌ๋๋ค์ ๋น์จ
- class : ํด๋น ๋ ธ๋์์ ๊ฐ์ฅ ๋ง์ ํด๋์ค (๋๋ถ๋ถ low ๋๋ high)
- ์์ : ํ๋์ ๊ณ์ด ( ๋๋ถ๋ถ low : ์๋ ๋ฎ์) | ์ฃผํฉ์ ๊ณ์ด (๋๋ถ๋ถ high : ์๋ ๋์)
* ์ค์ ๋ก ํด์ํด๋ณด์!
1. ์ฒซ ๋ฒ์งธ ์ง๋ฌธ : ๊ฒฐํผ ์ฌ๋ถ๊ฐ 0.5 ์ดํ์ธ๊ฐ? = ๊ฒฐํผํ์ง ์์ ์ฌ๋์ธ๊ฐ?
๊ฒฐํผํ์ง ์์ ์ฌ๋์ ์ผ์ชฝ(True), ๊ฒฐํผํ ์ฌ๋์ ์ค๋ฅธ์ชฝ (False)์ผ๋ก ๋๋จ (์ผ๋ฐ์ ์ผ๋ก ์-ํซ ์ธ์ฝ๋ฉ๋ ๊ฒฝ์ฐ ๊ธฐํผ์ด๋ฉด 1, ๋นํผ์ด๋ฉด 0์ผ๋ก ๋ํ๋ด์ 0.5 ์ดํ๋ฉด ๋นํผ์ผ๋ก ๋ถ๋ฅํจ)
์ด ์ง๋ฌธ์ด ๊ฐ์ฅ ๋จผ์ ๋์จ ์ด์ ๋ ๊ฒฐํผ ์ฌ๋ถ๊ฐ ์ฌ๋๋ค์ ์๋ ์์ค์ ๊ฐ์ฅ ๋ช ํํ ๊ตฌ๋ถํ ์ ์์๊ธฐ ๋๋ฌธ
2. ์ผ์ชฝ ๊ฐ์ง (True, ๊ฒฐํผํ์ง ์์ ์ฌ๋๋ค)
๊ฒฐํผํ์ง ์์ ์ฌ๋๋ค ์ค ์๋ณธ์ด๋(capital_gain)์ด 7073.5 ์ดํ์ธ๊ฐ?
์ด๊ฑธ ๋ค์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ฉด :
์๋ณธ ์ด๋์ด ์์ ์ฌ๋ (์ผ์ชฝ) -> ๋๋ถ๋ถ ์๋ ๋ฎ์ (low)
์๋ณธ ์ด๋์ด ํฐ ์ฌ๋ (์ค๋ฅธ์ชฝ) -> ๊ทธ ์ค์์๋ ๋์ด๊ฐ 20์ธ ์ดํ์ธ๊ฐ? ๋ฅผ ์ง๋ฌธํด์ ๋ค์ ๋๋๋ค.
- ๋์ด๊ฐ ์ด๋ฆฌ๋ฉด ์ผ์ชฝ, ๋๋ถ๋ถ ์๋์ด ๋ฎ๊ณ (low)
- ๋์ด๊ฐ ๋ง์ผ๋ฉด ์ค๋ฅธ์ชฝ, ๋๋ถ๋ถ ์๋์ด ๋๋ค (high)
=> ๊ฒฐํผํ์ง ์๊ณ + ์๋ณธ ์ด๋์ด ํฌ๊ณ + ๋์ด๊ฐ ๋ง๋ค๋ฉด ์๋์ด ๋์๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๋ค.
3. ์ค๋ฅธ์ชฝ ๊ฐ์ง (๊ฒฐํผํ ์ฌ๋๋ค)
๊ฒฐํผํ ์ฌ๋๋ค์ ๊ต์ก์์ค์ด 12.5 ์ดํ์ธ๊ฐ?๋ฅผ ์ง๋ฌธํด์ ๋ค์ ๋๋
- ๊ต์ก์์ค์ด ๋ฎ์ ์ฌ๋(์ผ์ชฝ)
๋ค์ ์๋ณธ์ด๋์ด 5095.5 ์ดํ์ธ๊ฐ? ์ง๋ฌธ์ ํตํด์
์๋ณธ์ด๋์ด ์์ผ๋ฉด ๋๋ถ๋ถ ์๋์ด ๋ฎ๊ณ , ํฌ๋ฉด ์๋์ด ๋์
- ๊ต์ก์์ค์ด ๋์ ์ฌ๋ (์ค๋ฅธ์ชฝ)
์๋ณธ์ด๋ ์ง๋ฌธ ๋์ผ
๊ฒฐํผ์ ํ๊ณ + ๊ต์ก์์ค์ด ๋๊ณ + ์๋ณธ์ด๋์ด ํฌ๋ฉด ๋๋ถ๋ถ ์๋ ๋์ ๊ฐ๋ฅ์ฑ์ด ๋์
4. ํผ์ผํธ์ ์๋ฏธ
๋งจ ์ ๋ ธ๋์์ 100%๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๊ณ
์๋ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ๋ฉด์ ์ด ๋ฐ์ดํฐ๊ฐ ๋๋ ์ ธ์ ๋น์จ์ด ์ค์ด๋๋ ๊ฒ
๊ฐ ๋ ธ๋์์ ์ซ์๊ฐ ์ ์ ์์์ง๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์๊ฒ ๋๋ ๊ฐ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋ค
์์ธก์ ์ํ ์์ธก๋ณ์, ํ๊ฒ ๋ณ์ ์ถ์ถ + ์์ธก
test_x = df_test.drop(columns='income')
test_y = df_test['income']
# ์์ธก
df_test['pred'] = model.predict(test_x)
#print(df_test)
--- ์ถ๋ ฅ ---
age education_num ... income pred
11712 58 10 ... low low
24768 39 10 ... low low
26758 31 4 ... low low
14295 23 9 ... low low
3683 24 9 ... low low
... ... ... ... ... ...
11985 24 13 ... low low
48445 35 13 ... high high
19639 41 9 ... high low
21606 29 4 ... low low
3822 31 13 ... low low
[14653 rows x 109 columns]
df_test['pred'] = model.predict(test_x) : ํ์ต๋ model(์์ฌ๊ฒฐ์ ๋๋ฌด)์ test_x์ ์ ์ฉํด ๊ฐ ์ํ์ ์์ธก ๋ ์ด๋ธ์ ๋ฐํ
๋ฐํ๋ ์์ธก๊ฐ์ df_test์ pred๋ผ๋ ์ ์นผ๋ผ์ผ๋ก ์ถ๊ฐ
์๋ณธ df_test์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ํจ๊ป ๋ณด๊ดํ๋ฉด, ์ค๋ถ๋ฅ ์ฌ๋ก๋ฅผ ์๋ณํ๊ฑฐ๋ ์ถ๊ฐ ๋ถ์์ ์ํํ๊ธฐ์ ์ฉ์ดํจ
# ์์ธก ์ฑ๋ฅ ํ๊ฐ
# ์ปจํจ์ ผ๋งคํธ๋ฆญ์ค
conf_mat = confusion_matrix(
y_true = df_test['income'], # ์ค์ ๊ฐ
y_pred = df_test['pred'], # ์์ธก๊ฐ
labels = ['high', 'low'] # ๋ ์ด๋ธ (ํด๋์ค ๋ฐฐ์น ์์, ๋ฌธ์ ์ค๋ฆ์ฐจ์)
)
print(conf_mat)
# ๊ทธ๋ํ ์ค์ ์ด๊ธฐํ : ์ด์ ์ plt.rcParams.update()๋ฑ์ผ๋ก ๋ณ๊ฒฝ๋ ์ต์
์ด ์์ ๋, ํํธ๋งต์ ์ํฅ์ด ๊ฐ์ง ์๋๋ก ๋ฆฌ์
plt.rcdefaults()
# ์ปจํจ์ ผ๋งคํธ๋ฆญ์ค๋ฅผ ํํธ๋งต์ผ๋ก ํ์
p = ConfusionMatrixDisplay(
confusion_matrix = conf_mat, # ๋งคํธ๋ฆญ์ค ๋ฐ์ดํฐ
display_labels = ('high', 'low') # ํ๊ฒ๋ณ์ ํด๋์ค๋ช
)
p.plot(cmap = 'Blues') # ์ปฌ๋ฌ๋งต
plt.show()
ํผ๋ํ๋ ฌ์ ๋ชจ๋ธ์ด ์ด๋์ ์ฃผ๋ก ํ๋ ธ๋์ง (FN vs FP)๋ฅผ ํ์ ํ๋ ๋ฐ ํ์์ .
ํํธ๋งต์ผ๋ก ์๊ฐํ ํ๋ฉด, ์ซ์ ๋ฟ ์๋๋ผ ์ ๋๋๋ก ์ .์ค๋ถ๋ฅ ๋น์จ์ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์์
labels์ display_labels ์์๋ฅผ ์ผ์น์์ผ์ผ ์ถ ์์ ํผ๋์ ๋ฐฉ์ง
ํํธ๋งต ์ด๋ฏธ์ง ํด์
1. True Positive (TP) : 1801
์ค์ high๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ high๋ก ์์ธกํ ๊ฑด์
2. False Negative(FN) : 1705
์ค์ high๋ฅผ ์๋ชป low๋ก ์์ธกํ ๊ฑด์ -> ๊ณ ์๋์ ๋๋ฝ
3. False Positive(FP) : 582
์ค์ low๋ฅผ ์๋ชป high๋ก ์์ธกํ ๊ฑด์ -> ์ ์๋์๋ฅผ ๊ณ ์๋์ผ๋ก ์ค๋ถ๋ฅ
4. True Negative(TN) : 10565
์ค์ low๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ low๋ก ์์ธกํ ๊ฑด์
< ์ฑ๋ฅํ๊ฐ ์งํ >
1. ์ ํ๋ (Accuracy)
: ์ ๋ต์ ์ผ๋ง๋ ๋ง์ท๋!
(๋งค์ฐ ์ง๊ด์ ์ด์ง๋ง ๋ถ๊ท ํ ํด๋์ค์์๋ ์๊ณก๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์)
# ์ ํ๋
acc = metrics.accuracy_score(
y_true = df_test['income'], # ์ค์ ๊ฐ
y_pred = df_test['pred'] # ์์ธก๊ฐ
)
print(acc) # 0.8439227461953184
2. ์ ๋ฐ๋ (Precision)
: ๋ชจ๋ธ์ด high๋ผ๊ณ ์์ธกํ ๊ฒฝ์ฐ ์ค์ high์ธ ๋น์จ
: ์คํ์ง (FP)๋ฅผ ์ค์ด๋ ค ํ ๋ ์ค์ํ ์งํ
: ๋ณดํต ๊ธ์ ํด๋์ค์ ์ ํ์ฑ์ ํ๊ฐํ ๋ ํ์ฉ
- ์ ์ฉํ๊ฐ, ์ถ์ฒ์์คํ ์ ๋งค์ฐ ์ค์
- ์ ๋ฐ๋๊ฐ ๋ฎ๋ค๋ฉด ๋ชจ๋ธ์ high ์์ธก์ ์ ๋ขฐํ๊ธฐ ์ด๋ ต๋ค๊ณ ํ๋จ
# ์ ๋ฐ๋
pre = metrics.precision_score(
y_true = df_test['income'], # ์ค์ ๊ฐ
y_pred = df_test['pred'], # ์์ธก๊ฐ
pos_label = 'high' # ๊ด์ฌ ํด๋์ค
)
print(pre) #0.7557700377675199
3. ์ฌํ์จ (Recall)
: ์ค์ high ํด๋์ค ์ค์์ ์ผ๋ง๋ ๋ง์ high๋ฅผ ๋์น์ง ์๊ณ ์ก์๋์ง ๋น์จ
: ์ฆ, False Nagative๋ฅผ ์ค์ด๋ ๋ฐ ์ค์ํ ์งํ
- ์์ง๋จ, ์ฌ๊ธฐํ์ง์ ๊ฐ์ ๋ฏผ๊ฐํ ๋ถ์ผ์์๋ FN์ด ๋งค์ฐ ์ํํ๊ธฐ ๋๋ฌธ์ ์ฌํ์จ์ ํนํ ์ค์์ ํจ
- ์ฌํ์จ์ด ๋ฎ๋ค๋ฉด ์ค์ํ ์ฌ๋ก๋ฅผ ๋์น๊ณ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋ชจ๋ธ ์กฐ์ ์ด ํ์
rec = metrics.recall_score(
y_true = df_test['income'], # ์ค์ ๊ฐ
y_pred = df_test['pred'], # ์์ธก๊ฐ
pos_label = 'high' # ๊ด์ฌ ํด๋์ค
)
print(rec) #0.5136908157444381
4. F1-score
: ์ ๋ฐ๋์ ์ฌํ์จ์ ์กฐํ๋กญ๊ฒ ํ๊ฐํ๋ ์กฐํํ๊ท
์ ๋ฐ๋์ ์ฌํ์จ ์ฌ์ด์ ๊ท ํ์ ํ๊ฐํ๋ ๋ฐ ์ต์ ์ ์งํ
- ์ ๋ฐ๋, ์ฌํ์จ์ด ๋ชจ๋ ์ค์ํ ์ํฉ์์ ์ฌ์ฉ๋จ
-
f1 = metrics.f1_score(
y_true = df_test['income'], # ์ค์ ๊ฐ
y_pred = df_test['pred'], # ์์ธก๊ฐ
pos_label = 'high' # ๊ด์ฌ ํด๋์ค
)
print(f1) #0.6116488368143997
<์ ๋ฐ๋์ ์ฌํ์จ ๋ ์ดํดํด๋ณด๊ธฐ>
์ ๋ฐ๋ : ์์ธกํ ๊ฒ์ด ์ผ๋ง๋ ์ ํํ์ง
์ฌํ์จ : ๋์น๋ฉด ํฐ์ผ๋จ
* ์ ๋ฐ๋์ ์ฌํ์จ์ด ์ค์ํ ์ด์ 1 (๊ธ์ต๊ฑฐ๋ ์ฌ๊ธฐ ํ์ง)
๊ธ์ต๊ธฐ๊ด์์ ์ค์ ์ฌ๊ธฐ๋ฅผ ๋์น๋ฉด ํฐ ํผํด ๋ฐ์ (FN์ด ๋งค์ฐ ์ํํ๋ค๊ณ ๋ณผ ์ ์๋ค)
๋๋ถ๋ถ ์ฌํ์จ์ ์ค์ํ๊ฒ ์๊ฐ => ์ฆ ์ฌ๊ธฐ์ผ ๊ฐ๋ฅ์ฑ์ด ์กฐ๊ธ์ด๋ผ๋ ์์ผ๋ฉด ์ผ๋จ ์ก์๋.
ํ์ง๋ง ์ ๋ฐ๋ ์ญ์ ๊ณ ๋ คํ์ง ์์ ์ ์์. ์?
์ ๋ฐ๋๊ฐ ๋๋ฌด ๋ฎ์ผ๋ฉด ์ ์๊ฑฐ๋๋ฅผ ๊ณ์ ์ฌ๊ธฐ๋ก ์๋ชป ํ๋จํด์ ๊ณ ๊ฐ์ด ๋ถํธํ๊ณ ์ํ์ํํ ํ๋. (์ค์ ๋ก ํ ๋ง์ด ๋ ใ ใ )
๋ฐ๋ผ์ :
1์ฐจ๋ก ์ฌํ์จ์ ๊ทน๋ํ ํด ์ผ๋จ ๋ชจ๋ ์์ฌ ๊ฑฐ๋๋ฅผ ์ก๊ณ ,
2์ฐจ๋ก ์ฌ๋์ด ์ง์ ํ์ธํ๋ ์ ์ฐจ๋ฅผ ํตํด ์ ๋ฐ๋๋ฅผ ๋์ฌ ์ ์๊ฑฐ๋๋ฅผ ๋ถ๋ฅ
* ์ ๋ฐ๋์ ์ฌํ์จ์ด ์ค์ํ ์ด์ 2 ( ๊ณตํญ ๋ณด์ ๊ฒ์๋ )
์ ๋ฐ๋๋ ์ํํ๋ค๊ณ ๊ฒฝ๊ณ ๊ฐ ์ธ๋ฆฐ ์ฌ๋ ์ค ์ค์ ์ํํ ์ฌ๋์ ๋น์จ
์ ๋ฐ๋๊ฐ ๋ฎ์ผ๋ฉด?
๋ฌด๊ณ ํ ์ฌ๋์ด ๊ณ์ ๊ฑธ๋ ค์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ ์ฌ๋๋ค์ ๋ถ๋ง์ด ์ฆ๊ฐ
์ฌํ์จ์ ์ค์ ์ํํ ์ฌ๋ ์ค ์์คํ ์ด ํ์งํด๋ธ ๋น์จ
์ฌํ์จ์ด ๋ฎ์ผ๋ฉด, ์ง์ง ์ํํ ์ฌ๋์ด ํต๊ณผํด ํฐ ์ฌ๊ณ ๋ก ์ด์ด์ง ์ ์๋ค.
(๋ง์ฝํ์ง๊ฒฌ์ ์ฌํ์จ์ ๋์ด๋ ๋ฐ ํฐ ์ญํ ์ ํ๊ณ ์์ง ์์๊น)
๋ฐ๋ผ์ :
๊ณตํญ์ ์ฌ๊ณ ์ํ(FN)์ ์ ๋ ๋์น๋ฉด ์๋๊ธฐ ๋๋ฌธ์ (์๋ช ์ง๊ฒฐ) ์ฌํ์จ์ ์ต์ฐ์ ์ผ๋ก ์ค์
๊ทธ ๋ค์ 2์ฐจ ๊ฒ์ฌ๋ฅผ ํตํด ์ค์ ์ํ์ด ์๋ ์ฌ๋์ ๋น ๋ฅด๊ฒ ๋ถ๋ฅํ์ฌ ์ ๋ฐ๋๋ฅผ ๋์ธ๋ค.
* ๋ฐ๋๋ก ์ ๋ฐ๋๋ฅผ ๋ ์ค์์ํ๋ ๋ถ์ผ๋?
๋ฆฌ์คํฌ ์ต์ํ๋ฅผ ์ํด ๋๋ถ๋ถ ์ฌํ์จ์ด ์ต์ฐ์ ์ ๋ ํ ์ง๋ง,, ๋ฌธ๋ ๊ถ๊ธํด์ง ๊ฑด ์ ๋ฐ๋๋ฅผ ์ฐ์ ์ ํ๋ ๋ถ์ผ๋ ์ ๋ฌด๊ฐ ์์๊น?
-> ์๋ชป๋ ๊ธ์ (FP)์ ํผํด๊ฐ ํฌ๋ฉด ์ ๋ฐ๋๋ฅผ ์ฐ์ ์ ํ๊ฒ ์ง?
< ์ ๋ฐ๋๊ฐ ๋ ์ค์ํ ์ฌ๋ก >
- ์ด๋ฉ์ผ ์คํธ ํํฐ๋ง : ์ค์ํ ๋ฉ์ผ์ด ์คํธ์ผ๋ก ๊ฐ๋ฉด ์ ๋ฌด์ ์ํด ๋ฐ์
- ๊ณ ๋น์ฉ ์ ๋ฐ ์๋ฃ ๊ฒ์ฌ : 1์ฐจ ๊ฒ์ฌ๋ ์ผ๋จ ์กฐ๊ธ์ด๋ผ๋ ์ํํ๋ฉด ๋ค ์ก์๋ด์ง๋ง, ๋น์ฉ์ด ํฌ๊ณ ์ํํ ์์ ๋ฑ 2์ฐจ ๋จ๊ณ๋ ์ ๋ฐ๋๊ฐ ๋์์ผ ์ค์ง์ ๋ฐฉ์งํ ์ ์์
- ์ ์ฉํ๊ฐ : ์ ์ฉ์ด ์์ข์ ์ฌ๋์ ์ข๋ค๊ณ ์๋ชปํ๊ฐํ๋ฉด ๊ธ์ต๊ธฐ๊ด ์์ค๋ก ์ง๊ฒฐ
- ๋ฒ์ ํ๊ฒฐ : ๋ฌด์ฃ๋ฅผ ์ ์ฃ๋ผ๊ณ ํ๊ฒฐํ๋ฉด ์ธ๊ถ+์ค๋ฆฌ+์ธ๋ก ์ ์งํ