머신러닝 성능 평가 지표와 k-폴드 교차 검증
정확도
정확도는 가장 일반적인 모델 성능 평가 지표입니다. 모델이 입력된 데이터에 대해 얼마나 정확하게 예측하는지를 나타냅니다. 혼동 행렬 상에서는 대각선(TP)을 전체 셀로 나눈 값에 해당합니다.
정확도 = 9 + 15 + 24 + 15 / 80 = 0.78 위 모델의 정확도는 0.78 임을 확인할 수 있습니다.
정밀도
정밀도는 모델의 예측값이 얼마나 정확하게 예측됐는가를 나타내는 지표입니다. 정밀도는 언제 정확도보다 더 자주 사용될까요? 가장 이해하기 쉬운 예로는 병원에서 암을 진찰하는 기계를 들 수 있습니다. 아래 표를 보겠습니다. 종으로 나열된 암환자, 일반 환자는 입력된 데이터의 실제값이고, 횡으로 나열된 암환자, 일반 환자는 예측값입니다.
암 예측 모델 A, B 중 어떤 모델이 더 나은 모델일까요? 정확도를 비교하면 A 모델이 69%, B 모델이 71%이므로 B 모델이 더 나은 암 예측 모델이라고 할 수 있을까요? 제가 만약 암 증상이 있어서 병원을 방문할 경우 저라면 암이라는 진단(예측)을 받았을 때 진단이 더 정확한 병원에 방문할 것입니다. 이처럼 예측값이 얼마나 정확한가를 나타내는 지표가 바로 정밀도입니다.
정밀도 = TP / (TP + FP)
모델 A의 암환자 정밀도는 9/39 = 23%, 모델 B의 암환자 정밀도는 1 / 21 = 4.7%이므로 암 환자 정밀도를 기준으로 더 나은 모델은 모델 A입니다.
재현율
재현율(Recall)은 실제값 중에서 모델이 검출한 실제값의 비율을 나타내는 지표입니다.
재현율 = TP / (TP + FN)
다시 암환자를 예측하는 모델 A, B를 비교해 보겠습니다. 실제 암환자들이 병원에 갔을 때 암환자라고 예측될 확률을 구하는 것이 바로 재현율이고, 암환자를 조기에 정확하게 발견해서 신속하게 처방하는 것이 병원 입장에서도 올바른 모델 선택 방법일 것입니다. 모델 A의 암환자 재현율은 9/10 = 90%, 모델 B의 암환자 재현율은 1 / 10 = 10%이므로 암 환자 재현율을 기준으로 더 나은 모델은 모델 A입니다.
F1 점수
정밀도도 중요하고 재현율도 중요한데 둘 중 무엇을 쓸지 고민될 수 있습니다. 이 두 값을 조화 평균 내서 하나의 수치로 나타낸 지표를 F1 점수라고 합니다.
조화 평균 = 2* a * b / (a + b)
아래 그림의 는 a와 b의 조화 평균의 절반에 해당하는 값입니다.
재현율과 정밀도의 조화 평균인 F1 점수를 수식화하면 아래와 같습니다.
F1 점수 = 2 * 재현율 * 정밀도 / (재현율 + 정밀도)
아래 그림과 같이 정밀도, 재현율의 값이 상이하게 차이나도 F1 점수는 두 값의 조화 평균값을 주므로 F1점수는 정확도와 함께 성능 평가에 많이 사용됩니다.
그렇다면 F1 점수는 어떤 상황에서 성능을 평가하는 데 많이 사용될까요? 테스트 데이터의 레이블이 균일하게 분포돼 있을 때는 주로 정확도를 사용합니다.
정확도 = (9 + 8 + 7 + 9) / 40 = 82.5%
하지만 데이터의 레이블이 불균일하게 분포돼 있을 경우 정확도는 왜곡된 성능 평가로 이어질 수 있습니다. 아래의 모델 1은 A 레이블만 잘 맞추고 B, C, D 레이블에 대해 하나도 예측을 제대로 하지 못했음에도 A 레이블을 가진 데이터가 너무 많아서 정확도가 96.6%로 나타나게 되어 성능 평가가 상당히 높아지는 문제를 잘 보여줍니다.
정확도 = (995 + 0 + O + 0) / 1030 = 96.6%
심지어 아래의 모델 2는 A에 대한 예측률은 떨어지지만 보편적으로 예측을 상당히 잘하는 모델임에도 정확도는 위의 모델보다 낮게 평가됩니다.
정확도 = (700 + 9 + 9 + 9) / 1030 = 70.5%
위와 같이 레이블이 데이터 상에서 불균일하게 분포된 경우 F1 점수를 사용하면 정확도보다 나은 성능 평가 비교가 가능합니다.
아래의 모델 1의 F1 점수는 0.246으로 계산됩니다.
평균 정밀도 = (0.98 + 0 + 0 + 0) / 4 = 0.245
평균 재현율 = (0.99 + 0 + 0 + 0) / 4 = 0.2475
F1 점수 = 2 * 0.245 * 0.2475 / (0.245 + 0.2475)
= 0.121275 / 0.4925
= 0.246
아래의 모델 2의 F1 점수는 0.454로 계산됩니다.
평균 정밀도 = (1 + 0.08 + 0.08 + 0.08) / 4 = 0.31
평균 재현율 = (0.7 + 0.9 + 0.9 + 0.9) / 4 = 0.85
F1 점수 = 2 * 0.31 * 0.85 / (0.31 + 0.85)
= 0.527 / 1.16
= 0.454
모델 2가 F1 점수를 기준으로 성능 평가 시 더 나은 점수를 얻는 것을 확인할 수 있습니다. 이처럼 테스트에 사용되는 데이터가 불행하게도 레이블이 불균일하게 분포된 경우 F1 점수는 한쪽 레이블에 치우치지 않는 레이블의 전체적인 성능에 대해 올바르게 평가하는 것을 확인할 수 있습니다.
k-폴드 교차 검증
머신러닝 모델을 테스트하기 전에 검증 단계를 통해 대략적인 모델의 성능을 짐작해볼 수 있습니다. 보편적으로 하나의 데이터셋이 있을 경우 전체 데이터셋의 20%를 테스트 데이터로 활용하고, 나머지 데이터의 90%를 학습 데이터로, 그리고 10%를 검증 데이터로 많이 사용하며, 이 방법은 현재도 많이 쓰이고 있습니다. 하지만 데이터가 충분하지 않을 경우 10%의 데이터를 검증 데이터로 나누기도 아깝고, 또한 나눈다 할지라도 검증 정확도를 신뢰하기에는 너무 한쪽에 편중된 데이터라는 단점이 있습니다.
이러한 문제를 극복하고자 고안된 검증 방법이 바로 k-폴드 교차 검증입니다. 테스트 데이터를 나눈 후의 데이터를 학습 데이터라고 한다면 학습 데이터의 일정 부분을 검증 데이터로 쓰되, n번의 검증 과정을 통해 학습 데이터의 모든 데이터를 한 번씩 검증 데이터로 사용해서 n개의 검증 결과를 평균 낸 값을 검증 성능 평가 지표로 사용하는 방식입니다. 교차 검증의 장점은 첫 번째로 검증 결과가 일정 데이터에 치우치지 않고 모든 데이터에 대한 결과이므로 신빙성이 높고, 두 번째로 따로 검증 데이터를 분리하지 않아도 된다는 점입니다. 아래는 k를 10으로 설정한 k-폴드 교차검증의 예입니다.
위 그림에서처럼 k-폴드 교차 검증은 모든 학습 데이터를 한 번씩 검증 데이터를 한 번씩 검증 데이터로 활용해 검증 데이터가 한쪽 데이터에 편향돼 있지 않아 따로 검증 데이터를 분리하지 않고도 학습 데이터에 대한 전반적인 검증 정확도를 구할 수 있습니다.