๋จธ์ ๋ฌ๋์ ์ง๋ํ์ต์ ์ํ๋
Classfication(๋ถ๋ฅ)
- Logistic Regression (๋ก์ง์คํฑ ํ๊ท)
- KNN(K nearest neighbor) ์๊ณ ๋ฆฌ์ฆ,
- SVC(Support Vector Machine) ์๊ณ ๋ฆฌ์ฆ,
- DT(Decision Tree) ์๊ณ ๋ฆฌ์ฆ
๋ค ๊ฐ์ง ๋ฐฉ๋ฒ ์ค์ ์ ํ๋๊ฐ ๋ ๋์ ๋ฐฉ๋ฒ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ์ฌ ์ฌ์ฉํ๋ค
๋ก์ง์คํฑ ํ๊ท๋ ?
- ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค
- ์ฐ์์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๋ ์ ํํ๊ท์ ๋ค๋ฅด๊ฒ ๋ฒ์ฃผํ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ์ฌ ์ด๋ฅผ ์ํํฉ๋๋ค
- ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์ดํญ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ ์๋๋ฐ ๊ทธ ์๋ก ์์ด ์
์ฑ์ธ์ง ์์ฑ์ธ์ง ์์ธกํ๋ ๊ฒ์
๋๋ค
Confusion Matrix
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, C๊ฐ ๋ ์ค์ํ๋ค
์คํ์ง์ ๊ฒฝ์ฐ ๋ง์๊ฒ์ ๋ชป์ฐพ์ ๊ฒ์ด์ง๋ง
๋ฏธํ์ง์ ๊ฒฝ์ฐ ํ๋ฆฐ๊ฒ์ ๋ชป์ฐพ์ ๊ฒ์ด๋ฏ๋ก,
ํ๋ฆฐ๊ฒ์ ๋ชป์ฐพ์ ๊ฒ์ด ๋๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๋ ๋ง์ด ๋ฐ์์ํค๊ณ ์์ค์ ๋ ๋ง์ด ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ด๋ค
์์
# ๋์ด์ ์ฐ๋ด์ผ๋ก ๋ถ์ํด์, ๋ฌผ๊ฑด์ ๊ตฌ๋งคํ ์ง ์ํ ์ง๋ฅผ ๋ถ๋ฅํ์ (๊ตฌ๋งคํ๋ฉด 1, ๊ตฌ๋งคํ์ง ์์ผ๋ฉด 0)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sb
df
User ID | Gender | Age | Estimated Salary | Purchased | |
0 | 15624510 | Male | 19 | 19000 | 0 |
1 | 15810944 | Male | 35 | 20000 | 0 |
2 | 15668575 | Female | 26 | 43000 | 0 |
3 | 15603246 | Female | 27 | 57000 | 0 |
4 | 15804002 | Male | 19 | 76000 | 0 |
... | ... | ... | ... | ... | ... |
395 | 15691863 | Female | 46 | 41000 | 1 |
396 | 15706071 | Male | 51 | 23000 | 1 |
397 | 15654296 | Female | 50 | 20000 | 1 |
398 | 15755018 | Male | 36 | 33000 | 0 |
399 | 15594041 | Female | 49 | 36000 | 1 |
๊ณต๋ฐฑ ์์ ๊ธฐ
df.isna().sum()
User ID 0
Gender 0
Age 0
EstimatedSalary 0
Purchased 0
dtype: int64
ํน์ฑ์ด๊ณผ ๋์์ด๋ก ๋๋๊ธฐ
ํน์ฑ ์ด(X)์ ๋ฐ์ดํฐ์
์์ ๊ฐ๊ฐ์ ๊ด์ธก์น์ ๋ํ ์ค๋ช
๋ณ์๋ฅผ ๋ํ๋ธ๋ค
๋์ ์ด(y)์ ์์ธกํ๋ ค๋ ๊ฐ์ด ํฌํจ๋ ์ด์ด๋ค
y = df['Purchased']
X = df.iloc[ : ,2:3+1]
ํผ์ณ์ค์ผ์ผ๋ง ํ๊ธฐ
๋ก์ง์คํฑ ๋ฆฌ๊ทธ๋ ์ ์ ํผ์ณ์ค์ผ์ผ๋ง์ ํด์ผํ๋ค
from sklearn.preprocessing import StandardScaler, MinMaxScaler (์ฒซ๋ฒ์งธ ๊ฒ์๊ธ์ ์์ธํ ๋์์๋ค.)
X_scaler = StandardScaler()
X = X_scaler.fit_transform( X )
y # 0๊ณผ 1๋ก๋ง ์ด๋ฃจ์ด์ ธ์์ผ๋ฏ๋ก ๋ฐ๋ก ํผ์ณ์ค์ผ์ผ๋ง์ ํ ํ์๊ฐ ์๋ค
train๊ณผ test๋ก ๋๋๊ธฐ
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)
๋ชจ๋ธ๋งํ๊ธฐ
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
classifier.predict(X_test) # X_test ์์ธกํ๊ธฐ
classifier.predict_proba(X_test) # ํ๋ฅ ๋ก ๋ณผ ์ ์๋ค
y_pred = classifier.predict(X_test)
df_test = y_test.to_frame()
df_test['y_pred'] = y_pred
df_test
Purchased | y_pred |
0 | 0 |
0 | 0 |
1 | 1 |
1 | 1 |
0 | 0 |
... | ... |
1 | 1 |
1 | 1 |
1 | 0 |
0 | 0 |
0 | 0 |
Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm
array([[52, 6],
[11, 31]], dtype=int64)
# ์ ํ๋ ๊ณ์ฐ : accuracy
(52+31) / cm.sum()
0.83
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
0.83
report ๋ํ๋ด๊ธฐ
- ๋ถ๋ฅ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค
- ์ฃผ๋ก ๋ชจ๋ธ์ ์ ํ๋, ์ ๋ฐ๋, ์ฌํ์จ, F1 ์ ์ ๋ฑ๊ณผ ๊ฐ์ ์ฌ๋ฌ ์งํ๋ฅผ ์ ๊ณตํ์ฌ
- ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ดํดํ๊ณ ๋น๊ตํ๋ ๋ฐ ๋์์ ์ค๋ค
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.83 0.90 0.86 58
1 0.84 0.74 0.78 42
accuracy 0.83 100
macro avg 0.83 0.82 0.82 100
weighted avg 0.83 0.83 0.83 100
- precision: ์์ธก๋ ์์ฑ ์ค ์ค์ ์์ฑ์ ๋น์จ์ ๋ํ๋ธ๋ค. ์ฆ, ๋ชจ๋ธ์ด ์์ฑ์ผ๋ก ์์ธกํ ๊ฒ ์ค์์ ์ค์ ๋ก ์์ฑ์ธ ๊ฒ์ ๋น์จ์ด๋ค. ์ฌ๊ธฐ์ 0๊ณผ 1 ํด๋์ค์ ๋ํ precision์ ๊ฐ๊ฐ 0.83๊ณผ 0.84์ด๋ค. ์ด๋ ๋ชจ๋ธ์ด ํด๋์ค 0์ 83%์ ์ ๋ฐ๋๋ก, ํด๋์ค 1์ 84%์ ์ ๋ฐ๋๋ก ์์ธกํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค
- recall: ์ค์ ์์ฑ ์ค์์ ๋ชจ๋ธ์ด ์์ฑ์ผ๋ก ์์ธกํ ๋น์จ์ ๋ํ๋ธ๋ค. ์ฆ, ๋ชจ๋ธ์ด ์ค์ ์์ฑ ์ค์์ ์ผ๋ง๋ ๋ง์ ๊ฒ์ ์๋ณํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋ค. ์ฌ๊ธฐ์ 0๊ณผ 1 ํด๋์ค์ ๋ํ recall์ ๊ฐ๊ฐ 0.90๊ณผ 0.74์ด๋ค. ์ด๋ ํด๋์ค 0์ ๊ฒฝ์ฐ 90%์ ์ฌํ์จ๋ก ์ค์ ์์ฑ ์ค ๋๋ถ๋ถ์ ์ ์๋ณํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ํด๋์ค 1์ ๊ฒฝ์ฐ 74%์ ์ฌํ์จ๋ก ์์ฑ์ ๋์น๋ ๋น์จ์ด ์๋์ ์ผ๋ก ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- f1-score: precision๊ณผ recall์ ์กฐํ ํ๊ท ์ด๋ค. ๋ชจ๋ธ์ ์ ๋ฐ๋์ ์ฌํ์จ์ ๋ชจ๋ ๊ณ ๋ คํ์ฌ ๊ณ์ฐ๋๋ค. ๋ฐ๋ผ์ ๋ถ๊ท ํํ ํด๋์ค ํฌ๊ธฐ์ ๋ํด ๋ ์์ ์ ์ธ ์ฑ๋ฅ ์ธก์ ์ ์ ๊ณตํ๋ค. ์ฌ๊ธฐ์ 0๊ณผ 1 ํด๋์ค์ ๋ํ f1-score๋ ๊ฐ๊ฐ 0.86๊ณผ 0.78์ด๋ค.
- support: ๊ฐ ํด๋์ค์ ์ํ ์๋ฅผ ๋ํ๋ธ๋ค. ์ฌ๊ธฐ์ ํด๋์ค 0๊ณผ 1์ ๋ํ ์ํ ์๋ ๊ฐ๊ฐ 58๊ณผ 42์ด๋ค.
- accuracy: ๋ชจ๋ธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฅํ ์ ์ฒด ์ํ์ ๋น์จ์ด๋ค. ์ฌ๊ธฐ์ ์ ํ๋๋ 0.83์ด๋ค.
- macro avg: ํด๋์ค๋ณ ์งํ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ ๊ฒ์ผ๋ก, ๋จ์ ํ๊ท ์ ์ทจํ๋ค.
- weighted avg: ํด๋์ค๋ณ ์งํ์ ๊ฐ์ค ํ๊ท ์ ๊ณ์ฐํ ๊ฒ์ผ๋ก, ๊ฐ ํด๋์ค์ ์ง์ง๋๋ฅผ ๊ฐ์ค์น๋ก ์ฌ์ฉํ์ฌ ํ๊ท ์ ๊ณ์ฐํจ
confusion matrix์ ํํธ๋งต์ผ๋ก ๋ณด๊ธฐ
sb.heatmap(data=cm, cmap='RdPu',annot=True)
plt.show()
# annot์ ๋ํ ์์ ์ฃผ์(๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ํํ)์ ๋ํ๋ธ๋ค