ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 57일차 - 파이썬 머신러닝(3)
    카테고리 없음 2022. 12. 27. 17:52

    피처 스케일링과 정규화

    서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 피처 스케일링이라고 한다.

    대표적인 방법으로 표준화와 정규화가 있다.

     

    표준화는 데이터의 피저 각각이 평균이 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미한다.

    일반적으로 정규화는 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념이다.

     

    그런데 사이킷런의 전처리에서 제공하는 Normalizer 모듈과 일반적인 정규화는 약간의 차이가 있다.

    사이킷런의 Normalizer 모듈은 선형대수에서의 정규화 개념이 적용됐으며, 개별 벡터의 크기를 맞추기 위해 변환하는 것을 의미한다.

    즉, 개별 벡터를 모든 피처 벡터의 크기로 나눠준다.

     

     

     

     

    StandardScaler

    StandardScaler는 앞에서 설명한 표준화를 쉽게 지원하기 위한 클래스이다.

    개별 피처를 평균이 0이고, 분산이 1인 값으로 변환해준다.

    이렇게 가우시안 정규 분포를 가질 수 있도록 데이터를 변환하는 것은 몇몇 알고리즘에서 매우 중요하다.

     

     

    특히 사이킷런에서 구현한 RBF 커널을 이용하는 서포트 벡터 머신이나 선형 회귀, 로지스틱 회귀는 데이터가 가우시안 분포를 가지고 있다고 가정하고 구현됐기 때문에 사전에 표준화를 적용하는 것은 예측 성능 향상에 중요한 요소가 될 수 있다.

     

    StandardScaler를 이용해 각 피처를 한번에 표준화해 변환하는 과정은 다음과 같다.

    이러한 피처들이 있다면 먼저 StandardScaler객체를 생성한 후에 fit()과 transform() 메서드에 변환 대상 피처 데이터 세트를 입력하고 호출하면 간단하게 변환된다.

    transform()을 호출할 때 스케일 변환된 데이터 세트가 넘파이의 ndarray이므로 이를 DataFrame으로 변환해 평균값과 분산 값을 다시 확인해 본다.

     

    모든 칼럼 값의 평균이 0에 아주 가까운 값으로, 그리고 분산은 1에 아주 가까운 값으로 변환됐음을 알 수 있다.

     

     

     

    MinMaxScaler

    MinMaxScaler는 데이터값을 0과 1 사이의 값으로 변환한다(음수 값이 있으면 -1에서 1값으로 변환한다).

    데이터의 분포가 가우시안 분포가 아닐 경우에 Min, Max Scale을 적용해 볼 수 있다.

    모든 피처에 0에서 1 사이의 값으로 변환되는 스케일링이 적용되었음을 알 수 있다.

     

     

    StandardScaler나 MinMaxScaler와 같은 Scaler 객체를 이용해 데이터의 스케일링 변환 시 fit(), transform(), fit_transform() 메서드를 이용한다.

    일반적으로 fit()은 데이터 변환을 위한 기준 정보 설정(예를 들어 데이터 세트의 최댓값/최솟값 설정 등)을 적용하며, transform()은 이렇게 설정된 정보를 이용해 데이터를 변환한다.

    그리고 fit_transform()은 fit()과 transform()을 한 번에 적용하는 기능을 수행한다.

     

    하지만 학습 데이터 세트와 테스트 데이터 세트에 이 fit()과 transform()을 적용할 때 주의가 필요하다.

    Scaler 객체를 이용해 학습 데이터 세트로 fit()과 transform()을 적용하면 테스트 데이터 세트로는 다시 fit()을 수행하지 않고 학습 데이터 세트로 fit()을 수행한 결과를 이용해 transform() 변환을 적용해야 한다는 것이다.

     

    즉 학습 데이터로 fit()이 적용된 스케일링 기준 정보를 그대로 테스트 데이터에 적용해야 한다.

    그렇지 않고 테스트 데이터로 다시 새로운 스케일링 기준 정보를 만들게 되면 학습 데이터와 테스트 데이터의 스케일링 기준 정보가 서로 달라지기 때문에 올바른 예측 결과를 도출하지 못할 수 있다.

     

     

    학습 데이터와 테스트 데이터의 fit(), transform(), fit_transform()을 이용해 스케일링 변환 시 유의할 점을 요약하면 다음과 같다.

    1. 가능하다면 전체 데이터의 스케일링 변환을 적용한 뒤 학습과 테스트 데이터로 분리한다.
    2. 1.이 여의치 않다면 테스트 데이터 변환 시에는 fit()이나 fit_transform()을 적용하지 않고 학습 데이터로 이미 fit()된 Scaler 객체를 이용해 transform()으로 변환한다.

    이 유의 사항은 아픙로 배울 사이킷런 기반의 PCA와 같은 차원 축소 변환이나 텍스트의 피처 벡터화 작업 시에도 동일하게 적용된다.

     

     

     

     

    평가

    머신러닝은 데이터 가공/변환, 모델 학습/예측, 그리고 평가의 프로세스로 구성된다.

    앞 장의 타이타닉 생존자 예제에서는 모델 예측 성능 평가를 위해 정확도를 이용하였다.

    머신러닝 모델은 여러 가지 방법으로 예측 성능을 평가할 수 있다.

     

    성능 평가 지표는 일반적으로 모델이 분류냐 회귀냐에 따라 여러 종류로 나뉜다.

    회귀의 경우 대부분 실제값과 예측값의 오차 평균값에 기반한다.

    분류의 평가방법도 일반적으로는 실제 결과 데이터와 예측 결과 데이터가 얼마나 정확하고 오류가 적게 발생하는가에 기반하지만, 단순히 이러한 정확도만 가지고 판단했다가는 잘못된 평가 결과에 빠질 수 있다.

     

    분류의 성능 평가 지표는 다음과 같다.

    • 정확도(Accuracy)
    • 오차행렬(Confusion Matrix)
    • 정밀도(Precision)
    • 재현율(Recall)
    • F1 스코어
    • ROC AUC

    분류는 결정 클래스 값 종류의 유형에 따라 긍정/부정과 같은 2개의 결괏값만을 가지는 이진 분류와 여러 개의 결정 클래스 값을 가지는 멀티 분류로 나뉠 수 있다.

     

     

    정확도

    정확도는 실제 데이터에서 예측 데이터가 얼마나 같은지를 판단하는 지표이다.

    정확도(Accuracy) = [ 예측 결과가 동일한 데이터 건수 ] / [ 전체 예측 데이터 건수 ]

    정확도는 직관적으로 모델 예측 성능을 나타내는 평가 지표이다.

    하지만 이진 분류의 경우 데이터의 구성에 따라 ML 모델의 성능을 왜곡할 수 있기 때문에 정확도 수치 하나만 가지고 성능을 평가하지 않는다.

     

    앞장의 타이타닉 예제의 경우, 탑승객이 남자인 경우보다 여자인 경우 생존 확률이 높았다.

    따라서 별다른 알고리즘의 적용 없이 무조건 성별이 여자인 경우 생존으로, 남자인 경우 사망으로 예측 결과를 예측해도 비슷한 수치가 나올 수 있다.

     

    정확도는 불균형한 레이블 값 분포에서 ML 모델의 성능을 판단할 경우, 적합한 평가 지표가 아니다.

     

    정확도 평가 지표는 불균형한 레이블 데이터 세트에서 성능 수치로 사용돼서는 안된다.

    정확도가 가지는 분류 평가 지표로서 이러한 한계점을 극복하기 위해 여러 가지 분류 지표와 함께 적용하여 ML 모델 성능을 평가해야 한다.

     

     

    오차행렬

    이진 분류에서 성능 지표로 잘 활용되는 오차행렬은 학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고 있는지도 함께 보여주는 지표이다.

    즉, 이진 분류의 예측 오류가 얼마인지와 더불어 어떤 유형의 예측 오류가 발생하고 있는지를 함께 나타내는 지표이다.

     

    오차 행렬은 다음과 같은 4분면 행렬에서 실제 레이블 클래스 값과 예측 레이블 클래스 값이 어떠한 유형을 가지고 매핑되는지를 나타낸다.

     

    4분면의 위, 아래를 실제 클래스 값 기준으로 Negative와 Positive로 분류하면 예측 클래스와 실제 클래스의 값 유형에 따라 결정되는 TN, FP, FN, TP 형태로 오차 행렬의 5분면을 채울 수 있다.

     

    TN, FP, FN, TP값을 다양하게 결합해 분류 모델 예측 성능의 오류가 어떠한 모습으로 발생하는지 알 수 있다.

     

      예측 클래스
    (Predicted Class)
    실제 클래스
    (Actual Class)
      Negative(0) Positive(1)
    Negative(0) TN
    (True Negative)
    FP
    (False Positive)
    Positive(1) FN
    (False Negative)
    TP
    (True Positive)

    오차 행렬의 사분면

    가정 : 이진 분류이므로 0 아니면 1이 값이다.

    • TN : 0을 예측했는데(N), 그것이 맞았다(T)
    • FP : 1을 예측했는데(P), 그것이 틀렸다(F)
    • FN : 0을 예측했는데(N), 그것이 틀렸다(F)
    • TP : 1을 예측했는데(P), 그것이 맞았다(T)

     

     

    사이킷런은 오차 행렬을 구하기 위해 confusion_matrix() API를 제공한다.

    출력되는 오차 행렬은 ndarray 형태이다.

     

    TN, FP, FN, TP 값은 Classfier 성능의 여러 면모를 판단할 수 있는 기반 정보를 제공한다.

    이 값을 조합해 Classifier의 성능을 측정할 수 있는 주요 지표인 정확도, 정밀도, 재현율 값을 알 수 있다.

    • 정확도 : (TN + TP) / (FP + TP + TN + FN)
    • 정밀도 : TP / (FP + TP)
    • 재현율 : TP / (FN + TP)

     

    정밀도와 재현율은 Positive 데이터 세트의 예측 성능에 좀 더 초점을 맞춘 평가 지표이다.

     

    정밀도는 예측을 Positive로 한 대상 중에 예측 실제 값이 Positive로 일치한 데이터의 비율을 뜻한다.

    공식의 분모인 FP + TP는 예측을 Positive로 한 모든 데이터 건수이며, 공식의 분자인 TP는 예측과 실제 값이 Positive로 일치한 데이터 건수이다.

    Positive 예측 성능을 더욱 정밀하게 측정하기 위한 평가 지표로 양성 예측도라고도 불린다.

     

     

    재현율은 실제 값이 Positive인 대상 중에 예측과 실제 값이 Positive로 일치한 데이터의 비율을 뜻한다.

    공식의 분모인 FN + TP는 실제 값이 Positive인 모든 데이터 건수이며, 공식의 분자인 TP는 예측과 실제 값이 Positive로 일치한 데이터 건수이다.

    민감도(Sensitivity) 또는 TPR(True Positive Rate)이라고도 불린다.

     

    재현율이 중요 지표인 경우는 실제 Positive 양성 데이터를 Negative로 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우이다.

     

    예를 들어 암 판단 모델은 재현율이 훨씬 중요하다.

    왜냐하면 실제 Positive인 암 환자를 양성이 아닌 음성으로 잘못 판단했을 경우 오류의 대가가 생명을 앗아갈 정도로 심각하고, 음성인 환자를 양성으로 잘못 판단했을 경우 다시 재검사를 하는 수준의 비용이 소모되기 때문이다.

    • 재현율이 더 중요한 지표인 경우는 Positive인 데이터 예측을 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우.
    • 정밀도가 더 중요한 지표인 경우는 Negative인 데이터 예측을 잘못 판단하게 되면 업무상 큰 영향이 발생하는 경우.

     

    재현율과 정밀도 모두 TP를 높이는 데 초점을 맞추지만, 재현율은 FN(실제 Positive, 예측 Negative)을 낮추는데, 정밀도는 FP를 낮추는데 초점을 맞춘다.

     

    이 같은 특성 때문에 재현율과 정밀도는 서로 보완적인 지표로 분류의 성능을 평가하는 데 적용된다.

     

     

     

    사이킷런은 정밀도 계산을 위해 precision_score()를, 재현율 계산을 위해 recall_score() API를 제공한다.

     

     

    정밀도/재현율 트레이드오프

    분류하려는 업무의 특성상 정밀도 또는 재현율이 특별이 강조돼야 할 경우 분류의 결정 임곗값을 조정해 정밀도 또는 재현율의 수치를 높일 수 있다.

    하지만 정밀도와 재현율은 상호 보완적인 평가 지표이기 때문에 어느 한 쪽을 강제로 높이면 다른 하나의 수치는 떨어지기 쉽다.

    이를 정밀도/재현율의 트레이드오프(Trade-off)라고 부른다.

     

     

    사이킷런의 분류 알고리즘은 예측 데이터가 특정 레이블에 속하는지를 계산하기 위해 먼저 개별 레이블별로 결정 확률을 구한다. 그리고 예측 확률이 큰 레이블값으로 예측하게 된다.

    가령 이진 분류 모델에서 특정 데이터가 0이 될 확률이 10%, 1이 될 확률이 90%로 예측됐다면 최종 예측은 더 큰 확률을 가진 90%확률을 가진 1로 예측한다.

    일반적으로 이진 분류에서는 이 임곗값을 0.5, 즉 50%로 정하고 이 기준값보다 확률이 크면 Positive, 작으면 Negative로 결정한다.

     

    사이킷런은 개별 데이터로 예측 확률을 반환하는 메서드인 predict_proba()를 제공한다.

    이 메서드는 학습이 완료된 사이킷런 Classifier 객체에서 호출이 가능하며 테스트 피처 데이터 세트를 파라미터로 입력해주면 테스트 피처 레코드의 개별 클래스 예측 확률을 반환한다.

    predict() 메서드와 유사하지만 단지 반환 결과가 예측 결과 클래스값이 아닌 예측 확률 결과이다.

     

     

    이진 분류에서 predict_proba()를 수행해 반환되는 ndarray는 첫 번째 칼럼이 클래스 값 0에 대한 예측 확률, 두 번째 칼럼이 클래스 값 1에 대한 예측 확률이다.

     

    predict() 메서드는 predict_proba() 메서드에 기반해 생성된 API이다.

    predict()는 predict_proba() 호출 결과로 반환된 배열에서 분류 결정 임계값보다 큰 값이 들어 있는 칼럼의 위치를 받아서 최종적으로 예측 클래스를 결정하는 API이다.

     

    사이킷런은 분류 결정 임계값을 조절해 정밀도와 재현율의 성능 수치를 상호 보완적으로 조정할 수 있다.

     

    분류 결정 임곗값은 Positive 예측값을 결정하는 화귤ㄹ의 기준이 된다.

    확률이 0.5가 아닌 0.4부터 Positive로 예측을 더 너그럽게 하지 때문에 임곗값 값을 낮출수록 True 값이 많아지게 된다.

     

    Positive 예측값이 많아지면 상대적으로 재현율 값이 높아진다.

    양성 예측을 많이 하다 보니 실제 양성을 음성으로 예측하는 횟수가 상대적으로 줄어들기 때문이다.

     

    precision_recall_curve() API는 정밀도와 재현율의 임곗값에 따른 값 변화를 곡선 형태의 그래프로 시각화하는 데 이용할 수 있다.

    정밀도는 점선으로, 재현율은 실선으로 표현되어 있다.

     

    임곗값이 낮을수록 많은 수의 양성 예측으로 인해 재현율 값이 극도로 높아지고 정밀도 값이 극도로 낮아진다. 또한 임곗값을 계속 증가시킬수록 재현율 값이 낮아지고 정밀도 값이 높아지는 반대의 양상이 된다.

     

     

    정밀도가 100%가 되는 방법은 확실한 기준이 되는 경우만 Positive로 예측하고, 나머지는 모두 Negative로 예측한다.

     

    재현율이 100%가 되는 방법은 모든 경우를 Positive로 예측하면 된다.

    재현율 = TP / (TP + FN) 이므로 전체 경우를 1000명을 다 Positive로 예측하는 것이다.

    이 중 실제 양성인 사람이 30명 정도라도 TN이 수치에 포함되지 않고 FN은 아예 0이므로 30 / (30+0)으로 100%가 된다.

     

    이처럼 정밀도와 재현율 성능 수치도 어느 한 쪽만 참조하면 극단적인 수치 조작이 가능하다.

    따라서 정밀도 또는 재현율 중 하나만 스코어가 좋고 다른 하나는 스코어가 나쁜 분류는 성능이 종지 않은 분류로 간주할 수 있다.

     

     

     

     

     

     

     

Designed by Tistory.