자동 부트스트랩 방법을 사용하여 기계 학습에서 성능 메트릭에 대한 신뢰 구간을 계산하는 방법

소스 노드 : 1178501

자동 부트스트랩 방법을 사용하여 기계 학습에서 성능 메트릭에 대한 신뢰 구간을 계산하는 방법

"큰" 테스트 세트로 인해 모델 성능 측정이 매우 정확합니까, 아니면 "작거나" 불균형한 테스트 세트로 인해 매우 불확실합니까?


By 데이비드 B 로젠(박사), IBM Global Financing의 자동 신용 승인을 위한 수석 데이터 과학자



주황색 선은 균형 정확도 신뢰 구간의 하한으로 89.7%, 원래 관찰된 균형 정확도=92.4%(점 추정치)에 대한 녹색, 상한 94.7%에 대한 빨간색을 나타냅니다. (별도의 언급이 없는 한 이 이미지와 모든 이미지는 저자의 것입니다.)

개요

 
 
분류기의 성능이 테스트 세트에서 Accuracy=94.8% 및 F1=92.3%인 것으로 보고하는 경우 테스트 세트의 크기와 구성에 대한 정보가 없으면 큰 의미가 없습니다. 이러한 성능 측정의 오차 범위는 테스트 세트의 크기에 따라 많이 달라집니다. 소수 포함하는 클래스(오버샘플링에서 동일한 인스턴스의 더 많은 복사본은 이 목적에 도움이 되지 않음).

유사한 출처의 다른 독립 테스트 세트를 수집할 수 있는 경우 이 데이터 세트에 대한 모델의 정확도 및 F1은 동일하지 않을 수 있지만 그럴듯하게 얼마나 다를 수 있습니까? 이와 유사한 질문은 통계에서 다음과 같이 답변됩니다. 신뢰 구간 측정의.

기본 모집단에서 많은 독립적인 샘플 데이터 세트를 추출하는 경우 해당 데이터 세트의 95%에 대해 메트릭의 실제 기본 모집단 값은 해당 특정 샘플 데이터 세트에 대해 계산할 95% 신뢰 구간 내에 있습니다.

이 기사에서는 다음과 같은 부트스트랩 방법을 사용하여 머신 러닝 성능 메트릭 수에 대한 신뢰 구간을 한 번에 계산하는 방법을 보여줍니다. 자동적으로 기본적으로 생성할 부팅 샘플 데이터 세트 수를 결정합니다.

신뢰 구간을 계산하기 위해 이 코드를 호출하는 방법을 보려면 "섹션으로 건너뛰십시오.결과를 계산하십시오!아래로.

부트스트랩 방법론

 
 
데이터의 기본이 되는 실제 분포에서 추가 테스트 데이터 세트를 그릴 수 있다면 해당 데이터 세트에서 관심 있는 성능 지표의 분포를 볼 수 있을 것입니다. (이러한 데이터 세트를 그릴 때 우리는 동일하거나 유사한 인스턴스를 여러 번 그리는 것을 방지하기 위해 아무 조치도 취하지 않을 것입니다.

그렇게 할 수 없기 때문에 다음으로 가장 좋은 방법은 경험적 분포 즉, 새 부트스트랩 샘플 데이터 세트를 생성하기 위해 해당 인스턴스에서 샘플링과 교체를 의미합니다. 대체 샘플링은 특정 인스턴스를 그린 후 동일한 샘플 데이터 세트에 대해 다시 그릴 수 있도록 다시 넣습니다. 따라서 이러한 각 데이터 세트에는 일반적으로 일부 인스턴스의 여러 복사본이 있으며 기본 테스트 세트에 있는 모든 인스턴스를 포함하지는 않습니다.

샘플링을 했다면 없이 대체하면 매번 원본 데이터 세트의 동일한 복사본을 얻을 수 있으며 다른 무작위 순서로 섞일 수 있으므로 아무 소용이 없습니다.

XNUMXD덴탈의 백분위 수 신뢰 구간을 추정하기 위한 부트스트랩 방법론은 다음과 같습니다.

  1. 생성 nboots 각각 원본 테스트 세트와 동일한 크기의 "부트스트랩 샘플" 데이터 세트. 각 샘플 데이터 세트는 대체 테스트 세트에서 무작위로 인스턴스를 뽑아서 얻습니다.
  2. 각 샘플 데이터 세트에서 측정항목을 계산하고 저장합니다.
  3. 95% 신뢰 구간은 2.5로 제공됩니다.th 97.5에th 사이의 백분위 수 nboots 메트릭의 계산된 값입니다. 만약에 nboots=1001이고 시리즈/배열/목록의 값을 정렬했습니다. X 길이 1001, 0th 백분위수는 X[0]과 100th 백분위수는 X[1000]이므로 신뢰 구간은 다음과 같이 지정됩니다. X[25] X[975].

물론 2단계에서 각 샘플 데이터 세트에 대해 원하는 만큼 메트릭을 계산할 수 있지만 3단계에서는 각 메트릭에 대한 백분위수를 개별적으로 찾습니다.

데이터 세트 및 신뢰 구간 결과 예

 
 
이 이전 기사의 결과를 예로 사용합니다. 데이터 재조정 없이 불균형 분류를 처리하는 방법왜곡된 데이터의 오버샘플링을 고려하기 전에 분류 결정 임계값을 조정해 보십시오..

그 기사에서 우리는 고도로- 불균형한 XNUMX개 클래스 Kaggle 신용 카드 사기 식별 데이터 세트. 우리는 예측() 메서드를 사용할 때 내포된 기본 0.5 임계값과 상당히 다른 분류 임계값을 사용하기로 선택하여 데이터 균형을 유지할 필요가 없도록 했습니다. 이 접근 방식은 때때로 임계 값 이동, 여기서 분류기는 선택한 임계값을 예측에서 제공하는 예측 클래스 확률에 적용하여 클래스를 할당합니다._프로바() 방법.

이 문서(및 코드)의 범위를 이진 분류로 제한합니다. 클래스 0 및 1, 규칙에 따라 클래스 1은 "긍정적인" 클래스이고 특히 불균형 데이터에 대한 소수 클래스입니다. 코드는 회귀(단일 연속 대상)도 마찬가지입니다.

하나의 부트 샘플 데이터 세트 생성

 
 
신뢰 구간 코드는 메트릭 함수에 전달되는 다양한 수의 데이터 인수를 처리할 수 있지만 항상 두 개의 데이터 인수인 y_true 및 y_pred를 허용하는 sklearn 스타일 메트릭에 중점을 둘 것입니다. 여기서 y_pred는 이진 클래스 예측(0 또는 1) 또는 연속 클래스 확률 또는 결정 함수 예측 또는 y_true도 연속인 경우 연속 회귀 예측까지 가능합니다. 다음 함수는 단일 부팅 샘플 데이터 세트를 생성합니다. 모든 data_args를 허용하지만 우리의 경우 이러한 인수는 ytest(실제/진정한 테스트 세트 대상 값은 이전 기사) and hardpredtst_tuned_thresh (예상 클래스). 둘 다 각 인스턴스에 대한 참 또는 예측 클래스를 나타내는 XNUMX과 XNUMX을 포함합니다.

사용자 지정 지표 specificity_score() 및 유틸리티 함수

 
 
우리는 특이도에 대한 사용자 지정 메트릭 함수를 정의할 것입니다. 부정 클래스(클래스 0). 또한 데이터에 관심 있는 일련의 메트릭을 적용하는 calc_metrics 함수와 이를 위한 몇 가지 유틸리티 함수:

여기에서 메트릭 목록을 만들어 데이터에 적용합니다. 부정확성(진정한 사기를 합법적인 것으로 오분류)은 거짓양성(진정한 합법적인 것을 사기로 오분류)보다 비즈니스에 훨씬 더 많은 비용이 들기 때문에 정확도를 관련 지표로 고려하지 않았습니다. 반면 정확도는 두 유형의 오분류를 모두 처리합니다. 동등하게 나쁘고 따라서 실제 클래스가 다수 클래스인 클래스를 올바르게 분류하는 것을 선호합니다. 이러한 클래스는 훨씬 더 자주 발생하여 전체 정확도에 훨씬 더 기여하기 때문입니다.

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



각 부팅 샘플 데이터 세트 만들기 및 메트릭 계산

 
 
raw_metric_samples()에서 실제로 여러 샘플 데이터 세트를 하나씩 생성하고 각각의 메트릭을 저장합니다.

raw_metric_samples()에 실제 및 예측 클래스 데이터뿐만 아니라 관심 있는 메트릭(또는 하나의 메트릭) 목록을 제공하면 nboots 샘플 데이터 세트를 얻고 각 데이터 세트에서 계산된 메트릭 값만 있는 데이터 프레임을 반환합니다. _boot_generator()를 통해 모든 데이터 세트를 잠재적으로 한 번에 저장하는 대신 생성기 표현식에서 한 번에 하나씩 one_boot()를 호출합니다.거대한 명부.

7개의 부팅 샘플 데이터 세트에 대한 메트릭 보기

 
 
메트릭 함수 목록을 만들고 raw_metric_samples()를 호출하여 단 7개의 샘플 데이터 세트에 대한 결과를 얻습니다. 우리는 이해를 위해 여기에서 raw_metric_samples()를 호출하고 있습니다 — ci_auto()에 대한 메트릭 목록(또는 하나의 메트릭)을 지정하더라도 아래 ci_auto()를 사용하여 신뢰 구간을 얻기 위해 필요하지 않습니다. is 필요한.

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



위의 각 열에는 하나의 부트 샘플 데이터 세트(0에서 6까지 번호 지정)에서 계산된 메트릭이 포함되어 있으므로 계산된 메트릭 값은 무작위 샘플링으로 인해 달라집니다.

계산된 기본값이 있는 부팅 데이터 세트 수

 
 
우리의 구현에서 기본적으로 부트 데이터 세트의 수는 nboots 에 의해 권장 사항을 충족하도록 원하는 신뢰 수준(예: 95%)에서 자동으로 계산됩니다. 노스, 커티스, 샴 최소 부팅 수를 가지려면 배포의 각 테일이 발생합니다. (실제로 이 권장 사항은 p-가치 및 가설 테스트 수락 지역하지만, 신뢰 구간 이것을 경험 법칙으로 사용하기에 충분히 유사합니다.) 해당 저자는 꼬리에서 최소 10개의 부팅 결과를 권장하지만, 데이비슨 & 맥키넌 399% 신뢰도를 위해 최소 95개의 부츠를 권장합니다. 꼬리 부분에 11개의 부츠가 필요하므로 보다 보수적인 권장 사항을 사용합니다.

1 – 신뢰 수준인 알파를 지정합니다. 예를 들어 95% 신뢰도는 0.95가 되고 알파=0.05가 됩니다. 명시적인 부츠 수를 지정하는 경우(아마도 nboots 더 빠른 결과를 원하기 때문에) 요청한 알파에 충분하지 않으면 해당 부츠 수에 대한 정확한 신뢰 구간을 얻기 위해 더 높은 알파가 자동으로 선택됩니다. 최소 51개의 부츠가 사용됩니다. 그보다 작은 것은 기이할 정도로 작은 신뢰 수준(예: 40에서 간격을 제공하는 30% 신뢰 수준)만 정확하게 계산할 수 있기 때문입니다.th 70의 백분위 수th 간격 내부에 40%가 있고 외부에 60%가 있는 백분위수) 그리고 minimum-boots 권장 사항이 그러한 경우를 고려했는지조차 명확하지 않습니다.

get_alpha_nboots() 함수는 기본 nboots를 설정하거나 위의 요청된 alpha 및 nboots를 수정합니다.

다양한 알파 값에 대한 기본 nboots를 보여드리겠습니다.

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



명시적인 nboots를 요청하면 다음과 같은 일이 발생합니다.

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



작은 nboots 값은 알파를 0.05와 0.40으로 증가시켰고 nboots=2는 최소 51로 변경되었습니다.

균형 정확도에 대한 신뢰 구간만 보여주는 부트스트랩 샘플 데이터 세트의 히스토그램

 
 
다시 우리는 ci_auto()를 호출하여 아래의 신뢰 구간을 얻기 위해 이 작업을 수행할 필요가 없습니다.

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



주황색 선은 균형 정확도 신뢰 구간의 하한으로 89.7%, 원래 관찰된 균형 정확도=92.4%(점 추정치)에 대한 녹색, 상한 94.7%에 대한 빨간색을 나타냅니다. (이 기사 상단에 동일한 이미지가 나타납니다.)

메트릭 목록에 대한 모든 신뢰 구간을 계산하는 방법

 
 
다음은 위의 기능을 호출하고 지표 결과의 백분위수에서 신뢰 구간을 계산하고 점 추정치를 결과 출력 데이터 프레임의 첫 번째 열로 삽입하는 주요 기능입니다.

결과를 계산하십시오!

 
 
이것이 우리가 실제로 해야 할 전부입니다. 메트릭 목록과 함께 다음과 같이 ci_auto()를 호출합니다(met 위에 할당됨)을 사용하여 신뢰 구간을 얻습니다. 백분율 형식은 선택 사항입니다.

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



결과 신뢰 구간에 대한 논의

 
 
다음은 원래 기사. 클래스 0은 네거티브(다수 클래스)이고 클래스 1은 포지티브(매우 드문 클래스)입니다.



134/(134+14)의 재현율(진양성률)은 작은 카운트를 포함하는 이항 비율이기 때문에 신뢰 구간이 가장 넓습니다.

특이도(참음성률)는 80,388/(80,388+4,907)이며, 많은 카운트가 더 크므로 신뢰 구간이 [94.11% ~ 94.40%]로 매우 좁습니다.

Balanced Accuracy는 단순히 Recall과 Specificity의 평균으로 계산되므로 신뢰 구간의 너비는 중간입니다.

테스트 데이터의 변동과 열차 데이터의 변동으로 인한 메트릭 측정 부정확성

 
 
여기서는 변동성을 고려하지 않았다. 모델 우리의 무작위성을 기반으로 훈련 데이터(예를 들어 자동화된 반복 재교육이 있고 미래 모델의 성능이 얼마나 달라질 수 있는지 알고 싶은 경우와 같은 일부 목적에 관심이 있을 수 있음), 오히려 이 성능 측정의 가변성 특별한 우리의 임의성으로 인해 모델(일부 특정 교육 데이터에서 생성됨) test 데이터입니다.

독립적인 테스트 데이터가 충분하다면 기본 모집단에서 이 특정 모델의 성능을 매우 정확하게 측정할 수 있으며 모델을 구축한 방법과 우리가 할 수 있는지 여부에 관계없이 이 모델을 배포하면 성능이 어떻게 될지 알 수 있습니다. 다른 교육 샘플 데이터 세트로 더 좋거나 더 나쁜 모델을 얻습니다.

개별 인스턴스의 독립성

 
 
부트스트랩 방법은 각 인스턴스(사례, 관찰)가 기본 모집단과 독립적으로 그려지는 것으로 가정합니다. 테스트 세트에 서로 독립적이지 않은 행 그룹이 있는 경우(예: 서로 상관 관계가 있을 가능성이 있는 동일한 엔터티의 반복된 관찰 또는 테스트의 다른 인스턴스에서 과도하게 샘플링/복제/생성된 인스턴스) 결과가 유효하지 않을 수 있습니다. 다음을 사용해야 할 수도 있습니다. 그룹화 된 그룹을 해체하거나 그룹의 일부만 사용하는 것을 피하면서 개별 행이 아닌 전체 그룹을 무작위로 함께 그리는 샘플링.

또한 훈련 세트와 테스트 세트로 분할된 그룹이 없는지 확인해야 합니다. 테스트 세트가 반드시 독립적일 필요는 없고 감지되지 않은 과적합이 발생할 수 있기 때문입니다. 예를 들어 오버샘플링을 사용하는 경우 일반적으로 시간 내에 이전이 아니라 테스트 세트에서 분리되었습니다. 그리고 일반적으로 테스트 세트는 모델이 향후 배포 시 보게 될 인스턴스를 대표해야 하기 때문에 테스트 세트가 아닌 훈련 세트를 오버샘플링합니다. 교차 검증을 위해 scikit-learn의 model_selection.GroupKFold().

결론

 
 
항상 평가 메트릭에 대한 신뢰 구간을 계산하여 테스트 데이터를 통해 모델의 성능을 얼마나 정확하게 측정할 수 있는지 확인할 수 있습니다. 저는 확률 예측(또는 신뢰도 점수 — 통계적 신뢰도와 관련 없음)을 평가하는 메트릭, 즉 로그 손실 또는 ROC AUC와 같은 소프트 분류에 대한 신뢰 구간을 보여주기 위해 다른 기사를 계획하고 있습니다. 모델에 의한 이산적 클래스 선택(하드 분류). 동일한 코드가 회귀(연속 대상 변수 예측)뿐만 아니라 둘 다에 대해 작동합니다. 다른 종류의 예측(및 회귀의 경우 다른 종류의 실제 대상)에 전달하기만 하면 됩니다.

이 jupyter 노트북은 github에서 사용할 수 있습니다. bootConfIntAutoV1o_standalone.ipynb

이 문서가 유익하거나 유용했습니까? 이 기사 또는 신뢰 구간, 부트스트랩, 부트 수, 이 구현, 데이터 세트, 모델, 임계값 이동 또는 결과에 대한 의견이나 질문이 있는 경우 아래에 의견을 게시하십시오.

앞서 언급한 것 외에도 이전 기사, 당신은 또한 내 관심이있을 수 있습니다 Pandas에서 CSV 파일을 읽을 때 날짜/날짜/시간 열을 자동 감지하고 데이터 유형을 설정하는 방법, 현재 기사와 직접적인 관련은 없지만.

일부 권리 보유

 
바이오 : 데이비드 B 로젠(박사) IBM Global Financing에서 자동 신용 승인을 담당하는 수석 데이터 과학자입니다. David의 저작물에 대해 더 알아보기 dabruro.medium.com.

실물. 허가를 받아 다시 게시했습니다.

관련 :

출처: https://www.kdnuggets.com/2021/10/calculate-confidence-intervals-performance-metrics-machine-learning.html

타임 스탬프 :

더보기 너 겟츠