Precision-Recall 트레이드오프
분류 작업을 할 때 Precision-Recall 트레이드오프라는 용어를 자주 보게 돼요. 이 말은 어디에서 온 걸까요?
보통은 확률이 가장 높은 클래스로 문서를 할당합니다. 그런데 최댓값이 0.1이라면 어떨까요? 해당 문서가 어떤 클래스에 속할 확률이 10%에 불과한데, 그래도 그 클래스로 간주해야 할까요?
정답은 문제에 따라 달라집니다. 분류를 받아들이기 위한 최소 임계값을 두는 방식이 가능하고, 임계값을 조정하면 precision과 recall 값이 서로 반대 방향으로 움직여요.
변수 y_true와 모델 model은 로드되어 있습니다. 또한, 확률이 임계값보다 낮으면 문서는 DEFAULT_CLASS(클래스 2로 지정)에 할당돼요.
이 연습은 강의의 일부입니다
Keras로 배우는 언어 모델링을 위한 순환 신경망(RNN)
연습 안내
.predict()메서드를 사용해 각 클래스의 확률을 구하고pred_probabilities변수에 저장하세요.- 최댓 확률이
0.5이상일 때만 받아들이고, 그 결과를y_pred_50변수에 저장하세요. - 임계값을
0.8로 했을 때도 동일하게 처리하도록np.argmax()와np.max()함수를 사용하세요. - 모든 지표가 담긴
trade_off변수를 출력하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
# Get probabilities for each class
pred_probabilities = model.____(X_test)
# Thresholds at 0.5 and 0.8
y_pred_50 = [np.argmax(x) if np.max(x) >= ____ else DEFAULT_CLASS for x in pred_probabilities]
y_pred_80 = [np.____(x) if np.____(x) >= 0.8 else DEFAULT_CLASS for x in pred_probabilities]
trade_off = pd.DataFrame({
'Precision_50': precision_score(y_true, y_pred_50, average=None),
'Precision_80': precision_score(y_true, y_pred_80, average=None),
'Recall_50': recall_score(y_true, y_pred_50, average=None),
'Recall_80': recall_score(y_true, y_pred_80, average=None)},
index=['Class 1', 'Class 2', 'Class 3'])
____