outlier(이상치, 아웃라이어) 제거하기

목차

    2017. 8. 22. 21:02

    군중-분리-사람
    아웃라이어

    이상치들은 특정 범위에서 너무 벗어나 있어 데이터 분석이나 모델링의 결과에 커다란 영향을 미칩니다. 그래서 outlier, 이상치를 제거하는 작업을 해야 하는데요. 눈으로 일일이 보고 제거할 수도 있겠지만, 변수의 수가 너무 많으면 이 또한 쉬운 일이 아닙니다. 아웃라이어를 제거하는 방법과 기준도 다양하고, 보정하는 방법에서 삭제하는 방법까지 처리하는 방법도 다양합니다. 파이썬 sklearn 패키지에서 제공하는 이상치 제거방법을 알아보았습니다.

     

     

    sklearn 패키지의 documenation에 가면, novelty and outlier detection 섹션에서 4가지의 방법을 설명하고 있습니다.

    novelty detection은 새로운 값이 들어왔을 때, 그 값이 기존의 분포에 적합한 값인지 아닌지를 구별해 내는 방법이고, outlier detection은 현재 가지고 있는 값들 중에서 이상치를 판별해는 방법이라고 합니다.

     

    다음은 그 4가지 방법에 대한 내용입니다.

     

    1. one class svm: 이 방법은 novelty의 방법으로 설명하고 있습니다.

    2. fitting an elliptic envelope: 분포를 미리 알고 있었을 때, 사용하는 방법이라고 합니다.

    3. Isolation Forest: 높은 차원의 dataset에 사용하는 것이 유용하고, Random Forest를 이용하는 방법이라고 합니다. random으로 칼럼을 선택한 후, 선택된 칼럼의 최대값과 최소값을 분리하는 값을 random으로 선택합니다.

    4. Local Outlier Factor: 높은 차원의 dataset에 유용한 또 다른 방법으로, Local Outlier Factor(LOF) 알고리즘을 사용하는 방법이라고 합니다. 주어진 데이터의 그 이웃들과 local density deviation을 구하고, 그들의 이웃보다 충분히 낮은 density를 갖는 샘플을 찾는 방법입니다. 군집화 알고리즘인 k-means와 유사하다고 합니다.

     

     

    자세한 내용은 sklearn documentation에 있으니 참고하시기 바랍니다. 내용이 영어로 되어 있어, 혹시 쉽게 설명해 주실 수 있는 분이 있다면 댓글을 남겨 주면 고맙겠습니다.

     

    Isolation Forest와 Local Outier Factor가 많은 경우에 대체로 우수하다고 하여, 여기서는 이 Isolation Foreset를 이용하여 Outlier detection을 해 보도록 하겠습니다.

     

    이 방법을 이용해서 outlier를 제거하는 코드를 작성하는 것은 어렵지 않았습니다.

     

    1. fit - 데이터를 학습시킵니다.

    2. predict - 학습한 정보를 이용해 outlier를 판별합니다.

     

     

    Isolation Forest 방법을 사용하기 위해, 변수로 선언해 줍니다.

    clf = IsolationForest(max_samples=1000, random_state=1)

     

    fit 함수를 이용하여, 데이터셋을 학습시킵니다. race_for_out은 dataframe의 이름입니다.

    clf.fit(race_for_out)

     

    다음으로 predict 함수를 이용하여, outlier를 판별해 줍니다. 0과 1로 이루어진 Series형태의 데이터가 나옵니다.

    y_pred_outliers = clf.predict(race_for_out)

     

    원래의 dataframe에 붙여서 사용하기 위해서, 데이터 형태를 dataframe으로 바꾸고 concat 명령어를 이용해서 붙여줍니다. 데이터가 0인 것이 outlier이기 때문에, 0인 것을 제거하면 outlier가 제거된  dataframe을 얻을 수 있습니다.

    out = pd.DataFrame(y_pred_outliers)
    out = out.rename(columns={0: "out"})
    race_an1 = pd.concat([race_for_out, out], 1)

     

    오늘은 이것으로 sklearn 패키지를 이용하여 이상치를 제거하는 방법에 대해서 알아보았습니다. 다음에는 python에서 descision tree를 만드는 방법을 알아보았습니다. 자세한 내용은 링크를 참조하시기 바랍니다.