ABOUT ME

-

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

     

     

     

    댓글

Designed by Tistory.