project:eve
23.01.28 Logistic Regression๋ก์ง์คํฑ ํ๊ท ๋ณธ๋ฌธ
Studying here๐ ์ฝ์ฌ์ด์ดํฐ ์์ธ์ฒ
1) ์ ์
์ข ์๋ณ์๊ฐ ๋ฒ์ฃผํ์ธ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ํ๊ท ๋ฐฉ๋ฒ. ์ํ์ด ํน์ ์ข ์๋ณ์์ ์ํ ํ๋ฅ ์ ์ถ์ ํ๋ค!
์๋ฅผ ๋ค์ด ์นด๋ ๋๊ธ์ ์ฐ์ฒดํ ์ง(r) ๋๋ ์ ๊ธํ ํ๋ฅ (1-r)์ ๊ตฌํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ธฐ์กด์ ์ ํ ํ๊ท ํจ์์ ๋ค๋ฅด๊ฒ X๊ฐ์ ๋์ ํ์ ๋ 0~1 ๊ฐ์ด ๋์ค๋๋ก ํ๋ ์๋ก์ด ํจ์์์ด ํ์ํ๊ณ , ์ฃผ๋ก ๋ก์ง์คํฑ ํจ์๋ ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
2) ์น์ฐ๋น
์ฑ ์๋ '์คํจํ ํ๋ฅ ์ ๋นํด ์ฑ๊ณตํ ํ๋ฅ ' ์ด๋ผ๊ณ ๋์ ์๋๋ฐ ํํ์ด ์ข ์ด๋ ต๋ค.. ๊ฐ๋จํ๊ฒ ์ฑ๊ณตํ ํ๋ฅ ์ด p๋ผ๊ณ ํ๋ฉด p/(1-p)์ด๋ค.
๋ง์ฝ ๊ณ ๊ฐ์ด ์นด๋ ๋๊ธ์ ๋ฉ์ ํ ํ๋ฅ ์ด 1/3, ์ฐ์ฒดํ ํ๋ฅ ์ด 2/3์ด๋ผ๋ฉด ์ฐ์ฒด odds๋ 1/2๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ '๊ณ ๊ฐ์ด 2๋ฒ ์๋ฉ(์ฑ๊ณต)์ ํ๊ณ 1๋ฒ ์ฐ์ฒด(์คํจ)๋ฅผ ํ๋ค' ๊ณ ํด์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์น์ฐ๋น๊ฐ ๋์ผ๋ฉด ์ฐ์ฒด(์คํจ) ํ๋ฅ ์ด ๋์์ง๊ณ ์น์ฐ๋น๊ฐ ๋ฎ์ผ๋ฉด ๋ฉ์ (์ฑ๊ณต) ํ๋ฅ ์ด ๋์์ง๋ค.
(*P(Y=1|X) ํ๋ฅ ๊ฐ์ด 1์ ๊ฐ๊น์์ง์๋ก Odds๊ฐ ๋ฌดํ๋๋ก ๋ฐ์ฐํ๊ธฐ ๋๋ฌธ์ ๋ฒ์์ ์ ์ฝ์ด ์๋ค -> ์ด๊ฒ ๋ญ ๋ง์ผ๊น.. ์ํผ ์ด๋ฐ ์ด์ ๋ก odds์ ๋ก๊ทธ ํจ์๋ฅผ ์์์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.)
์น์ฐ๋น๊ฐ ํ๋ฅ ์ ๋ํ๋ด๋ ๊ฐ์ด๋ ์ด๊ฒ์ ์ด์ฉํด์ P(X) ์ฆ ์ข ์๋ณ์์ ๋ํ ์ ํ ํจ์์์ ์ธ์ฐ๋ ๊ฒ ๊ฐ๋ค. ๋ง์ง๋ง ์นธ์ ์๋ ํจ์์์ด ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ ์.
3) ๋ชจ๋ธ ํ์ต
๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ์ต ๋ชฉ์ ์ ์์ฑ ์ํ(y=1, ์ฑ๊ณต)์ ๋ํด์๋ ๋์ ํ๋ฅ ์ ์ถ์ ํ๊ณ , ์์ฑ ์ํ(y=0, ์คํจ)์ ๋ํด์๋ ๋ฎ์ ํ๋ฅ ์ ์ถ์ ํ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ฉฐ ์ด ๋ฐฉ๋ฒ์ผ๋ก '์ต๋ ์ฐ๋ ์ถ์ ๋ฒ' ์ ์ฌ์ฉํ๋ค.
์ฐ๋(Likelyhood)?? ์ฐ๋๋ ํ๋ฅ ๊ณผ ๋ฐ๋๋๋ ๊ฐ๋ ์ธ๋ฐ, ํ๋ฅ ์ด ๋ชจ์๋ก๋ถํฐ ํน์ ํ์์ด ๋ฐ์ํ๋ ๊ฐ๋ฅ์ฑ์ด๋ผ๊ณ ํ๋ค๋ฉด ์ฐ๋๋ ์ด๋ฏธ ์ฃผ์ด์ง ํ์์ ๋ณด๊ณ ์ด ํ์์ด ๊ฐ์ฅ ๋๊ฒ ๋ฐ์ํ ์ ์๋ ๋ชจ์๋ฅผ ๋งํ๋ ๊ฒ ๊ฐ๋ค. ์ฆ ์ต๋ ์ฐ๋ ์ถ์ ๋ฒ์ ํน์ ํ์์ด ์ผ์ด๋๊ธฐ ์ํ ์ต์ ์ ๋ชจ์ ํํ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ดํดํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์ต๋ ์ฐ๋ ์ถ์ ๋ฒ์ ์ฑ๊ณต์ 1, ์คํจ๋ฅผ 0์ผ๋ก ๋์์ํค๋ ๋ ๊ฐ์ง ๊ฒฐ๊ณผ๋ง์ ๊ฐ์ง๋ ๋ฒ ๋ฅด๋์ด ํ๋ฅ ๋ถํฌ์ ์ฐ๊ด์ง์ด ๋ง๋ ์ฐ๋ ํจ์๋ฅผ ํตํด ํ๊ท๊ณ์๋ฅผ ์ถ์ ํ๋ ์์ ๋ง๋ค ์ ์๋ค. ์ด ์์ผ๋ก ๊ตฌํ ํ๊ท๊ณ์๋ฅผ ๋์ ํ๋ฉด ์ฐ์ฒด๋ฅผ ํ๋ ์ฌ๋์ ๋ํด์๋ 1์ ๊ฐ๊น๊ฒ, ์ฐ์ฒด๋ฅผ ํ์ง ์์๋ ์ฌ๋๋ค์ ๋ํด์๋ 0์ ๊ฐ๊น์ด ๊ฐ์ ๋ฐํํ๋ค.
4) ๊ฒฐ๋ก
๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ์ ๋ ฅ๋ ๋ ๋ฆฝ๋ณ์์ ๋ํด ๊ฒฐ๊ณผ๊ฐ์ด ๋์ฌ ํ๋ฅ ์ ๊ฐ๊ฐ ๊ณ์ฐํ๊ณ ํ๋ฅ ์ด 50%๊ฐ ๋๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์์ธกํ๋ค.
5) ์ฝ๋๋ก ์ง๋ณด๊ธฐ
๋ฐ์ดํฐ๋ ์ผ๊ธ์ ์ ์ฒด ๋ฅ๋ ฅ์ ๋ฐ๋ฅธ ๋ฑ๊ธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค.
import pandas as pd
import numpy as np
body=pd.read_csv('/Users/eve/Downloads/jupyter notebook/files/bodyPerformance.csv')
body.info()
๊ฐ๋จํ๊ฒ ์ ์ฒ๋ฆฌ ํ๊ธฐ. ํ๊ท๋ชจํ์ ์ฌ์ฉํ ๊ฒ์ด๋ฏ๋ก object ๋ณ์๋ฅผ ์์นํ์ผ๋ก ๋ฐ๊ฟ์ค ํ์๊ฐ ์๋ค.
์ข ์๋ณ์์ธ class๋ ์๋๋ ์ด 4๊ฐ์ง ๊ฐ์ ๊ฐ์ง๊ณ ์๋๋ฐ(A, B, C, D) ์ฌ๊ธฐ์๋ ๋ก์ง์คํฑํ๊ท๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋๊ฐ์ง๋ก ๋ถ๋ฅํ๋ค.
body['gender']=np.where(body['gender']=='M', 1, 0)
body['class']=np.where(body['class']=='A', 1, 0)
๊ทธ๋ฆฌ๊ณ ํ๋ จ/ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ค. LogisticRegression ์ ์ํด ์ฃผ๊ณ ํ๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ํฉ์์ผ์ค๋ค.
๋ชจ๋ธ์ predict_proba ํจ์์ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์ข ์๋ณ์์ ์๋งํผ ์ด๋์ ์ํ ์ง ํ๋ฅ ์ ์ถ๋ ฅํ๋ค. ์ง๊ธ ๋ฐ์ดํฐ๋ ๋๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ 0, 1๋ก ๋ถ๋ฅํ์ผ๋ฏ๋ก 0์ผ ํ๋ฅ , 1์ผ ํ๋ฅ ๋๊ฐ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
decision_function(๊ฒฐ์ ํจ์)์ hyperplane(๋ก์ง์คํฑ ํ๊ท์์๋ x=0)์ ์ค์ฌ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ์ ํ๋ณํด์ฃผ๋ ํจ์์ด๋ค.
* ๊ฒฐ์ ํจ์์ ๊ฐ ๋ถํธ๋ง ๋ด๋ ์ฑ๊ณต/์คํจ๋ฅผ ํ๋ณํ ์ ์๋ค.
์ฑ๊ณตํ ํ๋ฅ ์ด 0.5 ์ด๊ณผ์ด๋ฉด, ๊ฒฐ์ ํจ์๋ ์์๊ฐ ๋๋ค.
์ฑ๊ณตํ ํ๋ฅ ์ด 0.5 ๋ฏธ๋ง์ด๋ฉด, ๊ฒฐ์ ํจ์๋ ์์๊ฐ ๋๋ค.
์ฑ๊ณตํ ํ๋ฅ ์ด 0.5์ด๋ฉด, ๊ฒฐ์ ํจ์๋ 0์ด ๋๋ค.
X = body.drop(columns=['class'])
Y = body['class']
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, Y, stratify=Y, test_size=0.3, random_state=1)
logr=LogisticRegression()
logr.fit(train_x, train_y)
proba = pd.DataFrame(logr.predict_proba(train_x))
cs=logr.decision_function(train_x)
A๊ฐ ์๋ ํ๋ฅ (1-p), A์ผ ํ๋ฅ (p), ๊ฒฐ์ ํจ์๋ฅผ ํ๋์ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ์์ฑํ๋ค.
df_result = pd.concat([proba, pd.DataFrame(cs)], axis=1)
df_result.columns = ['Not A', 'A', 'Decision_function']
df_result.sort_values(['Decision_function'], inplace=True)
df_result.reset_index(inplace=True, drop=True)
df_result
๊ทธ๋ํ๋ก ํ์ํ๋ฉด ๋ ์ฝ๊ฒ ์ ์ ์๋ค.
fig = plt.figure()
plt.plot(df_result['Decision_function'], df_result['A'], '-', label='A')
plt.plot(df_result['Decision_function'], df_result['Not A'], '-', label='Not A')
plt.legend()
๋ค์์ ์ด ๋ชจ๋ธ์ ๋ํด ์ฑ๋ฅ์ ํ๊ฐํด ๋ณด์. ์๋ ํ๊ท๋ชจ๋ธ์ ์ฑ๋ฅํ๊ฐ๋ MAE, MSE, RMSE ๋ฑ์ผ๋ก ํ์ง๋ง ๋ก์ง์คํฑ ํ๊ท๋ชจ๋ธ์ ๋ถ๋ฅ๊ธฐ์ ํน์ฑ์ ๊ฐ์ง๊ณ ์์ด์์ธ์ง ๋ถ๋ฅ๋ชจ๋ธ์ ์ฑ๋ฅํ๊ฐ์ธ ์ค์ฐจํ๋ ฌ, ์ ํ๋, f1 score ๋ฑ์ผ๋ก ํ๊ฐํ๋ค.
๋จผ์ ํ๊ฐ ์งํ์ ๋ป๋ถํฐ ์จ๋ณด์
์ค์ฐจํ๋ ฌ : ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ด ๊ต์ฐจํ๋ ๊ฐ์ ํ๋ ฌ ํ์์ผ๋ก ํํ
์ ํ๋ : ์ ์ฒด ์ค ๋ฐ๋ฅด๊ฒ ์์ธกํ ๋น์จ
์ ๋ฐ๋ : positive๋ผ๊ณ ์์ธกํ ๊ฒ ์ค ์ค์ ๋ก positive์ธ ๋น์จ (TP/TP+FP)
์ฌํ์จ : ์ค์ ๋ก positive์ธ ๊ฒ ์ค positive๋ผ๊ณ ์์ธกํ ๋น์จ (TP/TP+FN)
f1-score : ์ ๋ฐ๋์ ์ฌํ์จ์ ์กฐํํ๊ท ( 2 * (precision * recall)/ (precision + recall))
(* ์ค๋ฌด์์๋ ์ฌํ์จ์ ๋ ์ค์ํ๊ฒ ์ฌ๊ธด๋ค๊ณ ํ๋ค. ์๋ฅผ ๋ค์ด ์ ์ง๋จ ์ฌ๋ถ๋ฅผ ์์ธกํ๋ค๊ณ ํ๋ฉด, ์์ ์ง๋จํ์ง ๋ชปํด ์ฃฝ๋ ๊ฒฝ์ฐ๊ฐ ์ ์ผ ์น๋ช ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ ๋ ๋ค ์ค์ํด ๋ณด์ด๋๋ฐ... ์ ๋ฐ๋๋ ์ข ํผํฌ๋จผ์ค ์์น ๊ฐ์ ๋๋์ด๋ผ๋ฉด ์ฌํ์จ์ ๋ณด์ฅ ํ๋ฅ ๊ฐ์ ๋๋)
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, f1_score
test_cm = confusion_matrix(test_y, pred)
test_acc = accuracy_score(test_y, pred)
test_pre = round(precision_score(test_y, pred), 2)
test_rc = round(recall_score(test_y, pred), 2)
f1_score = f1_score(test_y, pred)
๋ค์์ ROC๊ทธ๋ํ์ AUC score๋ฅผ ๊ตฌํด๋ณธ๋ค.
ROC๊ทธ๋ํ๋ TPR(ture positive rate)์ FPR(false positive)์ ๋ถํฌ๋ฅผ ์ ํ ๊ทธ๋ํ๋ก ๋ํ๋ธ ๊ฒ์ด๊ณ AUC(area under ROC curve) score๋ ROC๊ทธ๋ํ์ ๋ฉด์ ์ผ๋ก ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ํ๋ธ๋ค. 1์ ๊ฐ๊น์ธ์๋ก ์ฑ๋ฅ์ด ์ข์ ๊ฒ์ด๋ค
from sklearn.metrics import plot_roc_curve, roc_auc_score
plot_roc_curve(logr, test_x, test_y)
pred_proba = logr.predict_proba(test_x)
print(roc_auc_score(test_y, pred_proba[:, 1])) #0.9162394879671759
๊ทธ๋ํ์ ๊ฐ์ด ํ์๋ AUC score๋ 0.92์ ์ผ๋ก ์ด ๋ชจ๋ธ์ ์์ฒญ ๋์ ์ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
๋ roc_auc_score ํจ์๋ฅผ ํตํด AUC score๋ง ๋ฐ๋ก ๊ตฌํ ์๋ ์๋ค. ์ ๋ ฅ ๋ณ์๋ก ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค(์ฝ๋ ์ฐฝ์์๋ proba ๊ฐ์์ ๋๋ฒ์งธ ์ด ๊ฐ์ ๊ฐ์ ธ์์ ํ์)
'Daily' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
23.01.31 KNN ์ต๊ทผ์ ์ด์ (0) | 2023.01.31 |
---|---|
23.01.28 SVM ์ํฌํธ ๋ฒกํฐ ๋จธ์ (0) | 2023.01.29 |
23.01.27 Lasso, Elasticnet ๋ผ์, ์๋ผ์คํฑ๋ท (0) | 2023.01.28 |
23.01.25 Linear Regression, Ridge ๊ฒฝ์ฌํ๊ฐ๋ฒ, ๋ฆฟ์ง ํ๊ท (0) | 2023.01.25 |
23.01.24 Classification ๋ถ๋ฅ๋ถ์ (0) | 2023.01.24 |