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% 인 경우보다 더 효과적이다.