Logistic Regression Model

반응형
Logistic Regression Model

1. glm()

  • 로지스틱 회귀(Logistic Regression) 모형은 특정 데이터에서 설명변수 \(X\)에 의하여 반응변수의 분류의 형태가 \(Y\)일 확률을 \(p\), 반대로 \(N\)일 확률을 \(1-p\)로 가정할 때 다음과 같은 선형 모형을 가정합니다.

    \[\log\bigg(\frac{p}{1-p}\bigg)=\beta_0 + \beta_1X\]

  • 우리가 흔히 알고 있는 선형 회귀(Linear Regression) 모형과 차이를 살펴본다면 일반 선형 회귀모형은 반응변수의 값이 확률 값이 아닌 \((-\infty, \infty)\) 값을 가질 수 있습니다. 하지만 우리가 예측하고자 하는 \(p\)는 반응변수의 분류가 \(Y\)일 확률을 의미하므로 \((0, 1)\) 사이 값을 갖습니다.
  • 따라서 이를 맞춰주기 위해 \(p\)가 아닌 오즈비(odds-ratio)를 예측하도록 하는 것 입니다. 식은 다음과 같습니다.

    \[\frac{p}{1-p}=\beta_0 + \beta_1 X\]

  • 여기서 좌변이 똑같이 \((-\infty, \infty)\) 값을 갖기 위해서는 양변에 \(\log\) 함수를 취합니다. 그 결과 얻어진 함수를 로짓 함수(logit function)이라고 합니다.

  • R에서 로지스틱 회귀모형은 glm() 함수를 이용하여 수행합니다.

    glm(formula,
        data,
        family = "binomial")
    • formula : 모형식, 반응변수 ~ 설면변수들
    • data : 모형식을 적용할 데이터프레임
    • family : 오차 분포와 링크 함수(link function), 로지스틱 회귀 모형의 경우 family = “binomial”을 지정합니다.

2. glm() object fitting

  • ISLR 패키지 안에 내장되어 있는 Default 데이터를 예제(신용카드 자료)로 실습해보겠습니다. 데이터 탐색과정을 생략하고 모형 fitting에만 중점을 두어 설명하겠습니다.

    library(ISLR)
    data(Default)
  • Default 데이터의 구조를 살펴보면 다음과 같습니다. 여기서는 고객의 카드 채무 불이행 여부를 예측하는 것이 주요 목적입니다.

    str(Default)
    ## 'data.frame':    10000 obs. of  4 variables:
    ##  $ default: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
    ##  $ student: Factor w/ 2 levels "No","Yes": 1 2 1 1 1 2 1 2 1 1 ...
    ##  $ balance: num  730 817 1074 529 786 ...
    ##  $ income : num  44362 12106 31767 35704 38463 ...
    • 채무불이행(default) : Yes/No
    • 학생여부(student) : Yes/No
    • 채무잔액(balance)
    • 연수입(income)
  • 간단하게 7:3의 비율로 training data와 test data로 분리 후 glm() 함수를 이용하여 모형을 적합시키겠습니다.

    index <- sample(1:nrow(Default), size = nrow(Default) * 0.8)
    training <- Default[index, ]
    test <- Default[-index, ]
    m1 <- glm(default ~ student + balance + income,
              data = training, 
              family = binomial)
    
    m1
    ## 
    ## Call:  glm(formula = default ~ student + balance + income, family = binomial, 
    ##     data = training)
    ## 
    ## Coefficients:
    ## (Intercept)   studentYes      balance       income  
    ##  -1.052e+01   -9.680e-01    5.766e-03   -5.093e-06  
    ## 
    ## Degrees of Freedom: 7999 Total (i.e. Null);  7996 Residual
    ## Null Deviance:       2347 
    ## Residual Deviance: 1257  AIC: 1265
    • 각 설명변수에 대한 회귀 계수 값이 출력됨을 확인할 수 있습니다. summary() 함수를 통하여 계수의 유의성 또한 확인할 수 있습니다.
    summary(m1)
    ## 
    ## Call:
    ## glm(formula = default ~ student + balance + income, family = binomial, 
    ##     data = training)
    ## 
    ## Deviance Residuals: 
    ##     Min       1Q   Median       3Q      Max  
    ## -2.4737  -0.1407  -0.0553  -0.0203   3.7396  
    ## 
    ## Coefficients:
    ##               Estimate Std. Error z value Pr(>|z|)    
    ## (Intercept) -1.052e+01  5.396e-01 -19.493  < 2e-16 ***
    ## studentYes  -9.680e-01  2.635e-01  -3.673 0.000239 ***
    ## balance      5.766e-03  2.607e-04  22.115  < 2e-16 ***
    ## income      -5.093e-06  9.136e-06  -0.557 0.577192    
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    ## 
    ## (Dispersion parameter for binomial family taken to be 1)
    ## 
    ##     Null deviance: 2347.3  on 7999  degrees of freedom
    ## Residual deviance: 1257.2  on 7996  degrees of freedom
    ## AIC: 1265.2
    ## 
    ## Number of Fisher Scoring iterations: 8
    • 본 모형에서는 연수입이 채무불이행 여부에 큰 유의미한 결과를 보이지 않는 것으로 해석됩니다.
  • 다음을 식으로 표현하자면 다음과 같습니다.

\[P(X) = \frac{\exp(-10.87 -0.6468\text{student:yes} + 0.0057\text{balance} + 0.00003\text{income})}{1 + \exp(-10.87 -0.6468\text{student:yes} + 0.0057\text{balance} + 0.00003\text{income})}\]

  • 주의 : 여기서는 학생여부(studnet) 변수인 질적변수를 사용했기 때문에 Simpson’s paradox에 유의하여 모형을 적합시켜야 함을 알려드립니다.

3. predict()

  • glm() 함수를 이용하여 모형을 적합시켰다면 그 객체를 predict() 함수를 가지고 예측을 수행할 수 있습니다.
predict(object,
        newdata,
        type = c("link", "response", "terms"))
  + object : glm 객체
  + newdata : 예측을 수행할 테스트 데이터프레임 (변수명이 일치해야 합니다)
  + type : 예측 결과의 유형을 지정합니다. type = "link" 일 경우 log-odds 값이 출력되며, type = "response"의 경우 확률 $p$ 값이 출력됩니다.
  
  • test data를 이용하여 predict() 함수를 적용한 결과는 다음과 같습니다.
head( predict(m1, newdata = test) )
##          6          8         10         11         12         13 
##  -6.222017  -6.913034 -10.666943 -11.597265  -4.516013  -9.295015
head( predict(m1, newdata = test, type = "response") )
##            6            8           10           11           12 
## 1.981304e-03 9.937466e-04 2.330211e-05 9.191105e-06 1.081430e-02 
##           13 
## 9.187267e-05


4. Multinomial Logistic Regression : multinom()

  • 예측하고자 하는 분류가 두 개가 아니라 두 개 이상이 될 수 있는 경우 다항 로지스틱 회귀분석(Multinomial Logistic Regression)을 이용합니다.
  • 이는 nnet 패키지 안에 내장되어 있는 multionom() 함수를 이용하여 시행할 수 있습니다. 함수에 이용되는 인자는 glm()과 똑같다고 보시면 됩니다.

    library(nnet)
  • R에 기본적으로 내장되어 있는 iris 데이터를 가지고 적용해본 결과 다음과 같습니다.

    m2 <- multinom(Species ~ .,
                   data = iris)
    ## # weights:  18 (10 variable)
    ## initial  value 164.791843 
    ## iter  10 value 16.177348
    ## iter  20 value 7.111438
    ## iter  30 value 6.182999
    ## iter  40 value 5.984028
    ## iter  50 value 5.961278
    ## iter  60 value 5.954900
    ## iter  70 value 5.951851
    ## iter  80 value 5.950343
    ## iter  90 value 5.949904
    ## iter 100 value 5.949867
    ## final  value 5.949867 
    ## stopped after 100 iterations
    m2
    ## Call:
    ## multinom(formula = Species ~ ., data = iris)
    ## 
    ## Coefficients:
    ##            (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
    ## versicolor    18.69037    -5.458424   -8.707401     14.24477   -3.097684
    ## virginica    -23.83628    -7.923634  -15.370769     23.65978   15.135301
    ## 
    ## Residual Deviance: 11.89973 
    ## AIC: 31.89973
  • 적합한 모형이 주어진 데이터에 어떻게 적합되었는지 fitted() 함수를 이용하여 구할 수 있습니다.

    head( fitted(m2) )
    ##      setosa   versicolor    virginica
    ## 1 1.0000000 1.526406e-09 2.716417e-36
    ## 2 0.9999996 3.536476e-07 2.883729e-32
    ## 3 1.0000000 4.443506e-08 6.103424e-34
    ## 4 0.9999968 3.163905e-06 7.117010e-31
    ## 5 1.0000000 1.102983e-09 1.289946e-36
    ## 6 1.0000000 3.521573e-10 1.344907e-35
  • 마찬가지로 predict() 함수를 이용하여 예측이 가능하며 확률을 예측하고자 한다면 type = "prob", 각 분류에 속할 클래스를 예측하고자 한다면 type = "class"를 인자에 추가해주시면 됩니다.

    head( predict(m2, newdata = iris, type = "probs") )
    ##      setosa   versicolor    virginica
    ## 1 1.0000000 1.526406e-09 2.716417e-36
    ## 2 0.9999996 3.536476e-07 2.883729e-32
    ## 3 1.0000000 4.443506e-08 6.103424e-34
    ## 4 0.9999968 3.163905e-06 7.117010e-31
    ## 5 1.0000000 1.102983e-09 1.289946e-36
    ## 6 1.0000000 3.521573e-10 1.344907e-35
    head( predict(m2, newdata = iris, type = "class"))
    ## [1] setosa setosa setosa setosa setosa setosa
    ## Levels: setosa versicolor virginica
  • 실제 모형의 정확도를 비교하고 싶다면 predict() 함수를 이용하여 예측한 값을 따로 object에 지정하고 실제 반응변수의 클래스와 일치하는지 정도를 가지고 정확도를 계산할 수 있습니다.

    pred <- predict(m2, newdata = iris, type = "class")
    sum(iris$Species == pred) / NROW(pred)
    ## [1] 0.9866667
  • 또한 반응변수의 클래스가 2개 이상인 경우 분할표를 사용해 세부적인 정확도를 분석할 수 있습니다. 다만 여기서는 training data와 test data를 구분하지 않았기에 새로운 데이터에 대한 예측 성능은 비교할 수 없을 알려드립니다.

    xtabs(~ pred + iris$Species)
    ##             iris$Species
    ## pred         setosa versicolor virginica
    ##   setosa         50          0         0
    ##   versicolor      0         49         1
    ##   virginica       0          1        49
반응형

'Statistical Modeling & ML > Classification' 카테고리의 다른 글

Tree Models  (0) 2017.10.08
TAGS.

Comments