๋ชจ๋ธ์ ํ์ต์ํฌ ๋, ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต๋ถ(ํ์ต)ํ๋ ๋ฐ ์จ๋ฒ๋ฆฌ๊ฒ ๋๋ฉด ๋ชจ๋ธ์ด ์ด๋ฏธ ๋ต์ ์ธ์๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ํญ์ ์ ๋ต์ ๋งํ๋ค.
but ์ฒ์ ๋ณด๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ์๋ง์ด ๋จ.
model_selection ๋ชจ๋ ์ฌ์ฉfrom sklearn.model_selection import train_test_split
# ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
X_train, X_test, y_train, y_test = train_test_split(
X, # ํน์ฑ ๋ฐ์ดํฐ (Feature)
y, # ์ ๋ต ๋ฐ์ดํฐ (Label)
test_size=0.3, # ํ
์คํธ ๋ฐ์ดํฐ ๋น์จ (30%)
random_state=42, # ๋์ ์๋ (๋งค๋ฒ ๋๊ฐ์ด ์์ด๋๋ก)
stratify=y # โญ ๋ถ๋ฅ ๋ฌธ์ ํ์ ์ต์
!
)
์ค์:
stratify์ต์
์๋ฏธ: ์ธตํ ์ถ์ถ. ์ ๋ต ๋ฐ์ดํฐ()์ ํด๋์ค ๋น์จ(์ ๋ต ๋น์จ)์ ์ ์งํ๋ฉฐ ๋๋๋ค.
Why?
๋ง์ฝ ์ ํ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฒด์ 5%๋ฐ์ ์๋๋ฐ, ๋ง ๋๋๋ค๊ฐ ํ์ต ๋ฐ์ดํฐ์ ์ ํ์๊ฐ ํ ๋ช ๋ ์ ๋ค์ด๊ฐ๋ค๋ฉด? ๋ชจ๋ธ์ ํ์ต์ ์ ๋๋ก ํ ์ ์๋ค. ๋ถ๋ฅ ๋ฌธ์ ์์๋ stratify=y๋ฅผ ๊ผญ ์จ์ฃผ๋ ๊ฒ์ด ์ข๋ค.
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# ๋ฐ์ดํฐ ๋ก๋
df = pd.read_csv('data/pima-indians-diabetes.data.csv')
# ํน์ฑ(X)๊ณผ ๋ผ๋ฒจ(y) ๋ถ๋ฆฌ
# .values๋ฅผ ์จ์ Numpy Array ํํ๋ก ๋ณํ
x_data = df.iloc[:, :-1].values
y_data = df.iloc[:, -1].values
# ๋ฐ์ดํฐ ๋ถํ (7:3 ๋น์จ)
# ๋ฐํ๋๋ 4๊ฐ์ ๋ฐฐ์ด์ ์ธํจํน(Unpacking)์ผ๋ก ๋ฐ์
x_train, x_test, y_train, y_test = train_test_split(
x_data, y_data,
test_size=0.3,
stratify=y_data # ์ ๋ต ๋น์จ ์ ์ง
)
# ์ฐจ์(Shape) ํ์ธ
print(f"ํ์ต ๋ฐ์ดํฐ: {x_train.shape}")
# (537, 8)
print(f"ํ
์คํธ ๋ฐ์ดํฐ: {y_test.shape}")
# (231,) -> ์ ์ฒด 768๊ฐ์ ์ฝ 30%
๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ์ต์ํค๊ณ ์ ์๋ฅผ ํ์ธํด์.
- ํ๊ท ๋ชจ๋ธ์ score: ๊ฒฐ์ ๊ณ์()
- ๋ถ๋ฅ ๋ชจ๋ธ์ score: ์ ํ๋(Accuracy)
# ๋ชจ๋ธ ์์ฑ ๋ฐ ํ์ต
model = LogisticRegression(max_iter=500, verbose=True)
model.fit(x_train, y_train)
# 1. ํ์ต ๋ฐ์ดํฐ ์ ์ (Train Score)
train_score = model.score(x_train, y_train)
print(f"Train Accuracy: {train_score}")
# ๊ฒฐ๊ณผ: 0.782... (์ฝ 78.2%)
# 2. ํ
์คํธ ๋ฐ์ดํฐ ์ ์ (Test Score)
test_score = model.score(x_test, y_test)
print(f"Test Accuracy: {test_score}")
# ๊ฒฐ๊ณผ: 0.774... (์ฝ 77.4%)
| ์ํ | ์ ์ ๋น๊ต | ์ค๋ช | ํด๊ฒฐ ๋ฐฉ์ |
|---|---|---|---|
| ๊ณผ์ ํฉ (Overfitting) | Train โซ Test | ๊ณต๋ถ๋ง ๋๋ฌด ์ํ๊ณ ์์ฉ์ ๋ชปํจ | ๋ฐ์ดํฐ ์ถ๊ฐ, ๊ท์ (Regularization), ํ์ต๋ ์ค์ด๊ธฐ |
| ๊ณผ์์ ํฉ (Underfitting) | Test > Train | ๊ณต๋ถ๋ฅผ ๋ ํด์ ๋ ๋ค ๋ชป ๋ง์ถค | ํ์ต ๋ฐ๋ณต(Epoch) ๋๋ฆฌ๊ธฐ, ๋ชจ๋ธ ๋ณต์ก๋ ๋์ด๊ธฐ |
| ์ด์์ | Train โ Test | ๋ ๋ค ์ ์ ํ ๋์ | Good! |
์ ์ค์ต ๊ฒฐ๊ณผ๋ 78.2% vs 77.4%๋ก ์ฐจ์ด๊ฐ ํฌ์ง ์์ ์ผ๋ฐํ๊ฐ ์ ๋ ์ํ๋ผ๊ณ ๋ณผ ์ ์๋ค.
from sklearn.metrics import confusion_matrix
# ํ์ต ๋ฐ์ดํฐ์ ๋ํ ์์ธก๊ฐ ์์ฑ
pred_train = model.predict(x_train)
# confusion_matrix(์ค์ ๊ฐ, ์์ธก๊ฐ)
cm = confusion_matrix(y_train, pred_train)
print(cm)
# ๊ฒฐ๊ณผ
# [[312, 38], -> ์ค์ 0(์ ์)์ธ ๋ฐ์ดํฐ: 312๊ฐ ๋ง์ถค / 38๊ฐ ํ๋ฆผ
# [ 79, 108]] -> ์ค์ 1(๋น๋จ)์ธ ๋ฐ์ดํฐ: 79๊ฐ ํ๋ฆผ / 108๊ฐ ๋ง์ถค

import seaborn as sb
import matplotlib.pyplot as plt
# ํ๊ธ ํฐํธ ์ค์
matplotlib.rcParams['font.family']='Malgun Gothic'
sb.heatmap(
cm,
annot=True, # ์ซ์ ํ์ ์ฌ๋ถ
fmt='d', # ์ ์(decimal)๋ก ํ์ (์ ์ฐ๋ฉด ์ง์ ํํ 3.1e+2 ๋ก ๋์ด)
linewidths=0.2, # ์นธ ์ฌ์ด ๊ฐ๊ฒฉ
cmap='Reds', # ์์ ํ
๋ง
xticklabels=['๋น๋จ์๋(์์ธก)', '๋น๋จ(์์ธก)'],
yticklabels=['๋น๋จ์๋(์ค์ )', '๋น๋จ(์ค์ )']
)
plt.title("Train Confusion Matrix")
plt.show()

pred_test = model.predict(x_test)
cm_test = confusion_matrix(y_test, pred_test)
sb.heatmap(
cm_test,
annot=True,
fmt='d',
linewidths=0.2,
cmap='Reds',
xticklabels=['๋น๋จ์๋(์์ธก)', '๋น๋จ(์์ธก)'],
yticklabels=['๋น๋จ์๋(์ค์ )', '๋น๋จ(์ค์ )']
)
plt.title("Test Confusion Matrix")
plt.show()
# df.corr(): ์ปฌ๋ผ ๊ฐ์ ์๊ด๊ณ์๋ฅผ ๋ฐํ (-1 ~ 1)
print(df.corr())