ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • R을 이용한 머신러닝 - 4 (로지스틱 회귀모델을 이용한 분류 문제)
    Programming & Machine Learning/R X 머신러닝 2017. 7. 14. 01:19

    R에서의 로지스틱 회귀모델을 이용한 분류


    1. 분류 알고리즘

    1.1 회귀분석에서의 분류의 기법

    - y값은 범주형 데이터(그룹 변수)여야 분류가 가능한 수식이 완성됨.
    

    1.2-1 로지스틱 회귀

    로지스틱 회귀는 독립변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는 통계적 기법이다.
    따라서 로지스틱 회귀의 y값은 0~1 사이의 확률이 되는데, 이때의 확률은 이진 그룹에 속할 확률이다. 
    또한 로지스틱 회귀는 선형 회귀 분석과 다르게, 종속변수가 범주형 데이터이다.
    
    - 만약 일반적인 수식 y = b + ax라는 식이 있다고 할 때, 이 식은 y가 0~1로 나오지 않을 수 있음.
    
    - 따라서 f(x)의 결과가 0~1 확률로 나올수 있도록 함수를 구성해주는 것이 로지스틱 함수의 아이디어이다.
    
    - y에 log를 취해서 오른쪽 x값에 대한 balance를 맞춰준 뒤, 양쪽에 e를 취하여 정리하는 것이 수학적 원리.
    
    # 데이터셋 나눠서 로지스틱 회귀
    set.seed(1000)
    ind = sample(1:nrow(data1),
                 nrow(data1)*0.7,
                 replace = F)
    train = data1[ind, ]
    test = data1[-ind, ]
    m <- glm(Species~., data = train, family = "binomial")
    m$fitted.values
    train_y = ifelse(m$fitted.values>=0.5, 2, 1)
    table(train_y)
    table(train$Species, train_y)
    
    pred1 = predict(m, newdata = test, type = 'response')
    # response는 0~1사이의 결과값을 구해준다.
    pred_label = ifelse(pred1 >= 0.5, 2, 1)
    table(test$Species, pred_label)
    
    test$label = pred_label
    View(test)

    1.2-2 로지스틱 회귀 추가설명

    로지스틱 회귀는 일반적인 선형 모델의 특수한 모델로 볼 수 있다. 하지만 로지스틱 회귀 모델은 종속변수와 독립변수
    사이의 관계에 있어서 선형 모델과 차이점이 있다. 
    
    첫 번째로, 종속변수 y의 결과가 [0,1]로 제한된다는 점.
    두 번째로, 종속변수가 binary하기 때문에, 정규분포 대신 이항분포를 따른다는 점이다.
    
    이러한 차이점은 다음과 같은 수식으로 제안되어진 것이다. 
    이러한 로지스틱 모형을 사용하게 되면, 위의 두 가지 사항을 만족시키게 된다.
    

    logistic function은 odds ratio를 logit 변환한 수식이라고 할 수 있다.
    회귀분석에서는 오차항의 이분산성을 처리하거나 등분산을 가정해야 하기 때문에 등분산성 가정 이탈에 대한 문제가 생기는데, 
    logistic 회귀분석은 input feature를 이미 logit 변환을 하였기 때문에 자동적으로 등분산성가정 이탈에 대한 면역을 가진다
    는 것도 큰 장점중에 하나다.
    (참고 : 오차항이 이분산성을 가지면 가중최소제곱추정법을 사용하거나 종속변수를 변수변환시켜서 최소제곱추정법을 적용한다. 
    변수변환의 방법으로는 제곱근변환, 로그변환, 역수변환, 이차식변환, 지수변환 등이 자주 사용된다. 일반적인 회귀분석에서는 데이터
    표준화 등의 처리나, Lasso 알고리즘을 이용한 벌점 부과 외에도 변수변환도 고려해 보아야 한다.)
    
    odds ratio는 성공확률이 실패 확률에 비해 몇 배 더 높은지를 나타내는 수식이며,
    logit 변환은 오즈에 로그를 취한 함수로써, 어떠한 입력에도 출력값의 범위가 [0,1]에 속하게 하는 수식이다.
    만약 위에서 사용한 수식만을 적용한다면, 좌변의 값은 (0,∞) 만을 갖게되지만 로짓변환을 통해 모든 범위를 커버할 수 있게된다.
    
    즉, 종속변수를 0~1 사이의 확률로 나타내기 위해 오즈비를 활용하고, 범위를 보완하기 위해 로짓 변환까지 적용하는 과정이다.
    이러한 수식과 아이디어를 실행하여 예측 및 분류 문제에 적용하는 것이 로지스틱 회귀 기법이다.

    로지스틱 회귀에서 모델 피팅은 결과 모델이 개선될 때 까지(주로 오차항을 이용한다) 계수를 반복적으로 수정해나가는 반복처리를 
    수행한다. 
    
    이때, 아무리 반복해도 모델이 적합하게 수렴하지 않는 경우는 여러가지 이유가 있지만, 가장 대표적인 원인으로
    
    다중 공선성, 희소성, 완분성 등이 있다. 이에 대해서는 나중에 자세히 공부할 예정이다.
    
    반복처리를 수행하는 대표적인 알고리즘으로 Gradient Descent가 있다. 
    이 알고리즘은 오차항을 함수로 표현한 뒤, 오차항이 최소가 되어가는 지점을 미분을 통해 점진적으로 찾아내는 방법
    김성훈 교수님의 강의만큼 Gradient Descent를 깔끔하고 명확하게 설명한 자료를 본 적이 없다.
    
    https://www.youtube.com/watch?v=6vzchGYEJBc&feature=youtu.be
    

    1.3 다항 분류 회귀

    - 로지스틱 회귀의 아이디어를 확장시킨 것.
    
    - 로지스틱 회귀는 binary한 것에 대한 확률이었다면, 다항 로지스틱 회귀는 3개 이상의 레이블을 가진 분류문제.
    
    - 각각마다 로지스틱 함수를 통해 이항적인 확률을 구하여 합계를 낸 뒤, 확률의 합이 1이 되게끔 비율을 재조정.
    
    - 즉, a일 확률 0.2, b일 확률 0.5, c일 확률 0.3 이런식으로 합이 1이 되는 확률값으로 표현함.
    
    set.seed(1000)
    ind = sample(1:nrow(iris),
                 nrow(iris)*0.7,
                 replace = F)
    train = iris[ind, ]
    test = iris[-ind, ]
    library(nnet)
    (m <- multinom(Species~., data=train))
    m$fitted.values
    m_class <- max.col(m$fitted.values)
    
    table(m_class)
    table(train$Species, m_class)
    
    pred3 = predict(m, newdata = test, type = 'class')
    # class는 factor 결과값을 구해준다.
    table(pred3)
    table(test$Species, pred3)


    댓글

분노의 분석실 Y.LAB