ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유형별 데이터 분석 맛보기 03 - 분류분석 - 로지스틱스 회귀분석 (2)
    빅데이터/Machine-Learning 2022. 2. 16. 20:49

    패스트캠퍼스 '직장인을 위한 파이썬 데이터분석 올인원 패키치 Online' 참조

     

     

     

     

     

     

    01 분류분석

    • 말 그대로 어떠한 데이터에서 분류를 하는 모델을 말한다. 분류 분석 모델에는 로지스틱스, SVM, 의사결정나무, K군집 등이 있다.
    • 분류분석에는 크게 이진 분류, 다중 분류, 군집 분류로 나뉜다
    • 분류분석의 가장 큰 예시는 스팸메일 분류이다. 텍스트가 들어왔을때 텍스트의 특징을 분석하여 스팸인지 아닌지 분류 가능 하다. 스팸인지 아닌지라는 개념처럼 이진분류 기반이다.
    • 이진분류에서 가장 유명한 분류는 '로지스틱 회귀 모델' 이다. 이진 분류에 사용 되며 일반 회귀모델과 개념은 비슷하나 그 회귀에서 조금 더 발전하여 분류하는쪽으로 사용하는 개념이다. 
    • 회귀분석은 수치형만 가지고 가능 했다면 로지스틱 회귀분석은 범주형에도 회귀를 가능하도록 고안하였다. 
    • 아래의 예를 보자. 데이터가 0,1로만 존재하는 경우라면 회귀분석으로는 어색하거나 모델의 성능에 맞지 않을 것이다.   
    • 그래서 타겟 변수를 확률로 나타내어 확률값을 기반으로 0 혹은 1로 분류를 하는 것. 하지만 확률로 변화를 시키니 아래와 같은 문제점이 나온다. 모델이 회귀선을 그어서 분류를 하다보면 경우에 따라 1를 초과하거나 0보다 낮은 값이 나오기 마련이다. 하지만 확률은 절대로 음수가 나오거나 1이 넘어가면 안된다.
    • 이러한 문제점을 해결하기 위해 확률값을 -무한대 ~ 무한대로 확장을 해야하는데 이렇게하면 확률이 아니게 된다. 그래서 나온 개념이 'Odds(승산)' 개념이다. 임의의 사건이 발생하지 않을 확률 대비 일어날 확률의 비율을 뜻한다.
      이 값으로 확률값이 개선되는데 여전히 0~무한대로 표현 된다. 여기서 0이라는 제한이 있기때문에 애매한 확률값이 되었고 이를 해결하여 확률이지만 -무한대~무한대로 표현하고자 하는 개념이 나왔다
    • 그게 바로 로짓변환과 로지스틱 함수 이다. 0~무한대까지 나타내는 승산(Odds)값에 로그를 씌워 -무한대~무한대의 확률을 가질 수 있게 된 것.    
      승산값에 로그를 씌우면 -무한대~무한대 까지 구할 수 있는데 그 확률을 다시 함수화 시키면 'Logistic Function'이 된다. 이 로지스틱함수는 -무한대~무한대의 입력값을 받아도 0~1 사이의 확률을 돌려 준다. 
      이 함수를 사용하면 위와 같이 그래프가 만들어진다. 이 그래프에서의 'Z'는 로지스틱 함수를 씌우기 전인 일반 회귀분석의 Y값이다. 
      이제 Y를 Z로 놓아 구간을 -무한대~무한대로 바꾸고 여기에 로지스틱함수를 씌우게 되면 1,0 사이에 확률값으로 도출하게 되는 것
      즉 다시말해 로지스틱함수는 범위가 제한되어있지 않은 X의 입력값들을 시그모이드/로지스틱함수를 이용하여 Y값을 1,0사이의 확률값으로 표현하게됨
      여기서 Y값은 드디어 사건이 발생할 확률이 됨
      여기에 0~1 사이의 값을 가지는 임계값을 설정하고 사건이 발생할 확률이 어느정도 이상이어야 발생한다 라고 결정만 하면 된다.

    • 이를 결정하는 선을 'Decision Boundary'라고 부른다. 이 바운더리는 0.5가 기준인데 방정식으로 보면 w1x1+w2x2=y = w1x1+w2x2=0이 되는 지점이 디시즌 바운더리가 되는 지점이다. 


    • 그렇다면 로지스틱스 회귀분석이 어떻게 결정계수를 찾아가는지 보자
    • 회귀분석은 OSL학습 방법으로 2차함수 방정식의 최적 결정계수를 조금씩 수정하면서 하나의 곡선의 최저점을 찾았다면 로지스틱회귀분석은 손실함수가 2차함수가 아닌 시그모이드/로지스틱 함수를 사용했기때문에 여러 지수 함수들을 아래처럼 가지게 된다
      최저점인 'Global Minima'가 있지만 그 전에 'Local Minima'에서도 곡선의 최저점을 찍게 된다. 그래서 최저점을 찾기가 힘들 수 있다. 이를 해결하기 위해서 로그를 씌워줘야 한다. 
      수학적인 과정을 거치게 되면 첫번째 줄의 비용 함수가 나오게 된다. OSL는 로지스틱에서 못쓰게 되고 그래디언트 디센를 사용하여 최저점을 찾게 된다. 

     

     

     

     

    02 로지스틱회귀분석 모델의 전처리 방법

    • 원-핫 인코딩(One-Hot Encoding) 처리 방법
      회귀분석시에 이름은 쓰기 힘드니 제거를 하고 남은 데이터들을 처리하기 위한 데이터 처리 방법이다.

    이름은 제거하고 나머지를 써서 회귀분석을 하고 싶은데 좋아하는 과일은 문자형이다. 이 문자형을 어떻게 처리할까?

     

    • 멀티 레이블 인코딩(Mult-label Encoding) 방법
      범주형 변수의 문자열을 수치형으로 변환하는 방법 혹은 동시에 두가지의 범주형/문자형을 표현해야할때 아래와 같이 변환을해서 수치로 표현 
      참고 링크 (https://continuous-development.tistory.com/164)
      포켓몬 데이터를 예로 들면 타입이 총 18개인데 어느 한 포켓몬이 타입 18개 중 2개의 타입이라면 18개의 벡터 공간을 만들어놓고 해당하는 2개의 타입에 1,1을 마킹 나머지는 0으로 표현을 하는 것.

     

     

     

    03 분류 모델 평가 방법

    • 일반 회귀분석에서는 RMSE 혹은 결정계수를 써서 평가했는데 로지스틱스은 자기만의 평가 방법이 존재 한다. 
    • 분류분석에서 자주 쓰이는 평가방법이 'Confusion Matrix' 이다. 
      이진 분류에서 0,1을 분류할때 1을 얼마나 잘 예측했는지를 나타내는 척도이다. 
      실제값과 예측값이 동일하면 'T(True)', 틀리면 'F(False)'로 나타낸다
      예측값을 기준으로 Positive로 예측하면 'P', Negative로 예측하면 'N'로 나타낸다

      4개의 값으로 표현되는 값은 다음과 같다
      True Positive(TP) - 실제 True인 정답을 True라고 예측 (정답)
      False Positive(FP) - 실제 False인 정답을 True라고 예측 (오답)
      False Negative(FN) - 실제 True인 정답을 False라고 예측 (오답)
      True Negative(TN) - 실제 Flase인 정답을 False라고 예측 (정답)

      참고 링크(https://brunch.co.kr/@mnc/7#:~:text=%ED%98%BC%EB%8F%88%20%ED%96%89%EB%A0%AC%EC%9D%B4%EB%9E%80%20%EB%8B%A8%EC%96%B4%EC%97%90%EC%84%9C,%ED%95%A0%20%EC%88%98%20%EC%9E%88%EB%8A%94%20%ED%91%9C%EC%9E%85%EB%8B%88%EB%8B%A4.)

    • 이 4가지 성질을 이용하여 4개의 지표를 만들 수 있다
    1. 정확도(Accuracy)
      전체 중 정답 비율을 계산해주는 방법. 정확도의 값이 높을수록 예측 정확도가 높다고 할 수 있는데 정확도는 자칫하면 편향의 함정에 빠질 수 있다. 그 이유는 정확도는 Positive/Negative 상관없이 다 맞히기만 하면 되기 때문이다. 
      위의 예를 보자.  위의 데이터는 암센터의 데이터이다. 200개의 데이터 중 186개(TP/TN)를 맞히고 4개(FN/FP)의 오답이 나왔다. 4명의 사람은 암이 아닌데 암으로 진단 받거나 암인데 암이아니라고 진단을 받아버리는 것이다. 
      또 다른 예로 4월에 눈이 내릴지 여부를 예측할때 머신러닝없이 Negative로 예측하면 99.9%의 정확도가 나올 것이다. 4월에는 눈이 내리지 않으니까. 따라서 정확도로 평가를 할 때에는 데이터가 'imbalanced'할 시에는 적합하지 않은 평가지표다. 



    2. 정밀도(Precision)
      위의 표로 계산을 해보면 정밀도는 대략 80%정도 나온다. 특히나 사람의 목숨이 왔다갔다하는상황에서 99%도 아니고 80%라면 모델은 신뢰가 불가능 하다. 
      정밀도는 기본적으로 Positive 예측 중 정답 비율을 계산함. 'Yes'라고 예측 할 때 얼마나 정확한가를 측정하는 척도. 
      또 다른 예로 4월에 눈이 내리는 여부에 True만 답하는 분류기의 결함을 나타낼때 정밀도를 활용하여 측정이 가능. 


    3. 재현도(Recall)
      정확도의 편향의 함정을 보완하는 방법으로 실제 데이터에 Negative 비율이 너무 높아 희박한 가능성으로 발생 할 상황에 대해 제대로 된 분류를 해주는지 평가 하는 지표. 애초에 True가 발생하는 확률이 낮을때 사용하면 적합. 
      예로 4월에 눈이 내릴지에 대한 여부에 recall로 계산을 하면 실제 눈이 내릴 날짜 중 몇개나 맞았는지를 확인 할 수 있음. 단순이 정확도(Accuracy)로 False로 예측하면 99%가 되겠지만, 재현도(Recall)로 하면 0에 가깝게 나올 것. 
      하지만 여기에도 문제가 있다. 언제나 True만 답하는 분류기가 있다면 Recall은 잘 맞출것이다. 4월에 눈이 내렸던 날 만큼만은 정확하게 맞추어 Recall은 1에 가깝게 될 것. 따라서 Recall도 완벽하지는 않음



    4. 측정 방법들을 보면 알겠지만 3개다 완벽하지가 않고 Recall과 Precision은 반대되는 개념. 서로 트레이드 오프의 관계. 둘중 어느것에 우선순위를 둘 지를 염두해주며 한쪽의 수치를 낮추거나 두 수치의 균형점을 찾아줘야함. 예로 경진대회에서 높은 수준의 정밀도를 요구한다면 반드시 최소 재현도를 맞추어야함. 
      Recall과 Precision 두 방법 모두 유용한 지표이지만 두 가지를 모두 고려한 평가 수치도 존재한다

    5. F1 Score - Precision과 Recall 의 두 가지 조화 평균을 구하는 방법
      두 가지 지표 모두를 균형있게 반영하여 모델의 성능을 확인 함. 앞에서 언급했던 정확도는 균형이 잡힌 데이터에 적합하다고 했는데 'F1 Score'은 불균형 데이터에 적합한 평가 척도로 사용 된다. 불균형 데이터에 조화 평균을 함으로써 큰 값의 가중치를 낮추고 작은 값에 더 맞추는 과정을 거치면서 값의 크기가 상쇄되는 형태.
      AUC 또한 중요한 지표인데 아래 그림과 같이 곡선을 구성하는 데이터의 위치에 따라 TPR/FPR의 Decision Boundary가 변하게 됨. 디시즌 바운더리는 0.5를 기준으로 나누는데 0.6, 0.7... 로 하면 어떤 Confusion Matrix가 나오는지 볼 수 있다. 
      더 쉽게 아래와 같은 그래프로 보자. 가운데의 선이 디시즌 바운더리이다. 그 양옆으로 왼쪽 곡선이 정답 오른쪽 곡선이 오답이 된다. 디시즌 바운더리를 0.5로 해서 정확히 가운데로 나오면 좋겠지만 대부분의 실제 데이터들의 집합은 그렇지 못하다. 그렇기에 바운더리를 옮겨보면서 어떤값들이 나오는지 그리고 영역까지 계산을 해보면 모델이 분류를 수행하는 정확도를 확률의 기준으로 디테일하게 볼 수 있는 것. 

      그렇다면 디시즌 바운더리를 어디에 두느냐에따라 곡선의 형태는 아래와 같이 되고 데이터가 많으면 많을수록 AUC선의 형태는 곡선이 된다. 확률 분포를 잘 추정하게되면 바운더리들은 왼쪽으로 몰리면서 곡선을 이루게 되고 AUC 지표는 1에 가깝게 될 것이다. (AUC의 지표는 1에 가까울 수록 좋음, 즉 1,0을 나누었을때 얼마나 많은 정답을 맞춰서 1로 넘기느냐를 표현 함)
    6. 그외 특이도, 민감도, 발생률 등이 있다. 
      특이도 - 실제로 No일때 얼마나 자주 No를 예측하는가?
      민감도 - 실제로 Yes일때 얼마나 자주 Yes를 예측하는가?
      발생률 - 샘플에서 Yes조건이 실제로 얼마나 자주 발생하는가?

     

     

     

     

     

Designed by Tistory.