ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Logistic Regression(로지스틱 회귀분석) 예제(날씨 데이터) - train_test_split(과적합 방지), 머신러닝의 포용성(inclusion, tolerance)
    Python 데이터 분석 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% 인 경우보다 더 효과적이다.

     

     

    댓글

Designed by Tistory.