Seongho Jang
Ch.15 로지스틱 회귀분석 본문
1. 로지스틱 회귀
Supervised Learning의 일종으로 입력 데이터에 존재하는 Feature값들과 label 값들의 class간의 관계를 학습하여 새로 관측된 데이터의 class를 예측하는 문제
- 이진 분류: Label 값으로 0/1, Y/N 등과 같이 두 가지 class만 가능
★ 로지스틱 회귀의 변환 과정
- 임계값: P(Y = 1) > 임계값이면 1로 분류 / P(Y = 1) < 임계값이면 0으로 분류
임계값을 낮추면 민감도가 높아져 오분류가 높아지더라도 Y = 1인경우를 최대한 분류
임계값을 높이면 Precision이 높아져 알파 오류를 최소화
- ROC Curve와 AUC(Area Under the Curve):
Negative 중 False Negative를 x축에, Positive 중 True Postive를 y축에 표시
특이도가 감소하는 속도에 비해 얼마나 빠르게 민감도가 증가하는지를 나타냄
Positive로 예측한 값들 중 True Positive가 실제로 Negative일 경우보다 높아야 AUC가 높게 나옴
● AUC = 1이면 Positive와 Negative를 완벽하게 분리
● AUC = 0.5이면 Positive와 Negative를 전혀 분리하지 못함 (Random)
출처 : https://bioinformaticsandme.tistory.com/328
2. Logit / Logistic Regression / Accuracy Score
import pandas as pd
import numpy as np
from statsmodels.api import Logit
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
Logit (Exog : 종속변수, Endog : 독립변수)
pred : Iris.csv의 Sepal.length와 Sepal.width를 가지고 setosa일 확률을 보여주는 것
이 값이 threshold(여기서는 0.5)를 넘으면 1로, 아니면 0으로 분류((pred > 0.5) + 0)하여
df["is_setosa"] = (df["Species"] == "setosa" ) + 0 과 비교한다.
LogisticRegression : Logit보다 기능이 더 많음
model.coef_ : 회귀 모델의 계수(기울기)
model.intercept_ : 회귀 모델의 절편
AUC를 구하는 ROC는 y_true와 y_pred, Accuracy를 구하는 경우에는 y_true와 y_pred를 사용
그 외에는 전부 똑같다.
precision_score(), recall_score() 등도 전부 동일
문제 1
독립변수를 혈압, 혈당, BMI, 인슐린으로 하고 종속변수를 당뇨 여부로 할 때 분류 정확도는 얼마인가?
import pandas as pd
import numpy as np
from statsmodels.api import Logit
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
df = pd.read_csv('diabetes.csv')
df_train, df_test = train_test_split(df, train_size = 0.8, test_size = 0.2, random_state = 123)
model = Logit(endog = df_train["Outcome"],
exog = df_train.loc[:, ["Glucose", "BloodPressure", "BMI", "Insulin"]]).fit()
pred = model.predict(exog = df_test.loc[:, ["Glucose", "BloodPressure", "BMI", "Insulin"]])
pred_class = (pred > 0.5) + 0
accuracy_score(y_true = df_test["Outcome"], y_pred = pred_class)
model 뒤에 반드시 fit()을 해주기
어디에 train set, test set을 쓰는지 제대로 알고 있기
독립변수 순서 바꿔쓰지 말기...
문제 2
독립변수를 혈당, BMI, 나이로 하고 종속변수를 당뇨 여부로 할 때 나이의 승산비는 얼마인가?
df = pd.read_csv('diabetes.csv')
model = Logit(endog = df["Outcome"],
exog = df.loc[:, ["Glucose", "BMI", "Age"]]).fit()
np.exp(model.params)
풀이 자체는 매우 단순한데, 로지스틱 회귀분석 개념을 이해 못하면 전혀 못 풀만한 문제인 것 같다.
#1. logit함수값과 오즈는 무엇인가?
statsmodels패키지를 설치하면 from statsmodels.formula.api import logit을 통해 logit 함수를 사용할 수 있다.
logit함수값을 구하기 위해서는 logit('종속변수명 ~ 독립변수명1 + 독립변수명2 + 독립변수명3', data=데이터프레임객체).fit().summary() 의 형태로 코드를 구성하는데, 아래와 같이 그 결과값들을 확인할 수 있다.
Logit Regression Results
이중에서 맨 아래에서 coef가 바로 각 독립변수들의 logit함수 계수들이다. 해당 값이 0에 가까울수록 종속변수에 미치는 영향이 적고, 해당 값이 0에서 멀수록 종속변수에 영향력이 있다고 볼 수 있다.
로짓함수식에서 Intercept는 절편이고, coef는 해당 독립변수의 오즈에 log를 씌운 값이다. 즉 log(odds)이다. 참고로 여기서 log는 상용로그가 아니라 자연상수 e에 대한 로그이다. 또한, 오즈비는 실패할 확률 분의 성공할 확률이고, 아래에서는 합격여부가 종속변수이므로 불합격할 확률 분의 합격할 확률이다.
#2. 오즈(Odds)를 확인하려면? -- logit함수의 계수를 지수함수로 변환한다
위에서 전체 summary()형태의 결과값 말고, 아래 코드를 통해 각 logit함수의 계수들을 하나의 array로 받아 올 수 있다.
logit('종속변수명 ~ 독립변수명1 + 독립변수명2 + 독립변수명3', data=데이터프레임객체).fit().params
이 array에 np.exp( )를 씌우면 각각의 회귀계수들을 밑이 자연상수 e인 지수함수(e^회귀계수값)로 변환할 수 있다. 즉, np.exp( logit값 ) = 오즈 를 구하는 것이다.
출처: https://lovelydiary.tistory.com/347
파이썬) statsmodels로 logit함수 이해하기 (+Logit Regression Results 해석)
#1. logit함수값과 오즈는 무엇인가? statsmodels패키지를 설치하면 from statsmodels.formula.api import logit을 통해 logit 함수를 사용할 수 있다. logit함수값을 구하기 위해서는 logit('종속변수명 ~ 독립변수명1
lovelydiary.tistory.com
기초가 너무 허접하니까 한참을 보고서야 대~충 무슨 뜻인지 알수 있었다ㅠㅠ
문제 3
독립변수를 혈당, BMI, 나이로 하고 종속변수를 당뇨 여부로 할 때 모델의 AUC는 얼마인가?
from sklearn.metrics import roc_auc_score
df = pd.read_csv('diabetes.csv')
model = Logit(endog = df["Outcome"],
exog = df.loc[:, ["Glucose", "BMI", "Age"]]).fit()
pred = model.predict(exog = df.loc[:, ["Glucose", "BMI", "Age"]])
roc_auc_score(y_true = df["Outcome"], y_score = pred)
간단한 문제였는데, 이번에는 pred_class로 분류를 한 값을 y_score에 넣어서 틀렸다.
y_score 인자에는 예측 확률값을 할당해야 하므로 이진분류한 값을 넣으면 안된다.
'Data Science Lv.2' 카테고리의 다른 글
Ch.6 - 7 데이터 전처리(1): 결측치, 이상치, 파생변수 생성 (0) | 2023.01.06 |
---|---|
Ch.18 의사결정나무 (0) | 2023.01.03 |
Ch.17 KNN (0) | 2023.01.02 |
Ch.16 나이브 베이즈 분류 (0) | 2023.01.02 |
Ch.13 비계층적 군집분석 (0) | 2023.01.01 |