Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Seongho Jang

Ch.15 로지스틱 회귀분석 본문

Data Science Lv.2

Ch.15 로지스틱 회귀분석

seonghojang 2023. 1. 2. 00:46

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