실습 · 연습문제 2개
비용을 최소화하는 threshold 고르기 min-cost-threshold
분류기가 샘플마다 양성 점수 를 낸다. threshold 를 정하면 인 샘플을 양성으로 판정한다. 양성을 놓치는 비용(false negative)을 , 음성을 양성으로 잘못 판정하는 비용(false positive)을 라 하면 총비용은
이다. 함수 best_threshold(y, p, c_fn, c_fp)를 완성해 총비용이 가장 작은 (t, cost)를 반환한다.
- 후보 threshold는
p에 나오는 서로 다른 값들과np.inf(아무것도 양성으로 판정하지 않음)다. 이 후보들만 보면 충분하다. 그 사이의 는 이 중 하나와 같은 판정을 내기 때문이다. - 총비용이 같은 후보가 여럿이면 가장 작은 를 고른다.
cost는 위 식의 총비용(평균이 아니라 합)이다.
테스트는 손으로 계산할 수 있는 작은 예, 모든 후보를 직접 평가한 결과와의 비교, 그리고 보정된(calibrated) 확률에서 고른 threshold가 이론값 근처인지를 확인한다.
힌트: np.unique(p)로 후보를 정렬된 순서로 얻고, 후보마다 비용을 계산해 np.argmin을 쓰면 된다(첫 번째 최솟값을 고른다). 샘플이 수천 개면 후보도 수천 개이므로, 양성·음성 점수를 각각 정렬해 두고 np.searchsorted로 "보다 작은 점수의 개수"를 한 번에 세면 빠르다.
ridge 회귀의 nested CV nested-cv-ridge
ridge 회귀의 정규화 강도 를 교차검증으로 고르면, 고른 의 CV 오차는 "후보 중 가장 운 좋은 값"이라 실제 성능보다 낙관적이다. nested CV는 선택을 바깥 fold의 학습 부분 안에서만 하고, 바깥 시험 fold는 평가에만 쓴다. 세 함수를 완성한다.
ridge_fit(X, y, lam): 절편 없는 ridge 회귀의 계수 , shape(D,).cv_mse(X, y, lam, k): -fold CV의 평균 제곱오차. fold 배정은np.arange(N) % k로 고정한다(샘플 는 fold ). fold마다 나머지로 학습하고 그 fold에서 MSE를 구한 뒤, fold별 MSE를 단순 평균한다.nested_cv_mse(X, y, lambdas, k_outer=5, k_inner=5): 반환값은(estimate, chosen).- 바깥 fold 배정은
np.arange(N) % k_outer. - 바깥 fold 마다 학습 부분
X[outer != f]에서cv_mse(..., k_inner)로lambdas를 비교해 최솟값의 를 고른다(동점이면 앞의 것). 학습 부분 전체로 다시 학습해 바깥 시험 fold에서 MSE를 잰다. estimate는 바깥 fold MSE들의 평균,chosen은 바깥 fold마다 고른 의 리스트다.
- 바깥 fold 배정은
데이터는 이미 중심화되어 있다고 가정하므로 절편은 쓰지 않는다. 테스트는 계산이 정의와 맞는지, 바깥 시험 fold가 선택에 쓰이지 않았는지, 그리고 신호가 없는 데이터에서 단순 CV의 최솟값이 nested 추정보다 평균적으로 낙관적인지를 확인한다.