제2회 Google Colaboratory에서 시작하는 기계 학습을 위한 특징량 엔지니어링 - 로그 및 Box-Cox 변환

소개



본 기사에서는
로그 변환과 Box-Cox 변환에 대해 설명합니다. 본 기사는 주로 「 기계 학습을 위한 특징량 엔지니어링

또 본 기사의 내용을 보다 자세하게 YouTube 로 해설하고 있으므로 이쪽도 신경이 쓰이는 분은 체크해 봐 주세요.

※본 기사에서 해설하는 프로그램은 모두 여기 에 있습니다.

로그 변환이란?



로그 변환은 주로 다음 목적으로 사용됩니다.
  • 정규 분포를 따르기
  • 분산 감소

  • 로그 함수는 아래 그림과 같은 함수이며 x가 [1,10]의 범위를 [0,1]에 나타내고 [10,100]의 범위를 [1,2]에 나타내므로 x의 값이 작습니다. 경우는 넓은 범위에 찍히고 x의 값이 큰 경우는 좁은 범위에 찍힌다는 것을 알 수 있다.



    이 로그 변환을 사용하면 다음과 같이 밑단의 무거운 분포의 위쪽을 압축하고 아래쪽을 확대하여 정규 분포에 가깝게 만들 수 있습니다.
    많은 기계 학습 기법에서는 모집단에 특히 가정을 두지 않는 비 파라 메트릭 모델이 많기 때문에 정규 분포에 접근 할 필요는 없지만 통계 모집단의 분포를 가정하고있는 파라 메트릭 모델을 사용하는 경우 데이터 분포는 정규 분포여야 합니다.



    또한, 다음과 같은 큰 분산 데이터에 대수 변환을 사용하여 분산을 줄일 수 있습니다.

    로그 변환 적용 전 (분산 : 5.0e + 06)


    로그 변환 적용 후 (분산 : 0.332007)


    로그 변환 적용 샘플 코드

    log.py
    import numpy as np
    import pandas as pd
    
    
    ##乱数固定
    np.random.seed(100)
    
    data_array = []
    for i in range(1, 10000):
      max_num = i if i > 3000 else 1000 
      s = np.random.randint(0, max_num, 10)
      data_array.extend(s)
    
    data = pd.DataFrame({'Listen Count': data_array})
    
    data_log = pd.DataFrame()
    ##0になるのを防ぐために1を足す
    data_log['Listen Count'] = np.log10(data['Listen Count'] + 1)
    

    Box-Cox 변환이란?



    다음 식으로 정의할 수 있는 변환
    y=\begin{eqnarray}
    \left\{
    \begin{array}{l}
    \frac{x^\lambda - 1}{\lambda}~~~~~(if ~~ \lambda\neq0) \\
    \log(x)~~~~~(if ~~ \lambda=0)
    \end{array}
    \right.
    \end{eqnarray}
    
    

    어느 정도 정규 분포에 따른 데이터로 하고 싶은 Box-Cox 변환을 이용함으로써 데이터를 정규 분포에 따르게 할 수 있다. (※ 단, 데이터가 양수인 경우에만 사용 가능.)

    이 변환을 그래프로 나타내면 아래 그림과 같이 됩니다.

    Box-Cox 변환을 사용하려면 람다의 값을 미리 결정해야 합니다. 여기서 가장 우도법을 이용하여 변환 후의 데이터가 정규 분포에 가장 가까워지도록 람다를 결정합니다.

    실제로 아래 그림과 같은 분포를 한 데이터에 대해 Box-Cox 변환을 사용하면 정규 분포 같은 분포로 변환할 수 있다는 것을 알 수 있습니다.

    Box-Cox 변환 적용 전


    Box-Cox 변환 적용 후


    Box-Cox 변환 적용 샘플 코드
    from scipy import stats
    import numpy as np
    import pandas as pd
    
    ##乱数固定
    np.random.seed(100)
    
    ##データ生成
    data_array = []
    for i in range(1, 1000):
      s = np.random.randint(1, i * 100, 10)
      data_array.extend(s)
    data = pd.DataFrame({'Listen Count': data_array})
    
    ##Box-Cox変換
    rc_bc, bc_params = stats.boxcox(data['Listen Count'])
    print(bc_params) ##0.3419237117680786
    

    Q-Q 플롯



    Q-Q 플롯은 실측치와 이상값을 플롯한 것입니다. 즉, 직선이면 실측치는 정규 분포라고 말할 수 있습니다.
    아래는 원본 데이터, 로그 변환 후 데이터, Box-Cox 변환 후 데이터를 플로팅한 것입니다.

    원본 데이터


    로그 변환 후


    Box-Cox 변환 후


    이러한 결과로부터 Box-Cox 변환으로 가장 정규 분포를 따를 수 있었던 것을 알 수 있습니다.

    마지막으로



    YouTube에서 기계 학습을 중심으로 기술서의 리뷰나 해설 동영상을 올려 가고 있습니다. 또 IT계에 가면 알아 두는 것이 좋은 기업의 소개도 하고 있습니다. Youtube와 Qiita 갱신의 동기 부여에 연결하기 때문에, 좋아, 채널 등록, 고평가를 잘 부탁드립니다.
    YouTube : htps //w w. 요츠베. 코 m / 찬 l / 우 Cywlrxt0 dJGYtDBPW-ぺg
    트위터 : htps : // 라고 해서 r. 코 m / 갓

    참고



    h tps : // / ぉ- 키요시. 이 m/2018/12/26/포 st-1037/
    https://toukei-lab.com/box-cox%E5%A4%89%E6%8F%9B%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6% E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E3%81%AB%E5%BE%93%E3%82%8F%E3%81%AA%E3% 81%84%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A7%A3%E6%9E%90
    h tps : // 토케이에 r. 하테나 bぉg. 코m/엔트리/2019/09/08/224346
    h tps : // / g 마에 에이. 이 m/2018/09/23/ q-pぉt/

    좋은 웹페이지 즐겨찾기