-
Python 데이터분석 기초 54 - Logistic Regression(로지스틱 회귀분석)Python 데이터 분석 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()함수를 사용한다.
'Python 데이터 분석' 카테고리의 다른 글
Logistic Regression(로지스틱 회귀분석) 예제(외식 데이터) (0) 2022.11.17 Logistic Regression(로지스틱 회귀분석) 예제(날씨 데이터) - train_test_split(과적합 방지), 머신러닝의 포용성(inclusion, tolerance) (1) 2022.11.17 다중회귀모델 예제(degree) (0) 2022.11.17 Python 데이터분석 기초 53 - 다항회귀모델, 차원확대, 차원축소 (0) 2022.11.17 Python 데이터분석 기초 52 - 설명력이 매우 높을 때 Ridge 회귀모형, Lasso 회귀모형, Elastic Net 회귀모형을 사용 (0) 2022.11.17