๋ชจ๋ธ, ํน์ ์๊ธฐ๋ง ํ๊ณ ์๋?
์ด์ฌํ ๋ง๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ํ์ต ๋ฐ์ดํฐ์์๋ 100์ ์ธ๋ฐ, ๋ง์ ์ค์ ์ ํฌ์ ํ๋ ์๋ฑํ ๋ต์ ๋ด๋๋๋ค๋ฉด ์ด๋จ๊น? ๋ง์น ์ํ ๋ฒ์๋ง ๋ฌ๋ฌ ์ธ์ฐ๊ณ ์์ฉ ๋ฌธ์ ๋ ํ๋๋ ํ์ง ๋ชปํ๋ ํ์ ๊ฐ์๋ค. ์ด๋ฐ ํ์์ ๊ณผ๋์ ํฉ(Overfitting) ์ด๋ผ๊ณ ํ๋ค. ๋ฐ๋๋ก ๋๋ฌด ๊ณต๋ถ๋ฅผ ์ ํด์ ํจํด์กฐ์ฐจ ํ์ ํ์ง ๋ชปํ๋ฉด ๊ณผ์์ ํฉ(Underfitting) ์ด๋ค.
๐ก โ๋ชจ๋ธ์ ์ง์ง ์ค๋ ฅ์ ์๋ก์ด ๋ฐ์ดํฐ์์ ๋ํ๋๋ค!โ
๋ชจ๋ธ์ด ํ์ต ๋ฐ์ดํฐ์๋ง ์น์ฐ์น์ง ์๊ณ ์ผ๋ฐ์ ์ธ ์ฑ๋ฅ์ ๊ฐ๋๋ก ํ๋ ๊ฒ, ๋ฐ๋ก ๊ต์ฐจ ๊ฒ์ฆ๊ณผ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ๊ฐ ๊ทธ ํด๋ต์ด์๋ค. ์ค๋ ๋ด๊ฐ ๋ชจ๋ธ์ ๊ฑด๊ฐ ์ํ๋ฅผ ๊ผผ๊ผผํ ์ง๋จํ๊ณ ์ปจ๋์ ์ ์ต์์ผ๋ก ๋์ด์ฌ๋ ธ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํด๋ณธ๋ค.
๐ ์ ๋ขฐ๋๋ฅผ ๋์ด๋ ํ๋ จ๋ฒ: ๊ต์ฐจ ๊ฒ์ฆ
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ์, ๋ชจ๋ธ์ ์ฌ๋ฌ ๋ฒ ํ ์คํธํ๊ณ ํ๊ท ์ฑ๋ฅ์ ํ๊ฐํ๋ ์์ฃผ ์ค๋งํธํ ๋ฐฉ๋ฒ์ด์๋ค. ํนํ K-ํด๋ ๊ต์ฐจ ๊ฒ์ฆ์ ๋ฐ์ดํฐ๋ฅผ K๊ฐ์ ๋ฉ์ด๋ฆฌ(ํด๋)๋ก ๋๋๊ณ , ํ๋์ฉ ๋์๊ฐ๋ฉฐ ํ ์คํธ์ฉ์ผ๋ก ์ฌ์ฉํด์ ๋ฐ์ดํฐ๊ฐ ๋ถ์กฑํด๋ ์ ๋ขฐ๋ ๋์ ๊ฒ์ฆ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
# K-Fold๋ก ๊ต์ฐจ ๊ฒ์ฆ์ ์ง์ ๊ตฌํํด๋ดค๋ค.
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import numpy as np
# ์์ ๋ฐ์ดํฐ์ ๋ชจ๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
# X, y, dt_clf
kfold = KFold(n_splits=5)
cv_accuracy = []
for train_index, test_index in kfold.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
accuracy = np.round(accuracy_score(y_test, pred), 4)
cv_accuracy.append(accuracy)
print(f'K-Fold ํ๊ท ์ ํ๋: {np.mean(cv_accuracy):.4f} ์ฑ๊ณต! ๐')
๋ฐ์ดํฐ๋ฅผ ์์ฐจ๊ฒ ํ์ฉํด์ ๋ชจ๋ธ์ ์ผ๋ฐํ ์ฑ๋ฅ์ ์ธก์ ํ ์ ์์๋ค. ์ด์ ๋ด ๋ชจ๋ธ์ ๋ ์ด์ ์ฐ๋ฌผ ์ ๊ฐ๊ตฌ๋ฆฌ๊ฐ ์๋๋ค!
โจ ๋ฐ์ดํฐ ์ฑํ์์ : ์ ์ฒ๋ฆฌ(Preprocessing)
โGarbage in, Garbage out.โ ์ด๋ผ๋ ๋ง์ด ์๋ค. ์ข์ ๋ชจ๋ธ์ ์ข์ ๋ฐ์ดํฐ์์ ๋์ค๋ ๋ฒ. ๋ชจ๋ธ์ด ์ ์ดํดํ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๊น๋ํ๊ฒ ๋ค๋ฌ์ด์ฃผ๋ ์ ์ฒ๋ฆฌ ๊ธฐ๋ฒ๋ค์ ์์๋ดค๋ค.
1. ๋ ์ด๋ธ ์ธ์ฝ๋ฉ (Label Encoding)
'TV'
, '๋์ฅ๊ณ '
๊ฐ์ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ๋ฐ๊ฟ์ฃผ์ง๋ง, ์ซ์ ํฌ๊ธฐ์ ์๋ฏธ๊ฐ ๋ถ์ฌ๋ ์ ์์ด ์ฃผ์๊ฐ ํ์ํ๋ค. (e.g., TV(0) < ๋์ฅ๊ณ (1)
)
from sklearn.preprocessing import LabelEncoder
items = ['TV', '๋์ฅ๊ณ ', '์ ์๋ ์ธ์ง', '์ปดํจํฐ', '์ ํ๊ธฐ', '์ ํ๊ธฐ', '๋ฏน์', '๋ฏน์']
encoder = LabelEncoder()
labels = encoder.fit_transform(items)
# ์ธ์ฝ๋ฉ ๋ณํ๊ฐ: [0 1 4 5 3 3 2 2]
2. ์-ํซ ์ธ์ฝ๋ฉ (One-Hot Encoding)
์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๊ฐ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์๋ก์ด ํผ์ฒ(์ด)๋ก ๋ง๋ ๋ค. ํด๋นํ๋ฉด 1, ์๋๋ฉด 0์ผ๋ก ํ์ํ๋ ๊ฒ์ด๋ค. ํผ์ฒ๊ฐ ๋๋ฌด ๋ง์์ง๋ ๋จ์ ์ ๊ฐ์ํด์ผ ํ๋ค.
from sklearn.preprocessing import OneHotEncoder
# 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํด์ผ ํ๋ค.
items_2d = np.array(items).reshape(-1, 1)
oh_encoder = OneHotEncoder()
oh_labels = oh_encoder.fit_transform(items_2d)
# print(oh_labels.toarray())
3. ํผ์ฒ ์ค์ผ์ผ๋ง (Feature Scaling)
ํค(cm)์ ๋ชธ๋ฌด๊ฒ(kg)์ฒ๋ผ ๋จ์๊ฐ ๋ค๋ฅธ ํผ์ฒ๋ค์ ๊ฐ ๋ฒ์๋ฅผ ๋ง์ถฐ์ฃผ๋ ์์ ์ด๋ค.
๊ตฌ๋ถ | StandardScaler | MinMaxScaler |
---|---|---|
๊ฐ๋ | ํ๊ท 0, ๋ถ์ฐ 1์ ์ ๊ท๋ถํฌ ํํ๋ก ๋ณํ | ๋ชจ๋ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก ์กฐ์ |
ํน์ง | ์ด์์น์ ์๋์ ์ผ๋ก ๋ ๋ฏผ๊ฐ | ์ด์์น์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ ์ ์์ |
# ๋ถ๊ฝ ๋ฐ์ดํฐ๋ก ์ค์ผ์ผ๋ง์ ์ง์ ํด๋ณด๋ ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ๋ฐ๋๋ ๊ฒ ์ ๊ธฐํ๋ค.
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# iris ๋ฐ์ดํฐ๊ฐ ๋ก๋๋์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
std_scaler = StandardScaler()
iris_scaled_std = std_scaler.fit_transform(iris.data)
minmax_scaler = MinMaxScaler()
iris_scaled_minmax = minmax_scaler.fit_transform(iris.data)
๐ ๋ชจ๋ธ ์ฑ์ ํ ์ ๋๋ก ์ฝ๊ธฐ: ์ฑ๋ฅ ์ธก์ ์งํ
์ ํ๋(Accuracy)๋ง ๋ฏฟ์ผ๋ฉด ํฐ์ฝ๋ค์น ์ ์๋ค. ํนํ ๋ฐ์ดํฐ๊ฐ ๋ถ๊ท ํํ ๋ ๊ทธ๋ ๋ค. ๋ชจ๋ธ์ ์ง์ง ์ค๋ ฅ์ ๋ค๊ฐ๋๋ก ํ๊ฐํ๋ ์งํ๋ค์ ์์๋ดค๋ค.
- ์ค์ฐจ ํ๋ ฌ (Confusion Matrix): ๋ชจ๋ธ์ด ๋ญ ๋ง์ถ๊ณ ๋ญ ํท๊ฐ๋ฆฌ๋์ง ํ๋์ ๋ณด์ฌ์ฃผ๋ ํ๋ค. ๋ชจ๋ ์งํ์ ์ด๋จธ๋!
-
์ ๋ฐ๋ (Precision): โ๋ชจ๋ธ์ด
์ ๋ต
์ด๋ผ๊ณ ์์ธกํ ๊ฒ ์ค ์ง์ง์ ๋ต
๋น์จโ์ด๋ค. (Positive ์์ธก ์ฑ๋ฅ) -
์ฌํ์จ (Recall): โ์ค์
์ ๋ต
์ค ๋ชจ๋ธ์ด์ ๋ต
์ด๋ผ๊ณ ๋ง์ถ ๋น์จโ์ด๋ค. (๋์น๋ฉด ์ ๋๋ ๊ฒ์ ์ฐพ์๋ด๋ ๋ฅ๋ ฅ) - F1 ์ค์ฝ์ด (F1 Score): ์ ๋ฐ๋์ ์ฌํ์จ์ ์กฐํ ํ๊ท . ๋ ๋ค ์ค์ํ ๋ ๋น์ ๋ฐํ๋ค.
- ROC ๊ณก์ ๊ณผ AUC: ๋ชจ๋ธ์ด ์ ๋ต๊ณผ ์ค๋ต์ ์ผ๋ง๋ ์ ๊ตฌ๋ถํ๋์ง ๋ณด์ฌ์ฃผ๋ ๊ณก์ ๊ณผ ๊ทธ ์๋ ๋ฉด์ . AUC๊ฐ 1์ ๊ฐ๊น์ธ์๋ก ์๋ฒฝํ ๋ชจ๋ธ์ด๋ค.
์ ํ์ ์์ธก ๋ชจ๋ธ์์, ์ค์ ํ์(True)๋ฅผ ๋์น์ง ์๋ ๊ฒ(Recall)์ด ์ค์ํ ๊น, ์๋๋ฉด ์ผ๋ฐ์ธ(False)์ ํ์๋ก ์๋ชป ์์ธกํ์ง ์๋ ๊ฒ(Precision)์ด ์ค์ํ ๊น? ์ด์ฒ๋ผ ์ํฉ์ ๋ง๋ ์งํ ์ ํ์ด ํ์๋ผ๋ ๊ฑธ ๋๊ผ๋ค.
โจ ์ค๋์ ํ๊ณ
์ค๋ ํ์ต์ผ๋ก ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ ๋๋ก ์ธก์ ํ๊ณ ๊ฐ์ ํ๋ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ค์ก๋ค. ๊ณผ๋์ ํฉ์ ํผํ๊ธฐ ์ํ ๊ต์ฐจ ๊ฒ์ฆ์ ์ค์์ฑ๊ณผ ๋ฐ์ดํฐ ํน์ฑ์ ๋ง๋ ์ ์ฒ๋ฆฌ ๊ธฐ๋ฒ์ ์ ์ฉํ๋ ๋ฒ๋ ๋ฐฐ์ ๋ค.
ํนํ ์ ํ๋๋ผ๋ ํ๋์ ์ซ์ ๋ค์ ์จ๊ฒจ์ง ๋ชจ๋ธ์ ์ง์ง ์ฑ๋ฅ์ ์ค์ฐจ ํ๋ ฌ, ์ ๋ฐ๋, ์ฌํ์จ, AUC ๋ฑ ๋ค์ํ ์งํ๋ก ๋ค๊ฐ์ ์ผ๋ก ํ๊ฐํด์ผ ํ๋ค๋ ์ ์ด ๊ฐ์ฅ ์ค์ํ๊ฒ ๋ค๊ฐ์๋ค. ์์ผ๋ก ๋ชจ๋ธ์ ๋ง๋ค ๋, ์ด ๊ฑด๊ฐ๊ฒ์งํ๋ค์ ๊ผผ๊ผผํ ํ์ธํ๋ฉฐ ๋ ์ ๋ขฐ๋ ๋์ AI๋ฅผ ๋ง๋ค์ด ๋๊ฐ์ผ๊ฒ ๋ค๊ณ ๋ค์งํ๋ค. ๐