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()함수를 사용한다.