이진 분류기의 특징을 시각화하는 것 외에도 ROC 곡선은 실전 상황에서 확률 임계값을 합리적으로 선택하도록 도와줍니다. 예를 들어 피싱 감지기를 서비스로 개발하는 회사라고 생각해 보죠. 다음 중 어떤 것이 필요할까요?
• 진짜 피싱 웹 사이트를 놓치면 책임이 따르거나 계약을 놓쳐 손실이 생기기 때문에 임계값을 상대적으로 낮춥니다.
• 모델이 피싱으로 분류하여 일반적인 웹 사이트가 막히게 된 사용자의 불만을 피하기 위해 임계값을 상대적으로 높입니다.
각 임계값은 ROC 곡선 위의 한 점에 해당합니다. 임계값을 0에서 1로 점진적으로 증가시키면 그래프의 오른쪽 위 모서리(FPR과 TPR이 모두 1인 지점)에서 왼쪽 아래 모서리(FPR과 TPR이 모두 0인 지점)로 이동하게 됩니다. 실제 엔지니어링 문제에서 ROC 곡선의 어떤 지점을 선택할지 결정하는 것은 항상 이런 종류의 실제 비용에 대한 가중치에 기반을 둡니다. 그리고 고객과 비즈니스 개발 단계에 따라 달라질 수 있습니다.
ROC 곡선 외에 이진 분류 시각화에 자주 사용되는 것으로 정밀도-재현율 곡선(precision-recall curve)도 있습니다(P/R 곡선이라고도 부르며 3.3절에서 간략히 언급했습니다). ROC 곡선과 달리 정밀도-재현율 곡선은 재현율에 대한 정밀도 곡선입니다. 정밀도-재현율 곡선이 개념적으로 ROC 곡선과 비슷하기 때문에 여기서는 자세히 다루지 않겠습니다.27
코드 3-7에서 눈여겨볼 것은 tf.tidy() 함수입니다. 이 함수는 매개변수로 전달된 익명 함수 안에서 만들어진 텐서를 적절하게 삭제하기 때문에 WebGL 메모리를 계속 점유하지 않습니다. 자바스크립트에서 객체 소멸을 위한 메서드가 없고 TensorFlow.js 텐서가 의존하는 WebGL 텍스처(texture)를 위한 가비지 컬렉션(garbage collection)이 부족하기 때문에 브라우저에서 TensorFlow.js는 사용자가 생성한 텐서의 메모리를 관리할 수 없습니다. 중간에 생성한 텐서를 적절하게 정리하지 않으면 WebGL 메모리 누수가 발생하게 됩니다. 이런 메모리 누수가 오래 지속되면 WebGL 메모리 부족 에러가 발생합니다. 부록 C의 3절에는 TensorFlow.js에서 메모리 관리에 대한 자세한 튜토리얼이 담겨 있습니다. 부록 C에는 이 주제에 대한 연습 문제도 있습니다. TensorFlow.js 사용자 정의 함수를 작성한다면 이 절을 주의 깊게 공부해야 합니다.