Python 데이터 분석

Python 데이터분석 기초 54 - Logistic Regression(로지스틱 회귀분석)

코딩탕탕 2022. 11. 17. 15:28

 

종속변수와 독립변수 간의 관계로 예측모델을 생성한다는 점에서 선형회귀분석과 유사하다.

하지만 독립변수(x)에 의해 종속변수(y)의 범주로 분류한다는 측면에서 분류분석 방법이다.

분류 문제에서 선형 예측에 시그모이드 함수를 적용하여 가능한 각 불연속 라벨 값에 대한 확률을 생성하는 모델로 이진분류 문제에 흔히 사용되지만 다중클래스 분류(다중 클래스 로지스틱 회귀 또는 다항회귀)에도 사용될 수 있다.

 

독립변수 : 연속형, 종속변수 : 범주형

뉴럴네트워크(신경망)에서 사용된다.

 

# Logistic Regression
# 종속변수와 독립변수 간의 관계로 예측모델을 생성한다는 점에서 선형회귀분석과 유사하다. 하지만
# 독립변수(x)에 의해 종속변수(y)의 범주로 분류한다는 측면에서 분류분석 방법이다. 분류 문제에서 선형
# 예측에 시그모이드 함수를 적용하여 가능한 각 불연속 라벨 값에 대한 확률을 생성하는
# 모델로 이진분류 문제에 흔히 사용되지만 다중클래스 분류(다중 클래스 로지스틱 회귀 또는 다항회귀)에도 사용될 수 있다.
# 독립변수 : 연속형, 종속변수 : 범주형
# 뉴럴네트워크(신경망)에서 사용됨

import math

def sigFunc(x):
    return 1 / (1 + math.exp(-x)) # 시그모이드 함수 처리 결과 반환

print(sigFunc(3)) # 인자값은 로짓 전환된 값이라 가정
print(sigFunc(1))
print(sigFunc(37.6))
print(sigFunc(-3.4))

print('mtcars dataset으로 분류 모델 작성')
import statsmodels.api as sm

carData = sm.datasets.get_rdataset('mtcars')
print(carData.keys())
carDatas = sm.datasets.get_rdataset('mtcars').data
print(carDatas.head(3))
mtcar = carDatas.loc[:, ['mpg','hp','am']]
print(mtcar.head(3))
print(mtcar['am'].unique()) # [1 0]
print(mtcar.shape) # (32, 3)

# 연비와 마력수에 따른 변속기 분류(수동, 자동)
# 모델 작성 1 : logit()
import statsmodels.formula.api as smf
import numpy as np

formula = 'am ~ hp + mpg'
result = smf.logit(formula = formula, data = mtcar).fit()
print(result)
print(result.summary())
# print('예측값 :', result.predict())

pred = result.predict(mtcar[:10])
print('예측값 :', pred.values)
print('예측값 :', np.around(pred.values)) # np.around() 0.5를 기준으로 0과 1로 반올림하여 나눈다.
# [0. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
print('실제값 :', mtcar['am'][:10].values)

print()
conf_tab = result.pred_table()
print(conf_tab)
print('분류 정확도 :', (16 + 10) / len(mtcar)) # 0.8125
print('분류 정확도 :', (conf_tab[0][0] + conf_tab[1][1]) / len(mtcar))
from sklearn.metrics import accuracy_score
pred2 = result.predict(mtcar)
print('분류 정확도 :', accuracy_score(mtcar['am'], np.around(pred2))) # 실제값, 예측값

print('-----------')
# 모델 작성 2 : glm() - 일반화된 선형모델
result2 = smf.glm(formula = formula, data = mtcar, family = sm.families.Binomial()).fit()
print(result2)
print(result2.summary())
print()
glm_pred = result2.predict(mtcar[:10])
print('glm 예측값 :', np.around(glm_pred.values))
print('glm 실제값 :', mtcar['am'][:10].values)

glm_pred2 = result2.predict(mtcar)
print('분류 정확도 :', accuracy_score(mtcar['am'], np.around(glm_pred2))) # 실제값, 예측값

print('\n새로운 값으로 분류 예측')
newdf = mtcar.iloc[:2].copy()
print(newdf)
newdf['mpg'] = [50, 21]
newdf['hp'] = [100, 120]
print(newdf)
new_pred = result2.predict(newdf)
print('분류예측결과 :', np.around(new_pred.values))




<console>
0.9525741268224334
0.7310585786300049
1.0
0.032295464698450516
mtcars dataset으로 분류 모델 작성
dict_keys(['data', '__doc__', 'package', 'title', 'from_cache', 'raw_data'])
                mpg  cyl   disp   hp  drat     wt   qsec  vs  am  gear  carb
Mazda RX4      21.0    6  160.0  110  3.90  2.620  16.46   0   1     4     4
Mazda RX4 Wag  21.0    6  160.0  110  3.90  2.875  17.02   0   1     4     4
Datsun 710     22.8    4  108.0   93  3.85  2.320  18.61   1   1     4     1
                mpg   hp  am
Mazda RX4      21.0  110   1
Mazda RX4 Wag  21.0  110   1
Datsun 710     22.8   93   1
[1 0]
(32, 3)
Optimization terminated successfully.
         Current function value: 0.300509
         Iterations 9
<statsmodels.discrete.discrete_model.BinaryResultsWrapper object at 0x0000020DF28EEC10>
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                     am   No. Observations:                   32
Model:                          Logit   Df Residuals:                       29
Method:                           MLE   Df Model:                            2
Date:                Thu, 17 Nov 2022   Pseudo R-squ.:                  0.5551
Time:                        16:06:50   Log-Likelihood:                -9.6163
converged:                       True   LL-Null:                       -21.615
Covariance Type:            nonrobust   LLR p-value:                 6.153e-06
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    -33.6052     15.077     -2.229      0.026     -63.156      -4.055
hp             0.0550      0.027      2.045      0.041       0.002       0.108
mpg            1.2596      0.567      2.220      0.026       0.147       2.372
==============================================================================

Possibly complete quasi-separation: A fraction 0.12 of observations can be
perfectly predicted. This might indicate that there is complete
quasi-separation. In this case some parameters will not be identified.
예측값 : [0.25004729 0.25004729 0.55803435 0.35559974 0.39709691 0.00651918
 0.10844152 0.63232168 0.58498645 0.06598365]
예측값 : [0. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
실제값 : [1 1 1 0 0 0 0 0 0 0]

[[16.  3.]
 [ 3. 10.]]
분류 정확도 : 0.8125
분류 정확도 : 0.8125
분류 정확도 : 0.8125
-----------
<statsmodels.genmod.generalized_linear_model.GLMResultsWrapper object at 0x0000020DF42439A0>
                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                     am   No. Observations:                   32
Model:                            GLM   Df Residuals:                       29
Model Family:                Binomial   Df Model:                            2
Link Function:                  Logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -9.6163
Date:                Thu, 17 Nov 2022   Deviance:                       19.233
Time:                        16:06:50   Pearson chi2:                     16.1
No. Iterations:                     7   Pseudo R-squ. (CS):             0.5276
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    -33.6052     15.077     -2.229      0.026     -63.155      -4.055
hp             0.0550      0.027      2.045      0.041       0.002       0.108
mpg            1.2596      0.567      2.220      0.026       0.147       2.372
==============================================================================

glm 예측값 : [0. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
glm 실제값 : [1 1 1 0 0 0 0 0 0 0]
분류 정확도 : 0.8125

새로운 값으로 분류 예측
                mpg   hp  am
Mazda RX4      21.0  110   1
Mazda RX4 Wag  21.0  110   1
               mpg   hp  am
Mazda RX4       50  100   1
Mazda RX4 Wag   21  120   1
분류예측결과 : [1. 0.]

선형회귀분석과 비슷하지만 로지스틱 회귀분석은 logit()함수를 사용한다.