ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pyspark feature engineering. Robust Scaler
    개발/AI 2020. 3. 31. 13:13

     

    #Pyspark #FeatureEngineering #RobustScaler

    Spark 3 버전에는 pyspark RobustScaler가 제공이된다. 하지만 spark 2버전에는 제공되지 않아 직접 구현을 해야한다.

     

    너무 간단한건지, 아무도 이렇게 까지해서 사용하지 않는지 모르겠지만 구글링을 해도 쉽게 찾을 수 없어 구현해봤다.

    RobustScaler의 equation은 다음과 같이 정말간단한데, 처음 구현했을때 왜인지 데이터가 spark 3.0에서 제공하는 robustScaler와 일치하지 않아 삽질을 엄청 했다.

    scalar 3.0에서 robustScaler을 standardScaler를 통해 구현을 해놨던데.. 왜그렇게 했는지는 의문?

     

    대표사진 삭제

    사진 설명을 입력하세요.

    우선 Robust Scaler는 quantile을 이용하여 scaling을 하는 scaler이다.

     

    Quantile이란? 한글로 분위수라고 하는데 자료의 순서에 다른 위치값을 나타낸다. 자료전체를 반으로 나누는건 2-quantile 및 Median이라고 호칭하고, 4개로 나누는건, 4-quantile 및 Quartile 이라고 한다. 10개로도 나누고 10-quantile 및 decile이라고도 부른다.

     

    보통의 Robust scaler는 자료를 Quartile로 나누어 스케일링을 하는데, 3 quartile 에서 1 quartile 을 제거한 IQR ( Interquantile Range ) 로 스케일링을 하는 스케일러이다.

     

    Robust scaler의 equation은 다음과 같다

    $\combi{X}^'=\frac{\combi{X}_i\ -Median}{IQR}$X=Xi MedianIQR

     

    Pyspark로 구현한 robustScaler는 다음과 같다.

    pyspark의 robustScaler에서 전달 받는 인자중 두개의 flag가 있는데,

    witchCentering은 값을 median 값에 중앙을 맞추는 ( median값을 제거, removing median) 플래그로 기본값은 false이고,

    withScaling은 IQR값으로 스케일링을 하는지의 여부를 나타내는 플래그이다. 기본적으로 true이다.

     

    def robustScaler(df, withCentering, withScaling, col, newCol):
        quantiles = df.approxQuantile( col, [0.25, 0.75], 0.05 )
        median = df.approxQuantile( col, [0.5], 0.05 )
        IQR = quantiles[1] - quantiles[0]
    
        if withCentering:
            if withScaling:
                robustedDf = df.withColumn(newCol, (df[col] - median[0])/IQR)
            else:
                robustedDf = df.withColumn(newCol, df[col] - median[0])
        else:
            if withScaling:
                robustedDf = df.withColumn(newCol, df[col]/IQR)
            else:
                robustedDf = df.withColumn(newCol, df[col])
    
        return robustedDf

    '개발 > AI' 카테고리의 다른 글

    Product category classification  (0) 2020.01.09

    댓글

Designed by Tistory.