제퍼넷 로고

데이터 재조정 없이 불균형 분류를 처리하는 방법

시간

데이터 재조정 없이 불균형 분류를 처리하는 방법

왜곡된 데이터의 오버샘플링을 고려하기 전에 Python에서 분류 결정 임계값을 조정해 보십시오.


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


잔액
님이 촬영 한 사진 엘레나 모즈 빌로 on Unsplash

 

머신 러닝에서 한 클래스의 인스턴스가 다른 클래스보다 훨씬 많은 데이터로 분류 모델을 구축할 때 초기 기본 분류기는 거의 모든 경우를 다수 클래스로 분류하기 때문에 종종 불만족스럽습니다. 많은 기사에서 오버샘플링(예: 스 모트) 또는 때때로 언더샘플링 또는 단순히 클래스 기반 샘플 가중치를 사용하여 "재조정된" 데이터에 대한 모델을 재교육하지만 이것이 항상 필요한 것은 아닙니다. 여기서 우리는 대신 당신이 할 수 있는 일을 보여주는 것을 목표로 합니다. 없이 데이터 균형 조정 또는 모델 재교육

클래스 1에 대한 모델의 예측 확률이 1개 클래스 분류에서 클래스 0.5의 예측 확률보다 높을 때 "클래스 XNUMX"이라고 말하는 임계값을 단순히 조정하여 이 작업을 수행합니다. 가장 가능성이 높습니다(XNUMX의 확률 임계값). 이것이 어떻게 데이터 균형 재조정으로 인해 발생하는 문제를 피하면서 위양성 분류와 위음성 분류 간에 원하는 절충안을 만들 수 있는 유연성을 제공하는지 확인할 것입니다.

우리는을 사용합니다 신용 카드 사기 식별 데이터 세트 Kaggle에서 설명합니다. 데이터 세트의 각 행은 신용 카드 거래를 나타내며 대상 변수 Class==0은 다음을 나타냅니다. 합법적 인 트랜잭션 및 클래스==1은 트랜잭션으로 판명되었음을 나타냅니다. 사기. 284,807건의 거래가 있으며 그 중 492건(0.173%)만이 사기로 매우 불균형합니다.

우리는 그라디언트 부스팅 이는 종종 좋은 결과를 제공하기 때문입니다. 특히 Scikit-Learn의 새로운 HistGradientBoostingClassifier는 데이터 세트가 이와 같이 상대적으로 클 때 원래 GradientBoostingClassifier보다 훨씬 빠르기 때문입니다.

먼저 일부 라이브러리를 가져와서 데이터 세트를 읽어 보겠습니다.

import numpy as np
import pandas as pd
from sklearn import model_selection, metrics
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
df=pd.read_csv('creditcard.csv')
df.info()



V1 ~ V28(주성분 분석) 및 거래 금액은 모두 숫자이며 누락된 데이터가 없는 기능입니다. 트리 기반 분류기만 사용하기 때문에 기능을 표준화하거나 정규화할 필요가 없습니다.

이제 데이터를 훈련 세트와 테스트 세트로 분할한 후 모델을 훈련할 것입니다. 제 노트북에서는 XNUMX분 정도 걸렸습니다. 과적합으로 인해 유효성 검사 하위 집합의 성능이 저하되기 시작하면 n_iter_no_change를 사용하여 훈련을 조기에 중지합니다. learning_rate와 max_leaf_nodes를 선택하기 위해 따로 하이퍼파라미터 튜닝을 조금 하긴 했지만, 이것은 이 글의 초점이 아닙니다.

Xtrain, Xtest, ytrain, ytest = model_selection.train_test_split( df.loc[:,'V1':'Amount'], df.Class, stratify=df.Class, test_size=0.3, random_state=42)
gbc=HistGradientBoostingClassifier(learning_rate=0.01, max_iter=2000, max_leaf_nodes=6, validation_fraction=0.2, n_iter_no_change=15, random_state=42).fit(Xtrain,ytrain)

이제 이 모델을 테스트 데이터에 기본값으로 적용합니다. 하드 분류자, 각 트랜잭션에 대해 0 또는 1을 예측합니다. 우리는 암시적으로 결정 임계값 0.5를 모델의 연속 확률 예측 등 소프트 분류기. 확률 예측이 0.5보다 크면 "1", 0.5 미만이면 "0"이라고 합니다.

우리는 또한 인쇄 혼란 매트릭스 그 결과, 1등급(사기)을 "양" 클래스는 규칙에 따라 더 희귀한 클래스이기 때문입니다. 혼동 행렬은 True Negatives, False Positives, False Negatives 및 True Positives의 수를 보여줍니다. NS 정규화된 혼동 행렬 비율(예: FNR = False Negative Rate)은 괄호 안에 백분율로 포함됩니다.

hardpredtst=gbc.predict(Xtest)
def conf_matrix(y,pred): ((tn, fp), (fn, tp)) = metrics.confusion_matrix(y, pred) ((tnr,fpr),(fnr,tpr))= metrics.confusion_matrix(y, pred, normalize='true') return pd.DataFrame([[f'TN = {tn} (TNR = {tnr:1.2%})', f'FP = {fp} (FPR = {fpr:1.2%})'], [f'FN = {fn} (FNR = {fnr:1.2%})', f'TP = {tp} (TPR = {tpr:1.2%})']], index=['True 0(Legit)', 'True 1(Fraud)'], columns=['Pred 0(Approve as Legit)', 'Pred 1(Deny as Fraud)'])
conf_matrix(ytest,hardpredtst)



클래스 1에 대한 리콜(위의 TPR로 표시된 감도 또는 참 양성률이라고도 함)은 71.62%에 불과하며, 이는 진정한 사기의 71.62%가 사기로 올바르게 식별되어 거부되었음을 의미합니다. 따라서 실제 사기의 28.38%는 불행히도 합법적인 것처럼 승인됩니다.

특히 불균형 데이터의 경우(또는 일반적으로 거짓 긍정과 거짓 부정이 다른 결과를 가질 수 있음) 위에서 ".predict()"를 사용하여 수행한 것처럼 기본 암시적 분류 결정 임계값 0.5를 사용하도록 제한하지 않는 것이 중요합니다. 우리는 사기 손실을 줄이기 위해 클래스 1의 회수(TPR)를 개선하고자 합니다(오탐 감소). 이를 위해 임계값 이상의 확률을 예측할 때 "클래스 1"이라고 말하는 임계값을 줄일 수 있습니다. 이런 식으로 더 넓은 범위의 예측 확률에 대해 "클래스 1"이라고 합니다. 이러한 전략은 다음과 같이 알려져 있습니다. 문턱 이동.

궁극적으로 우리가 모델의 확률에 적용하는 임계값을 조정함에 따라 False Positive(사기로 거부된 실제 합법적인 거래)의 수가 불가피하게 증가할 것이기 때문에 이러한 False Negative를 어느 정도로 줄이고 싶은지는 비즈니스 결정입니다. 예측(".predict( )" 대신 ".predict_proba( )"에서 가져옴).

이 절충점을 설명하고 임계값을 선택하는 데 도움을 주기 위해 임계값에 대해 거짓 긍정 비율과 거짓 부정 비율을 표시합니다. 이것은 수신기 동작 특성 (ROC) 곡선이지만 임계값을 강조합니다.

predtst=gbc.predict_proba(Xtest)[:,1]
fpr, tpr, thresholds = metrics.roc_curve(ytest, predtst)
dfplot=pd.DataFrame({'Threshold':thresholds, 'False Positive Rate':fpr, 'False Negative Rate': 1.-tpr})
ax=dfplot.plot(x='Threshold', y=['False Positive Rate', 'False Negative Rate'], figsize=(10,6))
ax.plot([0.00035,0.00035],[0,0.1]) #mark example thresh.
ax.set_xbound(0,0.0008); ax.set_ybound(0,0.3) #zoom in



최적의 임계값을 선택하기 위한 몇 가지 경험적 규칙이나 제안된 메트릭이 있지만 궁극적으로 이는 거짓 음성 대 거짓 양성의 비즈니스 비용에만 의존합니다. 예를 들어 위의 플롯을 보면 다음과 같이 임계값 0.00035(세로 녹색 선이 추가됨)를 적용하도록 선택할 수 있습니다.

hardpredtst_tuned_thresh = np.where(predtst >= 0.00035, 1, 0)
conf_matrix(ytest, hardpredtst_tuned_thresh)



우리는 거짓 음성 비율을 28.38%에서 9.46%로 줄였습니다(즉, 진정한 사기의 90.54%를 새로운 리콜 또는 민감도 또는 참 양성률 또는 TPR로 식별 및 거부). 반면 거짓 양성률(FPR)은 0.01% ~ 5.75%(즉, 여전히 합법적인 거래의 94.25%를 승인함). 사기 거래의 6% 미만만 승인하기 위해 정당한 거래의 약 10%를 거부하는 것이 가치가 있을 것입니다. 암시적 분류 결정 임계값이 28인 기본 하드 분류기를 사용했습니다.

불균형 데이터의 균형을 맞추지 못하는 이유

 
 
불균형한 훈련 데이터의 "균형"을 피하는 한 가지 이유는 이러한 방법이 훈련된 모델의 확률 예측을 편향/왜곡하여 다음이 되도록 하기 때문입니다. 잘못 보정, 원래 소수 클래스의 모델의 예측 확률을 체계적으로 증가시켜 단순히 상대적인 것으로 축소됩니다. 순서 판별 점수 or 결정 기능 or 신뢰 점수 원래("불균형") 훈련 및 테스트 세트와 분류기가 예측을 할 수 있는 미래 데이터에서 잠재적으로 정확한 예측된 클래스 확률이 아니라. 훈련을 위한 이러한 재조정이 있는 경우 is 정말로 필요하지만 수치적으로 정확한 확률 예측이 여전히 필요하므로 다음을 수행해야 합니다. 재조정 원래/불균형 클래스 비율을 갖는 데이터 세트에 대한 예측 확률. 또는 균형 모델에서 예측된 확률에 수정을 적용할 수 있습니다. 밸런싱은 언밸런스다 과 이 답장 저자에 의해.

오버샘플링을 통한 데이터 균형 조정의 또 다른 문제는(이 문제가 없는 클래스 종속 인스턴스 가중치와 반대) 순진한 교차 검증을 편향시켜 잠재적으로 교차 검증에서 감지되지 않는 과도한 과적합으로 이어질 수 있다는 것입니다. 교차 검증에서 데이터가 "폴드" 하위 집합으로 분할될 때마다 한 폴드에 다른 폴드의 인스턴스와 중복되거나 생성된 인스턴스가 있을 수 있습니다. 따라서 교차 검증이 가정하는 것처럼 폴드는 진정으로 독립적이지 않습니다. 데이터 "유출" 또는 "누설"이 있습니다. 예를 들어 불균형 데이터 세트에 대한 교차 검증 이 상황에 대해 교차 검증을 올바르게 다시 구현할 수 있는 방법을 설명합니다. 그러나 scikit-learn에서 적어도 인스턴스 복제에 의한 오버샘플링의 경우(SMOTE일 필요는 없음) 다음을 사용하여 대안으로 해결할 수 있습니다. model_selection.GroupKFold 주어진 인스턴스의 모든 복제본에 대해 동일한 값을 갖는 선택된 그룹 식별자에 따라 인스턴스를 그룹화하는 교차 검증의 경우 — 참조 내 대답 위 링크된 기사에 대한 답변입니다.

결론

 
 
기본 임계값 0.5를 순진하게 또는 암시적으로 적용하거나 재조정된 훈련 데이터를 사용하여 즉시 재훈련하는 대신 원래 모델(원래 "불균형" 데이터 세트에 대해 훈련됨)을 사용해 보고 가양성(false positive) 및 가음성(false negative)을 사용하여 바람직한 비즈니스 결과를 생성할 수 있는 임계값을 선택합니다.

질문이나 의견이 있으면 답변을 남겨주세요.

편집: 유일한 실제 "문제"가 기본 0.5 임계값이 적절하지 않은 경우에도 훈련 데이터 재조정이 "작동"하는 이유는 무엇입니까?

 
 
모델에서 생성된 평균 확률 예측은 클래스 1인 훈련 인스턴스의 비율을 근사화할 것입니다. 이는 이것이 대상 클래스 변수(0과 1의 값을 가짐)의 평균 실제 값이기 때문입니다. 회귀에서도 마찬가지입니다. 목표 변수의 평균 예측 값은 목표 변수의 평균 실제 값에 근접할 것으로 예상됩니다. 데이터가 심하게 불균형하고 클래스 1이 소수 클래스인 경우 이 평균 확률 예측은 0.5보다 훨씬 작으며 클래스 1의 확률에 대한 대부분의 예측은 0.5보다 작으므로 클래스 0(다수 클래스)으로 분류됩니다. ). 훈련 데이터의 균형을 재조정하면 평균 예측 확률이 0.5로 증가하므로 많은 인스턴스가 위의 기본 임계값 0.5 및 그 이하 - 예측 클래스가 더 균형을 이룹니다. 따라서 더 자주 확률 예측이 임계값을 초과하고 클래스 1(소수 클래스)을 제공하도록 임계값을 줄이는 대신 재조정은 확률 예측이 기본 임계값인 0.5를 초과하고 클래스 1을 제공하도록 더 자주 예측 확률을 증가시킵니다. .

데이터를 실제로 재조정하거나 가중치를 재조정하지 않고 재조정의 결과와 유사한(동일하지 않은) 결과를 얻으려면 임계값을 클래스 1의 모델 예측 확률의 평균 또는 중앙값과 같게 설정하기만 하면 됩니다. 하지만 물론 이것은 특정 비즈니스 문제에 대한 가양성(false positive)과 가음성(false negative) 사이의 최적 균형을 제공하는 임계값일 필요도 없으며 데이터 균형을 재조정하고 임계값 0.5를 사용하지도 않습니다.

데이터 균형을 재조정하면 평균 예측 확률을 기본 임계값인 0.5와 동일하게 이동시키는 것 이상으로 모델을 실질적으로 개선할 수 있는 상황 및 모델이 있을 수 있습니다. 그러나 기본 임계값 0.5를 사용할 때 모델이 대부분의 시간에 대다수 클래스를 선택한다는 사실 자체가 데이터 재조정이 평균 확률 예측을 임계값과 동일하게 만드는 것 이상을 달성할 것이라는 주장을 뒷받침하지 않습니다. 평균 확률 예측이 임계값과 같게 하려면 확률 예측을 왜곡하기 위해 훈련 데이터를 수정하거나 다시 가중치를 두지 않고 임계값을 평균 확률 예측과 동일하게 설정하기만 하면 됩니다.

편집: 신뢰도 점수 대 확률 예측에 대한 참고 사항

 
 
분류자에 predict_proba 메소드가 없는 경우(예: 벡터 분류자를 지원하는 경우), 그 자리에 해당 decision_function 메소드를 사용하여 다음을 생성할 수 있습니다. 순서 판별 점수 or 자신감 점수 인 경우에도 동일한 방식으로 임계값을 지정할 수 있는 모델 출력 지원 로 해석 가능 확률 예측 0과 1 사이. 특정 분류기 모델이 두 클래스에 대한 신뢰도 점수를 계산하는 방법에 따라 수도 임계값을 클래스 1의 신뢰도 점수에 직접 적용하는 대신(클래스 1의 예측 확률이 단순히 0에서 저것을 뺀 것이기 때문에 위에서 클래스 XNUMX의 예측 확률로 수행함) 임계값을 차이 가양성의 비용이 가음성의 비용과 동일하다고 가정되는 경우 기본 임계값은 0인 클래스 1의 신뢰 점수와 클래스 0의 신뢰 점수 사이. 이 기사에서는 XNUMX등급 분류 문제를 가정합니다.

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

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

관련 :


PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.kdnuggets.com/2021/09/imbalanced-classification-without-re-balancing-data.html

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?