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 |
---|