ROC 곡선(Receiver Operating Characteristic Curve)

ROC 곡선(Receiver Operation Characteristic Curve:  수신자 조작 특성 곡선)은 모든 분류 임계값(Classification Thresholds)에서 분류 모델의 성능을 보여주는 그래프입니다. 이 곡선은 두 매개변수를 갖습니다.

  • TPR(True Positive Rate): 참 양성 비율(= 재현율)
    => TPR = TP / (TP + FN)

  • FPR(False Positive Rate): 허위 양성 
    => FPR = FP / (FP + TN)

ROC 곡선은 다양한 분류 임계값의 TPR과 FPR을 나타냅니다. 분류 임계값을 낮추면 더 많은 데이터가 양성으로 분류되어 거짓 양성(FP)과 참 양성(TP) 모두 증가하게 됩니다. 아래의 그림은 일반적인 ROC 곡선을 나타냅니다.

ROC 곡선은 FP 비율에 대한 TP의 비율을 나타내는 곡선으로 FP 비율값이 낮으면서 TP 비율값은 높은 것이 더 좋은 정확도를 보이는 좋은 모델입니다. 이에 따라 곡선이 위로 볼록할 수록 더 좋은 모델입니다.

(참고 링크: 조대협의 블로그 - 분류모델(Classification)의 성능 평가)



AUC(Area Under the ROC Curve: ROC 곡선의 아래 영역)

AUC는 ROC 곡선의 아래 영역을 의미하며 예측이 얼마나 잘 평가되었는지 측정 할 때 사용합니다. 아래의 그림과 같이 ROC 곡선의 아래 영역이 AUC가 됩니다.


AUC를 통해 모델이 임의 양성 예제를 임의 음성 예제보다 더 높게 평가할 확률을 구할 수 있습니다. 에를 들어 다음 예에서는 로지스틱 회귀 예측의 오름차순으로 왼쪽에서 오른쪽으로 정렬되어 있습니다.


여기서 AUC는 임의의 양성(초록색) 예제가 임의의 음성(빨간색) 예제의 오른쪽에 배치되는 확률을 나타냅니다.


AUC는 두 가지 이유로 유용하게 사용 될 수 있습니다.

  • AUC는 척도 불변(Scale-Invariant): 절대값이 아닌, 예측이 얼마나 잘 평가되었는지는 측정

  • AUC는 분류 임계값 불변(Classification-Threshold-Invariant): 어떤 분류 임계값이 선택되었는지와 무관하게 모델의 에측 품질을 측정



분류 모델을 평가하는 방법으로 정확도(Accuracy) 외에도 정밀도와 재현율 이란 것이 있습니다. 이에 대한 이해를 도울 수 있는 좋은 자료를 아래의 링크로 첨부하겠습니다. 한 번 읽어 보시는 걸 추천드립니다!


링크: 조대협의 블로그 - 분류모델(Classification)의 성능 평가


이 포스트에서는 Machine Learning Crash Course에서 다루는 정밀도와 재현율에 관한 내용을 정리하도록 하겠습니다.



정밀도(Precision)

정밀도(Precision): 양성으로 식별된 사례 중 실제로 양성이었던 사례의 비율은 어느 정도인가요?


정밀도는 다음과 같이 정의 됩니다.(거짓 양성이 없을 경우 모델의 정밀도는 1.0)



그럼 이번에는 이전 포스트에서 다룬 예시를 통해 정밀도를 계산해 보도록 하겠습니다.


이 모델에서는 어떤 종양이 악성일 것이라고 평가했을 때, 이 평가가 정확할 확률이 50%입니다.



재현율(Recall)

재현율(Recall): 실제 양성 중 정확히 양성이라고 식별된 사례의 비율은 어느 정도인가요?


재현율은 다음과 같이 정의 됩니다.(거짓음성이 나오지 않는 모델의 재현율은 1.0)



위의 예시 이미지에서 종양 분류 모델의 재현율을 계산해면 다음과 같습니다.



이 모델에서는 모든 악성 종양 중 11%만 정확하게 식별됩니다.



정밀도 및 재현율의 줄다리기

모델이 좋은 모델인지 평가하는데 정밀도와 재현율을 모두 검사해야 합니다. 정밀도와 재현율은 서로 상충하는 관계에 있는 경우가 많아, 보통 정밀도가 향상되면 재현율이 감소하게 됩니다.


스팸 메일을 분류하는 예제를 통해 정밀도와 재현율이 줄다리기를 하는 모습을 알아보도록 하겠습니다.


로지스틱 회귀 모델로 출력된 결과를 특정 지점을 분류 임계값으로 정해 스팸 메일을 분류하도록 하겠습니다. 위의 예시를 토대로 나타나는 이진 분류 표는 다음과 같습니다.



이 분류 임계값에서 산출되는 정밀도와 재현율은 다음 같습니다.




여기서 정밀도는 정확하게 분류된 스팸으로 신고된 이메일의 비율 말하며, 재현율은 정확하게 분류된 실제 스팸 이메일의 비율을 나타냅니다.

분류 임계값을 증가 시킬 경우


분류 임계값을 위와 같이 좀 더 높게 설정해 보도록 하겠습니다. 이 경우 이진 분류 표와 산출되는 정밀도와 재현율은 다음과 같습니다.





분류 임계값을 증가 시켰을 경우, 허위 양성(FP)의 수는 감소하지만 허위 음성(FN)의 수는 증가하게 됩니다. 이로 인해 정밀도는 증가하는 반면 재현율은 감소합니다.


분류 임계값을 감소 시킬 경우

분류 임계값을 위와 같이 낮게 설정해 보도록 하겠습니다. 이 경우 이진 분류 표와 산출되는 정밀도와 재현율은 다음과 같습니다.





분류 임계값을 감소 시켰을 경우, 허위 양성(FP)의 수는 증가하지만 허위 음성(FN)의 수는 감소하게 됩니다. 이로 인해 정밀도는 감소하는 반면 재현율은 증가합니다.


이렇게 분류 임계값에 따라 정밀도와 재현율은 줄다리기를 하는 것을 알 수 있습니다.

정확성(Accuracy)

정확성은 분류 모델 평가를 위한 측정항목 중 하나 입니다. 정확성은 일반적으로 다음과 같이 정의합니다.



앞에서 다룬 이진 분류에서는 다음과 같이 양성과 음성을 기주으로 정확성을 표현 할 수도 있습니다.



클래스 불균형 데이터 세트(Class Imbalanced Data Set)

악성으로 분류된 종양(Positive Class) 또는 양성으로 분류된 종양(Negative Class)을 예로 들어 모델 100개의 정확성을 계산해 보겠습니다.




위의 정확성 계산에 따르면 91%라는 높은 정확성을 나타내는 것을 확인할 수 있습니다. 하지만 정말 이 모델이 좋은 모델일까요?


모델은 양성 종양 91개 중 90개를 양성으로 정확히 식별합니다. 하지만 악성 종양 9개 가운데 1개만 악성으로 식별합니다. 악성 종양 9개 중 8개가 미확진 상태로 남았다는 것은 정말 형편없는 예측 결과 입니다.


이와 같이 클래스 불균형 데이터 세트(Class Imbalanced Data Set)를 사용하면 양성 라벨 수와 음성 라벨 수가 상당히 다르므로 정확성만으로 모든 것을 평가 할 수 없습니다.

이번 포스트에서는 분류 작업에 로지스틱 회귀를 사용하는 방법과 분류 모델의 효과를 평가하는 방법에 대해서 알아보겠습니다.


로지스틱 회귀 모형에서 특정 이메일에 관해 스팸일 확률이 0.95가 반환 되었다면 이 이메일은 스팸일 가능성이 매우 높은 메일로 예측 할 수 있습니다. 이와 반대로 동일한 로지스틱 회귀 모형에서 예측 점수가 0.03인 이메일이라면 이 이메일은 스팸이 아닐 가능성이 높습니다.


그렇다면 만약 스팸이 확률이 0.6인 이메일은 어떻게 처리해야 할까요?


임계값(Threshold)

우리는 이렇게 애매한 값을 이분법으로 확실히 분류를 할 기준이 필요로 합니다. 이 기준을 바로 임계값(Threshold)라고 합니다. 로지스틱 회귀 값을 이진 카테고리에 매핑(Mapping)하려면 분류 임계값(Classification Threshold, 결정 임계값이라고도 함)을 정의해야 합니다.


임계값보다 높은 값은 '스팸'을 나타내고 임계값보다 낮은 값은 '스팸이 아님'을 나타냅니다. 분류 임계값은 항상 0.5여야 한다고 생각하기 쉽지만 임계값은 문제에 따라 달라지므로 값을 조정해야 합니다.



참(True)과 거짓(False), 양(Positive)과 음(Negative)

이솝 우화를 통해 발생할 수 있는 4가지 결과를 요약해 보도록 하겠습니다. 



위의 내용에서 다음과 같이 정의해 보겠습니다.

  • "늑대다"는 양성 클래스(Positive Class)라 하겠습니다.
  • "늑대가 없다"는 네거티브 클래스(Negative Class)라 하겠습니다.

'늑대 예측' 모델에서 발생할 수 있는 4가지 결과를 요약하면 다음과 같이 2X2 혼동행렬(Confusion Matrix)을 사용해 나타낼 수 있습니다. 


  • 참양성(True Positive)는 모델에서 Positive Class정확하게 평가하는 결과입니다. 마찬가지로 참음성(True Negative)은 모델에서 Negative Class정확하게 평가하는 결과입니다.
  • 거짓양성(False Positive)는 모델에서 Positive Class잘못 예측한 결과입니다. 거짓음성(False Negative)은 모델에서 Negative Class잘못 예측한 결과 입니다.


혼동행렬이란, 라벨과 모델의 분류 사이의 상관관계를 요약한 NxN 표입니다. 혼동행렬의 축 중 하나는 모델이 예측한 라벨이고, 다른 축은 실제 라벨입니다.


앞서 우리는 선형 회귀를 통해 주어진 데이터가 연속적인 값일 경우 하나의 선으로 회귀시키는 예측 모델을 만들었습니다. 그런데 만약 주어지는 데이터가 범주형이거나 특정 분류로 나눠지는 데이터일 경우 어떻게 해야 할까요?


예를 들어서 동전이 앞면이 나올지 뒷면이 나올지, 아니면 내일 비가 올지, 맑을지, 구름이 낄지 등과 같이 수량이 아닌 확률과 같은 범주형으로 데이터가 주어지는 경우 처럼 말이죠.


이때 사용하는 방법이 바로 로지스틱 회귀(Logistic Regression)입니다.


로지스틱 회귀(Logistic Regression)

로지스틱 회귀법은 주어진 데이터가 1, 2, ..., 100 처럼 연속적인 값이 아닌, 동전이 앞면이 나올 확률, 내일 비가 올 확률과 같이 특정 분류로 나누어 지거나, 확률적으로 나타나는 데이터를 하나의 선으로 회귀 시켜 예측 모델을 만드는 방법입니다.


어떤 강아지가 밤에 짖는 확률은 로지스틱 회귀 모델로 아래처럼 표현 할 수 있습니다.


p( bark | night ) = 밤에 강아지가 짖을 확률


우리는 로지스틱 회귀를 통해 반환된 확률을 두 가지 방법으로 사용할 수 있습니다.

  • 반환된 확률을 있는 그대로 사용
    => p( bark | night ) = 0.05 라고 가정하겠습니다. 우리는 이 정보를 통해 1년에 강아지가 얼마나 짖는지를 로지스틱 회귀 값을 그대로 사용하여 알아 낼 수 있습니다. (p( bark | night ) * 365 = 0.05 * 365 = 18)

  • 반환된 확률을 이진 카테고리로 변환하여 사용
    => 내일 비가 온다/안 온다와 같이 Yes or No의 형태로 매핑(Mapping)하여 사용할 수 있습니다.

시그모이드 함수(Sigmoid Function)

로지스틱 회귀 모델 결과 값이 어떻게 항상 0 과 1 사이의 값으로 나타나는지 궁금할 수 있습니다. 이는 아래와 같이 정의된 시그모이드 함수로 인해 0과 1사이의 값을 출력해 냅니다.


  • y: 특정 예에 대한 로지스틱 회귀 모델의 출력

  • z: b + W1X1 + W2X2 + ... + WnXn    (b: 편향(Bias), w: 모델이 학습된 가중치(weight), x: 특정 값(Feature))

시그모디으 함수의 그래프는 다음과 같이 S자 모양으로 나타납니다. 실제로 많은 자연, 사회현상에서는 특정 변수에 대한 확률값이 선형으로 나타나지 않고, S자 커브 형태로 나타나는 경우가 많습니다.



로그 손실(Log Loss)

로그시틱 회귀 모델에서의 손실 함수는 로그 손실(Log Loss)로 다음과 같이 정의 됩니다.


  • (x,y) ∈ D: 라벨이 있는 예(x, y 쌍)가 많이 포함된 데이터 세트

  • y: 라벨이 있는 예의 라벨(로지스틱 회귀이므로 y 값은 모두 0 또는 1)

  • y': x의 특성 세트에 대한 예측 값(0 ~ 1 사이의 값)


앞의 포스트에서 우리는 L2 정규화를 통해 모델이 학습 데이터에 과적합 되는 것을 막는 방법을 배웠습니다. 그럼 우리는 어느정도 정규화를 해야 좋은 모델을 얻을 수 있을까요?


이번 포스트에서는 정규화 항에 람다(Lambda)라는 정규화율(Regularization Rate)을 곱하여 정규화의 정도를 조정하는 것에 대해서 알아보도록 하겠습니다.


람다(Lambda)

람다(Lambda)란 얼마나 정규화를 할지 조정하는 정규화율(Regularization Rate)입니다. 

만약 람다 값을 높인다면 정규화 효과가 강화되어 아래와 같이 정규 분포 모양의 그래프가 그려집니다.


람다 값이 높은 모델 가중치 분포 그래프를 보면, 가중치의 평균 값에 가장 많은 빈도가 발생하는 뚜렷한 정규 분포의 모양을 나타내는 것을 알 수 있습니다.


만약 람다 값을 낮춘다면 아래와 같이 좀 더 평평한 모델 가중치 분포 그래프가 그려집니다.



단순성(Simplicity)과 학습 데이터 적합성(Training-Data-Fit)의 균형

우리가 적절한 람다 값을 선택할 때 고려해야하는 것은 바로 단순성과 학습 데이터 적합성 사이에 적절한 균형을 맞추는 것입니다.

  • 람다 값이 너무 높은 경우: 모델은 단순해지지만 데이터가 과소적합해질 위험이 있음
    => 모델이 학습 데이터에 대해 충분히 학습하지 못할 수 있음

  • 람다 값이 너무 낮은 경우: 모델은 더 복잡해지고 데이터가 과적합해질 위험이 있음
    => 모델이 학습 데이터의 특수성을 너무 많이 학습하게 되어 새로운 데이터로 일반화하지 못함


이번 포스트에서는 우리가 학습시키는 모델이 주어진 데이터 세트에만 과적합 되는 것을 방지하기 위해 정규화를 하는 방법에 대해서 다뤄보도록 하겠습니다.


위의 그림은 반복 학습 횟수에 대해 학습 세트(Training Data)와 검증 세트(Validation Data)의 손실을 일반화된 곡선으로 보여줍니다.


이를 보면, 학습 손실은 점차 감소하지만 검증 손실은 어느 순간부터 증가하는 것을 나타냅니다. 즉, 이 일반화 곡선은 모델이 학습 세트에 과적합되어 있다는 것을 의미합니다.



정규화를 통한 과적합 줄이기

정규화란, 모델의 복잡도에 패널티를 줌으로써 과적합을 줄이는 것을 말합니다. 정규화 전략에는 크게 2가지가 있습니다.

  • 조기중단: 학습 데이터에 대해 손실이 특정 값에 수렴하기 전에 학습을 중단하는 방법
    => 위의 그림에서 검증 세트에 대한 손실율이 올라가는 지점, 즉 학습 데이터에 대해 손실율이 수렴하기 전에 학습을 중단하는 것입니다.

  • 모델 복잡도에 패널티를 부여: 학습하는 동안 모델에 패널티를 주어 학습 데이터에 과적합하지 않게 복잡성을 줄이는 방법

다음으로 모델 복잡도에 패널티를 부여하여 모델을 일반화하는 정규화 방법을 알아보도록 하겠습니다.


경험적 위험 최소화 -> 구조적 위험 최소화

우리는 이전까지 모델이 데이터에 대해 발생하는 손실을 최소화하는 것만을 목표로 삼았습니다. 이를 경험적 위험 최소화라고 합니다.


경험적 위험 최소화(Empirical Risk Minimization): minimize( Loss( Data | Model ) )


경험적 위험 최소화 방법은 학습 데이터에 대한 최소 손실을 알려주지만, 학습 데이터에만 과적합한 모델이 될 수 있습니다.]

이제부터 우리는 손실을 최소화하는 목표에 모델의 복잡도를 낮추어 좀 더 일반화된 모델을 만드는 목표를 추가하도록 하겠습니다. 이를 구조적 위험 최소화라고 합니다.


구조적 위험 최소화(Structural Risk Minimization): minimize( Loss( Data | Model ) + complexity( Model ) )


지금부터 우리의 학습 최적화 알고리즘은 모델이 데이터에 얼마나 적합한지 측정하는 손실 항(Loss Term)과 모델 복잡도를 측정하는 정규화 항(Regularization Term)의 함수가 됩니다.


모델 복잡도를 정의하는 방법

본 머신러닝 스터디 과정에서는 일반적으로 사용되는 2가지 방법으로 모델 복잡도를 표현할 것 입니다.

  • 모든 특성(Feature)의 가중치(Weight)에 대한 함수
    => 가중치의 절대값이 낮은 것을 더 선호(높은 절대값을 사용하는 특성 가중치는 낮은 절대값을 사용하는 특성 가중치보다 더 복잡함)

  • 0이 아닌 가중치를 사용하는 특성(Feature)의 총 개수에 대한 함수
    (차후 포스트에서 이 접근 방식을 다룸)

이번 포스트에서는 정규화 방법 중 L2 정규화(L2 Regularization)공식에 대해서 알아보도록 하겠습니다. 



L2 정규화(L2 Regularization)

L2 정규화란, 가중치의 제곱의 합에 비례하여 가중치에 패널티를 주는 정규화 방법입니다. 즉, 가중치가 클수록 큰 패널티를 부과하여 과적합을 억제하는 것 입니다.

L2 정규화 공식을 통해 복잡도를 수치화할 수 있습니다.



이 공식에서 0에 가까운 가중치는 모델 복잡도에 거의 영향을 미치지 않는 반면, 어떤 값이 비이상적으로 크다면 큰 영향을 미칠 수 있습니다.


L2 정규화를 통해 가중치들은 전체적으로 고르고 작은 값을 선호하게 됩니다. 만약 튀는 값(이상점)이 있거나 전체적으로 가중치의 크기가 커지면 정규화 손실(R(w))값이 커집니다.

https://de-novo.org/tag/regularization/


L2 정규화가 모델에 끼치는 영향

  • 가중치 값을 0으로 유도(정확히 0은 아님)
  • 정규 분포(종 모양)를 사용하여 가중치 평균을 0으로 유도


ML 엔지니어에게는 유저로 부터 수집된 여러 데이터들이 주어집니다. 이러한 데이터들 중에는 유저의 실수 혹은 서버의 오류와 같은 문제들로 인해 나쁜 데이터가 있을 수 있습니다. ML 엔지니어들은 일반적인 데이터의 상황과 다른 나쁜 데이터를 찾아 정제하는 과정을 수행하여야 합니다.


이번 포스트에서는 나쁜 데이터를 정제하는 방법에 대해서 다뤄보도록 하겠습니다.


특성 값 조정(Scaling feature values)

조정(Scaling)이란, 수집된 특성 값을 0~1 또는 -1~+1의 표준 범위로 변화하는 것을 말합니다. 만약 특성이 하나인 데이터 세트에서는 조정(Scaling)하는 과정이 불필요하겠지만, 데이터 세트가 여러 특성으로 구성되어 있다면 특성 조정(Feature Scaling)을 통해 다음과 같은 이점을 누릴 수 있습니다.


  • 더 빠르게 경사하강법이 수렴함
  • 'NaN(Not a Number) 트랩'이 방지됨
  • 모델이 특성의 적절한 가중치를 익히는데 도움이 됨
     

모든 특성을 동일한 범위로 할 필요는 없습니다. 예를 들어 특성 A는 -1~+1, 특성 B는 -3~+3으로 조정해도 큰 문제는 없습니다. 하지만 특성 B만 -1000~+1000과 같이 너무 큰 차이가 나게 설정을 하면 모델이 적절한 가중치를 찾지 어려울 것입니다.


극단적 이상점 처리(Handling extreme outliers)

우리에게 주어지는 데이터 중에 비이상적으로 튀는 값이 있을 수 있습니다. 아래의 예시는 1인당 몇 개의 방을 가지고 있는지를 나타내는 그래프입니다.

위의 그림을 보면, 1인당 평균 방의 개수가 50개인 유독 튀는 한 점을 볼 수 있습니다. 이러한 데이터는 데이터 수집 단계에서 유저 혹은 서버의 문제로 인해 발생한 이상점입니다.


이러한 극단적 이상점이 주는 영향을 최소화하는 방법은 두 가지가 있습니다.

  • 모든 값에 로그를 취해(Logarithmic scaling) 값의 범주를 줄임
  • 특정 값에서 잘라(Clipping), 이를 넘어서는 값은 잘라낸 값으로 인식함

왼쪽의 그림은 모든 값에 로그를 취해 전체 값의 범주를 줄인 모습입니다. 오른쪽 그림은 원래의 데이터 중 4가 넘는 값을 잘라내어 모두 4로 인식시킨 모습입니다.


비닝(Binning)

한국의 위도에 따른 상대적인 주택 분포를 나타내는 데이터가 아래의 그림과 같이 주어졌다고 생각해 보겠습니다.

주어진 데이터에서 위도(Latitude)는 부동 소수점 값입니다. 하지만, 이 모델에서 위도는 주택 수와의 선형적인 관계가 없기 때문에(위도를 나타내는 숫자와 주택 수는 아무런 관계가 없음으로), 위도를 부동 소수점 특성(floating-point value)으로 표현할 수 없습니다.


예를 들어, 위도 35도에 위치한 주택이 위도 34도에 위치한 주택보다 35/34 만큼 싸거나 비싸지는 않습니다. 그러나 각각의 위도 값은 주택 가격을 예측하는 좋은 지표가 될 수 있습니다.


위도를 부동 소수점 값이 아닌, 하나의 지표로 이용하기 위해서 여러 '빈(Bin)'으로 나누겠습니다.

Binning 이란, 연속적인 하나의 특성을 Bin이라고 하는 그룹의 특성으로 변환하는 작업.(연속적인 값을 일정한 크기의 범주로 나누는 것)


위의 그림은 위도를 11개의 빈(Bin)으로 나눈 것(LatitudeBin1, LatitudeBin2, ..., LatitudeBin11) 입니다. 이렇게 하면 위도 32.6도를 다음과 같이 원-핫 벡터로 표현 할 수 있습니다.

[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]


이렇게 비닝(Binning)을 이용하면 모델에서 각 위도에 따라 완전히 다른 가중치를 학습시킬 수 있습니다.


스크러빙(Scrubbing)

ML을 진행하면서 우리에게 다루는 데이터로 100% 신뢰할 수 있는 데이터만 주어지지는 않을 것 입니다. 아마 다음과 같은 문제를 갖고 있는 데이터 세트를 주로 접하게 될 것입니다.

  • 값 누락(Omitted Value): 유저가 실수로 연령 정보를 입력하지 않았을 수도 있습니다.
  • 중복 예(Duplicate Examples): 서버에서 같은 정보를 실수로 두 번 업로드 했을 수도 있습니다.
  • 잘못 된 라벨(Bad Labels): 사용자가 고양이 사진에 실수로 강아지 라벨을 지정했을 수도 있습니다.
  • 잘못된 특성 값(Bad Feature Values): 사용자가 숫자를 실수로 입력했을 수도 있습니다.
일반적으로 위와 같은 잘 못된 예를 발견하면 데이터를 삭제하는 데이터 세트 수정과정을 거침니다. 값 누락과, 중복 예 같은 경우 간단한 프로그램을 통해 탐지 하기 용이하지만, 잘못 된 라벨, 잘못 된 특성 값을 탐지하기는 매우 까다롭습니다.

철저한 데이터 파악

철저한 데이터를 파악을 위해 다음의 규칙을 항상 상기하여야 합니다.

  • 정상적인 데이터가 어떠한 모습이어야 하는지 항상 생각하자
  • 데이터가 예상과 일치하는지 확인하고, 그렇지 않다면 그 이유를 파악하자
  • 학습 데이터가 대시보드 등의 다른 소스와 일치하는지 확인하자


우리는 앞의 포스트를 통해 수집된 원시 데이터(Raw Data)를 적정한 특성 벡터(Feature Vector)로 맵핑(Mapping)하는 방법을 알아보았습니다.

이번 포스트에서는 이렇게 맵핑한 특성 벡터에서 어떤 값이 좋은 특성(Feature)가 되는지 알아보겠습니다.


좋은 특성의 조건

1. 거의 사용되지 않는 불연속 특성 값 배제

좋은 특성은 데이터 세트에서 최소 5회 이상 나타나야 합니다. 동일한 값을 갖는 예가 많으면 모델에서 다양한 설정으로 특성을 확인하여 라벨과 특성의 관계를 학습하기 용이합니다.


반대로 특성의 값이 한 번만 나타나거나 매우 드물게 나타난다면 모델에서 해당 특성을 기반으로 좋은 예측을 할 수 없습니다.


2. 최대한 분병하고 명확한 의미 부여

머신러닝 프로젝트에 참가하는 모든 구성원에서 각 특성은 바로 알 수 있도록 분명하고 명확한 의미를 가져야 합니다. 예를 들어 아래 처럼 주택의 연령을 연 단위로 나타내는 것인데 이는 바로 알아볼 수 있는 좋은 특성입니다.

반대로 아래와 같이 특정 사람 이외의 알아보기 힘든 특성 값은 좋은 특성이 아닙니다.


3. '특수' 값을 실제 데이터와 혼용하지 말 것

좋은 부동 소수점 특성(Floating-Point Features)은 특정 범위 외 불연속성 또는 '특수(Magic)' 값을 포함하지 않습니다. 예를 들어 어떤 특성이 0~1 사이의 부동 소수점을 특성 값으로 갖는다고 가정하겠습니다.


이때 이 특성 값이 0~1 사이가 아닌 -1과 같은 값을 갖는다면 이는 특수 값으로서 모델 학습에서 배제해야하는 값 입니다.


4. 업스트림(Upstream) 불안정성 고려

특성의 정의는 시간이 지나도 변하지 않아야 합니다. 하지만 다른 모델에서 추론한 값을 수집하는 경우 문제가 발생할 수 있습니다.


예를 들어, 포항을 나타내는 도시 번호를 255라는 값으로 맵핑하였다고 하겠습니다. 이 값은 다른 모델에서 실행할 때 표현이 변결 될 수 있습니다. 이러한 업스트림 불안정성을 고려하여 좋은 특성을 만들어야 합니다.

이번 포스트를 통해서 우리는 수집된 데이터를 어떻게 정제하여 머신러닝에게 학습시킬 지, 특성을 추출하는 방법에 대해서 이야기해 보겠습니다.


원시 데이터를 특성에 맵핑(Mapping Raw Data to Features)


위의 그림에서 왼쪽 부분은 수집된 데이터의 원본인 원시 데이터(Raw Data)입니다. 오른쪽은 실수 벡터로 표현된 특성 벡터(Feature Vector)입니다. 이렇게 원시 데이터로 부터 머신러닝에 적합한 데이터(모델을 학습 시킬 예)로 정제하는 것을 특성 추출(Feature Engineering)이라고 합니다.


보통 머신러닝 프로그래머는 특성을 추출하는데 전체 시간의 75% 정도를 할애합니다.


숫자 값 맵핑(Mapping numeric values)

머신러닝의 모델을 학습 시킬 때 부동 소수점 값을 이용하므로 원시 데이터가 정수 및 부동 소수점인 경우 따로 인코딩을 할 필요는 없습니다.

위의 그림과 같이 이미 실수인 num_rooms의 값을 오른쪽과 같이 6.0의 부동 소수점의 값으로 변환할 필요는 없습니다.


문자열 값 맵핑

머신러닝에서는 문자열 값은 학습할 수 없는 데이터입니다. 그래서 우리는 특성 추출(Feature Engineering)을 통해 필요한 문자열의 값을 숫자로 변환할 필요가 있습니다.



위와 같이 우리가 학습하고 싶은 문자열만 1로 설정하고 다른 문자열을 0으로 하는 원-핫 인코딩 방식으로 치환합니다.


원-핫 인코딩(One-Hot Encoding)이란?

일반적으로 문자열을 표현할 때 사용하는 방식으로, 하나의 요소만 1로 설정하고, 다른 요소들은 모두 0인 벡터를 말합니다.


범주형 값 매핑(Mapping categorical values)

범주형이란 배열로 표현되는 특성을 말하며, 인덱스와 같은 숫자로 치환하여 맵핑 합니다. 아래와 같은 나라 이름이 주어졌다고 하겠습니다.

주어진 나라를 나타내는 숫자로 치환하여 사용할 수 있을 겁니다. 아래 처럼 말이죠.

  • Netherlands => 0
  • Belgium => 1
  • Luxembourg => 2

하지만, 머신러닝 모델에서는 일반적으로 각 특성을 별도의 Boolean 값으로 표현 합니다. 예를 들면, 위의 나라 이름이 아래 처럼 표현됩니다.

  • x1: Is Netherlands? (True or False)
  • x2: Is Belgium? (True or False)
  • x3: Is Luxembourg? (True or False)


+ Recent posts