불균형이 심한 환경에서 비용에 민감한 학습을위한 제안


15

몇 백만 행과 ~ 100 열의 데이터 집합이 있습니다. 공통 클래스에 속하는 데이터 세트의 예제 중 약 1 %를 감지하고 싶습니다. 최소 정밀도 제약이 있지만 매우 비대칭 적 인 비용으로 인해 특정 리콜에 너무 열중하지 않습니다 (10 개의 긍정적 인 일치가 남지 않는 한)!

이 설정에서 권장 할 몇 가지 방법은 무엇입니까? (신문에 대한 링크, 환영하는 구현에 대한 링크)

답변:


15

나는 그와 Garcia (2009) 가 불균형 수업 문제에 대한 학습에 대한 유용한 검토 인 것을 발견했습니다. 고려해야 할 몇 가지 사항은 다음과 같습니다.

데이터 기반 접근 방식 :

다수 클래스를 언더 샘플링하거나 소수 클래스를 오버 샘플링 할 수 있습니다. (Breiman은 이것이 비 균일 한 오 분류 비용을 할당하는 것과 공식적으로 동일하다고 지적했다.) 이것은 문제를 일으킬 수있다. 오버 샘플링은 과적 합의 위험을 증가시킵니다.

이러한 문제를 줄이는 "알려진 언더 샘플링"방법이 있습니다. 그중 하나는 대부분의 클래스에서 여러 하위 집합을 독립적으로 샘플링하고 각 하위 집합을 모든 소수 클래스 데이터와 결합하여 여러 분류 자를 만드는 EasyEnsemble 입니다.

SMOTE (Synthetic Minority Oversampling Technique) 또는 SMOTEBoost (SMOTE를 boosting과 결합) 는 피처 공간에서 가장 가까운 이웃을 만들어 소수 클래스의 합성 인스턴스를 만듭니다. SMOTE는 DMwR 패키지의 R로 구현되어 있습니다 (이 문서는 Luis Torgo의 저서 "R을 사용한 데이터 마이닝, 사례 연구를 통한 학습"CRC Press 2016과 함께 제공됨 ).

모델 피팅 접근법

손실 함수에 클래스 별 가중치를 적용하십시오 (소수자의 경우 더 큰 가중치).

트리 기반 접근법의 경우 Cieslak et al. 에서 주장한 것처럼 Hellinger 거리 를 노드 불순물 함수로 사용할 수 있습니다 . "헬 링거 거리 결정 트리는 강력하고 기울어지지 않습니다" ( Weka 코드는 여기에 있습니다 .)

하나의 클래스 분류기를 사용하여 (모델에 따라) 한 클래스의 확률 밀도 또는 경계를 학습하고 다른 클래스를 특이 값으로 처리하십시오.

물론, 정확성을 모델 구축의 지표로 사용하지 마십시오. 코헨의 카파는 합리적인 대안입니다.

모델 평가 접근법

모형이 예측 된 확률 또는 다른 점수를 반환하는 경우 오류를 적절히 절충 할 수있는 의사 결정 컷오프 (훈련 및 테스트와 독립적 인 데이터 집합 사용)를 선택했습니다. R에서 OptimalCutpoints 패키지는 컷오프를 결정하기 위해 비용에 민감한 알고리즘을 포함하여 여러 알고리즘을 구현합니다.


자세한 답변에 감사드립니다. 언더 샘플링을 시도했지만 비참하게 실패했습니다. 이 모델은 뛰어난 샘플 성능을 보여 주지만, 불균형은 여전히 ​​테스트 세트 (그리고 결국 사용할 실제 데이터)에 존재하므로 모델의 OOS 정밀도는 끔찍합니다. 또한 클래스 별 가중치를 시도했지만 내 응용 프로그램은가 음성보다 가양 성에 대해 쉽게 정량화 할 수있는 더 높은 비용이 필요합니다. 한 클래스 분류 자에 대해서는 선형 svm (비선형 모델이 너무 느림)에 맞추려고 시도했지만 샘플에서도 정밀도가 0입니다.
em70

1
나는 당신을 느낀다. 대부분의 사례가 부정적이면 높은 정밀도가 어렵습니다. 의사 결정 임계 값을 결정하기 위해 오류 유형별 가중치를 학습하고 저장하기 위해 클래스 별 가중치 (예 : 클래스의 사례 비율에 반비례)를 사용합니다. 모델 선택에 대한 정확도가 아닌 Cohen의 카파로 교차 유효성 검사를 사용하고 있기를 바랍니다. 가용 한 트레이드 오프를 실제로 이해하기 위해 모든 컷오프에서 측면 정밀도 및 강화 (정밀도 사례의 비율 / 정확도)와 함께 교정 데이터 클래스의 확률 밀도를 시각화합니다.
MattBagg

좋은 답변, 감사합니다. 언급 한 EasyEnsemble과 비슷한 기술을 꽤 오랫동안 사용해 왔지만 의심 스러웠습니다 (시뮬레이션 된 데이터에 대한 합리적인 성능에도 불구하고). 이제 이해가 되네요.
ayorgo

5

본인은 이것이 머신 러닝 커뮤니티에서 활발한 연구 분야이며, 큰 해답이 아니라 점점 더 많은 잠재적 솔루션이 있다는 것입니다. 고려중인 특정 알고리즘을 지정하면 더 나은 답변을 얻을 수 있습니다.

파라 메트릭 모델 (로지스틱 회귀)을 사용하는 경우 이는 문제가되지 않으며 손실 함수 (가양 성 대 가양 성 비용)를 기준으로 임계 값을 변경할 수 있습니다.

기계 학습 알고리즘을 사용하는 경우 까다로울 수 있습니다. Max Kuhn은 "Applied Predictive Modeling"의 16 장에서이 문제를 요약하려고 노력합니다. 그러나 어려운 주제는 요약 할 수 있습니다. 이 책을 구매하지 않으려면이 장의 AppliedPredictiveModeling 패키지에서 R 코드를 사용할 수 있으며 R에 익숙한 알고리즘 및 사용 된 알고리즘에 따라 충분할 수 있습니다.

일반적으로 논의는 언더 샘플링 / 오버 샘플링 +/- 비용에 민감한 알고리즘을 중심으로 진행됩니다. jous-boost와 같은 변형도 가능합니다.
이러한 종류의 토론의 예 : Chen et al "임의의 숲을 사용하여 불균형 데이터 학습" http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


임계 값을 변경하는 문제는 회귀 모델의 절편을 변경하는 것과 같습니다. 실제로 비용을 고려하기 위해 가중치 벡터를 변경하고 싶을 수도 있습니다. 그러나 그렇게하면 이미 심각한 불균형이 주어지면 0 정밀도로 끝납니다! 나는 어떤 알고리즘도 설정하지 않았고 유망한 경우 최첨단 연구 아이디어를 구현할 리소스가 있습니다. 나는 당신이 제안한 책을 살펴볼 것입니다.
em70

이 장은 그렇게 간결합니다. 확고한 노력이지만 요약하기 어려운 주제. 다양한 방법으로 출판 된 많은 지원되지 않는 주장. 임의 포리스트에서 계층화 된 언더 샘플링은 머신 러닝 관점에서 시작하는 것이 좋습니다. 코드는 책 패키지에 있습니다.
찰스

0

scikit-learn의 구현을 살펴볼 수 있습니다. 클래스 가중치 사전 또는 '자동'의 값을 가질 수있는 class_ weight 인수에주의하십시오.

클래스 sklearn.svm.SVC (C = 1.0, 커널 = 'rbf', 정도 = 3, 감마 = 0.0, coef0 = 0.0, 축소 = 참, 확률 = 거짓, tol = 0.001, cache_size = 200, class_weight = None, verbose = 거짓, max_iter = -1, random_state = 없음)

클래스 가중치 사전 또는 'auto'일 수있는 class_weight 인수의 값으로 재생할 수 있습니다. '자동'모드에서 학습 알고리즘은 각 클래스 내의 샘플 수에 따라 각 클래스에 가중치를 자동으로 할당합니다.

scikit-learn에는 몇 가지 다른 분류 알고리즘이 있으며 그 중 일부는 클래스 가중치를 허용합니다.


OP의 목표를 달성하기 위해 클래스 가중치를 사용하는 방법에 대해 더 말할 수 있습니까? 나는 그것이 당신의 게시물에 암시 적이라고 생각하지만 이것은 아직 대답이 아닙니다.
gung-Monica Monica 복원

예, 일부 문서를 살펴보면 class_weight 인수에 'auto'값이 있거나 클래스 가중치를 갖는 사전 값이있을 수 있습니다. '자동'인 경우 학습 알고리즘 자체는 각 샘플 수에 따라 각 클래스의 가중치를 찾습니다.
Ash
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.