RobustScaler 적용 결과를 그래프에 그립니다.

scikit-learn의 전처리 기능 중 하나인 RobustScaler에 대한 이해를 높이기 위해 간단한 데이터 포인트에 적용한 결과를 그래프에 플로팅해 보았습니다.

RobustScaler의 특징


  • 데이터 포인트를 중앙값이 0이 되고 사분위 범위(interquartile range, IQR)가 1이 되도록 이동·스케일 변환한다.
  • 고등학교 수학에서는 사분위수를 데이터 포인트의 중앙값 전후 부분의 중앙값으로 구합니다만, RobustScaler에서는 데이터 포인트의 요소수를 $n$ 라고 하면, $q$ 분위수(quartile)는 $ (n-1)q +1$ 번째의 데이터 포인트(자연수가 되지 않는 경우는 값을 보완한다)로서 구한다.
  • 예: 5개의 요소를 가진 데이터 포인트에서 25% 분위수는 두 번째 요소가 된다.

  • 평균과 분산을 이용한 이동·스케일 변환에 비해 이상치의 영향을 받기 어렵다.

  • 검증 코드


    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import RobustScaler
    
    # 検証用データポイント
    X = np.array([[-4], [-3], [-1], [0], [2]])
    
    # RobustScalerを検証用データポイントに適用する。
    scaler = RobustScaler()
    X_ft = scaler.fit_transform(X)
    
    # 適用前後のデータポイントをグラフに描画する。
    fig = plt.figure(figsize=(8,4))
    ax1 = fig.add_subplot(1, 1, 1)
    # 適用前のデータポイントをx=1上にプロットする。
    ax1.hlines([1], -5, 3)
    ax1.plot(X, np.array([[1], [1], [1], [1], [1]]), "o")
    # 適用後のデータポイントをx=0上にプロットする。
    ax1.hlines([0], -5, 3)
    ax1.plot(X_ft, np.array([[0], [0], [0], [0], [0]]), "o")
    
    # グラフの見た目を調整する。
    ax1.set_xlim(-4.5, 2.5)
    ax1.set_ylim(-0.5, 1.5)
    ax1.set_yticks([0, 1])
    ax1.set_yticklabels(["after", "before"])
    
    # グラフに注釈(補助線など)を入れる。
    ax1.vlines([X_ft[2]], -1, 0, linestyles='dashed')
    ax1.vlines([X_ft[1], X_ft[3]], 0, 0.5, linestyles='dashed')
    hw = 0.1
    hl = 0.1
    ax1.hlines([0.25], X_ft[1], X_ft[3], linestyles='dashed')
    # 25%分位数は2番目(インデックス1)、75%分位数は4番目(インデックス3)となる。
    ax1.arrow(X_ft[3][0]-hl, 0.25, 0.001, 0, fc='black', ec='black', head_width=hw, head_length=hl)
    ax1.arrow(X_ft[1][0]+hl, 0.25, -0.001, 0, fc='black', ec='black', head_width=hw, head_length=hl)
    ax1.text((X_ft[3][0]+X_ft[1][0]) / 2 - 0.05, 0.3, '1', fontsize=10)
    
    # グラフを表示する。
    plt.show()
    

    실행 결과



    좋은 웹페이지 즐겨찾기