Python 데이터 분석
Logistic Regression(로지스틱 회귀분석) 예제(날씨 데이터) - train_test_split(과적합 방지), 머신러닝의 포용성(inclusion, tolerance)
코딩탕탕
2022. 11. 17. 17:12
# 날씨정보 데이터로 이항분류 : 내일 비가 올지?
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn.model_selection import train_test_split
data = pd.read_csv('../testdata/weather.csv')
print(data.head(2), data.shape) # (366, 12)
data2 = pd.DataFrame()
data2 = data.drop(['Date','RainToday'], axis = 1)
data2['RainTomorrow'] = data2['RainTomorrow'].map({'Yes':1, 'No':0}) # Dummy
print(data2.head(2))
print(data2['RainTomorrow'].unique()) # [1 0]
# RainTomorrow : 종속변수, 그 외는 독립변수
# train / test split == 7 : 3
train, test = train_test_split(data2, test_size = 0.3, random_state=42) # random_state 숫자가 랜덤으로 뽑히기 때문에 고정
print(train.shape, test.shape) # (256, 10) (110, 10)
col_select = '+'.join(train.columns.difference(['RainTomorrow'])) # RainTomorrow 뺀 나머지 칼럼을 엮어준다.
my_formula = 'RainTomorrow ~ ' + col_select
print(my_formula)
# model = smf.glm(formula = my_formula, data = train, family = sm.families.Binomial()).fit()
model = smf.logit(formula = my_formula, data = train, family = sm.families.Binomial()).fit()
print(model.summary()) # P>|z| 값이 0.05를 월등히 넘어가면 뺄지 고민해야 된다.
# print(model.params) # coef 값만 호출할 수 있다.
print('예측값 :', np.around(model.predict(test)[:10].values))
print('예측값 :', np.rint(model.predict(test)[:10].values)) # rint는 around함수랑 비슷함
print('실제값 :', test['RainTomorrow'][:10].values)
# 정확도
conf_mat = model.pred_table() # logit이 아닌 glm일 경우 = AttributeError: 'GLMResults' object has no attribute 'pred_table'
print('conf_mat : \n', conf_mat)
print('분류 정확도 :', (conf_mat[0][0] + conf_mat[1][1]) / len(train))
from sklearn.metrics import accuracy_score
pred = model.predict(test)
print('분류 정확도 :', accuracy_score(test['RainTomorrow'], np.around(pred))) # 실제값, 예측값
<console>
Date MinTemp MaxTemp Rainfall ... Cloud Temp RainToday RainTomorrow
0 2016-11-01 8.0 24.3 0.0 ... 7 23.6 No Yes
1 2016-11-02 14.0 26.9 3.6 ... 3 25.7 Yes Yes
[2 rows x 12 columns] (366, 12)
MinTemp MaxTemp Rainfall Sunshine ... Pressure Cloud Temp RainTomorrow
0 8.0 24.3 0.0 6.3 ... 1015.0 7 23.6 1
1 14.0 26.9 3.6 9.7 ... 1008.4 3 25.7 1
[2 rows x 10 columns]
[1 0]
(256, 10) (110, 10)
RainTomorrow ~ Cloud+Humidity+MaxTemp+MinTemp+Pressure+Rainfall+Sunshine+Temp+WindSpeed
C:\anaconda3\lib\site-packages\statsmodels\base\model.py:127: ValueWarning: unknown kwargs ['family']
warnings.warn(msg, ValueWarning)
Optimization terminated successfully.
Current function value: 0.288251
Iterations 8
C:\anaconda3\lib\site-packages\statsmodels\base\model.py:127: ValueWarning: unknown kwargs ['family']
warnings.warn(msg, ValueWarning)
Logit Regression Results
==============================================================================
Dep. Variable: RainTomorrow No. Observations: 253
Model: Logit Df Residuals: 243
Method: MLE Df Model: 9
Date: Thu, 17 Nov 2022 Pseudo R-squ.: 0.3995
Time: 17:01:06 Log-Likelihood: -72.927
converged: True LL-Null: -121.45
Covariance Type: nonrobust LLR p-value: 6.232e-17
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 219.3889 53.366 4.111 0.000 114.794 323.984
Cloud 0.0616 0.118 0.523 0.601 -0.169 0.293
Humidity 0.0554 0.028 1.966 0.049 0.000 0.111
MaxTemp 0.1746 0.269 0.649 0.516 -0.353 0.702
MinTemp -0.1360 0.077 -1.758 0.079 -0.288 0.016
Pressure -0.2216 0.052 -4.276 0.000 -0.323 -0.120
Rainfall -0.1362 0.078 -1.737 0.082 -0.290 0.018
Sunshine -0.3197 0.117 -2.727 0.006 -0.550 -0.090
Temp 0.0428 0.272 0.157 0.875 -0.489 0.575
WindSpeed 0.0038 0.032 0.119 0.906 -0.059 0.066
==============================================================================
예측값 : [0. 0. 0. 0. 0. 0. 1. 1. 0. 0.]
예측값 : [0. 0. 0. 0. 0. 0. 1. 1. 0. 0.]
실제값 : [0 0 0 0 0 0 1 1 0 0]
conf_mat :
[[197. 9.]
[ 21. 26.]]
분류 정확도 : 0.87109375
분류 정확도 : 0.8727272727272727
정확도 검사를 하기 위해서는 logit()함수를 사용해야된다. glm()함수는 안 된다.
머신러닝의 포용성(inclusion, tolerance)
통계 및 추론 모델로 새로운 값을 예측(정량, 정성)
y = w * 2 + 0 수학에서는 100%의 답을 원한다.
통계에서는 4의 주변값이 나올 수 있도록 학습을 한다.
예를 들어 개 이미지 분류를 하는 경우 꼬리가 없는 개도 정확하게 분류되도록 하는 것이 머신러닝의 목적이다.
포용성이 있는 모델이라 함은 데이터 분류 인식률이 80%, 90% 등인 것이 100% 인 경우보다 더 효과적이다.