머신러닝 데이터 세트의 불균형 클래스와 싸우기 위한 8가지 방법

혹시 이런 일이 발생하지 않았나요?

당신은 데이터세트를 작업 중입니다. 분류 모델을 만들었고 즉시 90%의 정확도를 얻을 수 있었습니다. 결과는 정말 환상적인 것 같습니다. 그런데 조금 더 깊이 들어가보니 데이터의 90%가 한 클래스에 속한다는 것을 알게 되었습니다. 


이것은 불균형한 데이터세트와 그로 인해 발생할 수 있는 실망스러운 결과의 예입니다. 이 게시물에서는 불균형 데이터가 있는 머신러닝 데이터세트에서 훌륭한 결과를 제공하는 데 사용할 수 있는 전술을 알아 보도록 하겠습니다.


불균형한 데이터 파악

저는 다음과 같은 클래스 불균형에 대한 문의를 종종 받곤 합니다.

이진 분류 문제가 있고 한 클래스가 저의 학습 세트에 60 : 1 비율로 존재합니다. 로지스틱 회귀를 사용했는데 결과는 하나의 클래스를 무시하는 것 같습니다.”

또는 이런 문의도 있습니다.

“저는 분류 모델을 연구하고 있습니다. 제 데이터세트에는 분류  세 가지 레이블이 있으며 A, B 및 C가 되도록 합니다. 그러나 학습 데이터세트에는 볼륨이 70 % 인 A 데이터세트, 25 %의 B 데이터세트, 5 %의 C 데이터세트가 있습니다. 대부분의 경우 내 결과는 A에 과적합됩니다. 이 문제를 어떻게 해결할 수 있는지 알려 주시겠습니까?

저는 이 문제를 극복하는 가장 좋은 방법에 대해 긴 목록을 작성했습니다. 그리고 저는 마침내 제 학생 중 한 사람의 조언을 받아 들였습니다. 아마도 다가오는 블로그 게시물 중 하나는 매우 불균형한 데이터에 대해 수행하도록 모델을 학습하는 문제를 해결하고 몇 가지 기술과 기대치를 간략하게 설명할 수 있습니다.


좌절!

불균형한 데이터는 많은 좌절감을 줄 수 있습니다. 데이터에 불균형 클래스가 있고 자신이 얻고 있다고 생각했던 모든 훌륭한 결과가 거짓말로 판명되었다는 사실을 발견했을 때 매우 좌절감을 느낍니다.

다음 좌절감은 책, 기사 및 블로그 게시물이 데이터의 불균형을 처리하는 방법에 대한 좋은 조언을 제공하지 않는 것처럼 보일 때 발생합니다. 결코 실망할 필요는 없습니다. 많은 옵션이 있으며 우리는 그것들을 모두 살펴볼 것입니다. 그렇게 함으로써 불균형 데이터에 대한 예측 모델을 구축할 수 있습니다.


불균형 데이터란?

불균형 데이터는 일반적으로 클래스가 동일하게 표현되지 않는 분류 문제를 나타냅니다.

예를 들어 100개의 인스턴스(행)에 2클래스(이진) 분류 문제가 있을 수 있습니다. 총 80개의 인스턴스가 Class-1로 레이블이 지정되고 나머지 20개의 인스턴스는 Class-2로 레이블이 지정됩니다.

이것은 불균형 데이터세트이며 클래스 1과 클래스 2 인스턴스의 비율은 80:20 또는 더 간결하게 4:1입니다.

2클래스 분류 문제와 다중 클래스 분류 문제에서 클래스 불균형 문제가 발생할 수 있습니다. 대부분의 기술은 둘 중 하나에서 사용할 수 있습니다.

나머지 논의에서는 생각하고 설명하기가 더 쉽기 때문에 2 클래스 분류 문제를 가정합니다.


불균형은 흔한 일입니다

대부분의 분류 데이터세트는 각 클래스에서 정확히 동일한 수의 인스턴스를 갖지 않지만 작은 차이는 중요하지 않은 경우가 많습니다.

클래스 불균형은 일반적일 뿐만 아니라 예상되는 문제입니다. 예를 들어, 사기 거래를 특징짓는 것과 같은 데이터세트에서는 불균형이 발생합니다. 거래의 대다수는 “사기 아님” 클래스에 속하고 극소수는 “사기” 클래스에 속합니다.

또 다른 예는 고객 이탈 데이터세트로, 대다수의 고객은 서비스를 사용 중이고(“변동 없음” 클래스) 소수는 구독을 취소합니다(“Churn” 클래스).

위의 예에서 4 : 1과 같은 적당한 클래스 불균형이 있으면 문제가 발생할 수 있습니다.


정확성의 역설

정확성 역설은 위에 말씀 드린 상황을 표현하는 정확한 이름입니다. 정확도 측정값이 뛰어난 수치(예: 90%)를 보여주지만 기본 클래스 분포만 반영하는 경우입니다. 분류 정확도는 분류 문제에 대한 모델을 평가할 때 사용하는 첫 번째 척도인 경우가 많기 때문에 매우 일반적입니다.


모두 빨간색으로 올려보세요!

불균형 데이터세트에서 학습할 때 모델에서 무슨 일이 일어나고 있습니까?

짐작하셨겠지만 불균형 데이터(인스턴스의 90%가 클래스 1)에서 90%의 정확도를 얻는 이유는 모델이 데이터를 보고 항상 “클래스-1″을 예측하고 높은 정확도를 달성하는 것이 가장 좋은 방법이라고 영리하게 결정하기 때문입니다.

이는 간단한 규칙 기반 알고리즘을 사용할 때 가장 잘 나타납니다. 최종 모델에서 규칙을 인쇄하면 예측하도록 요청 받은 데이터에 관계없이 하나의 클래스를 예측할 가능성이 매우 높다는 것을 알 수 있습니다.



불균형 학습 데이터에 대처하기 위한 8가지 방법

이제 클래스 불균형이 무엇이며 왜 오해의 소지가 있는 분류 정확도를 제공하는지 이해합니다.

그래서 우리의 선택은 무엇입니까?


1) 더 많은 데이터를 수집 할 수 있습니까?

어리석은 일이라고 생각할 수도 있지만 더 많은 데이터를 수집하는 것은 거의 항상 간과됩니다.

더 많은 데이터를 수집할 수 있습니까? 잠시 시간을 내어 문제에 대한 더 많은 데이터를 수집 할 수 있는지 생각해보십시오. 더 큰 데이터세트는 클래스에 대해 다른, 아마도 더 균형 잡힌 관점을 갖게 할 수 있습니다.

마이너 클래스의 더 많은 예제는 나중에 데이터세트를 리샘플링할 때 유용할 수 있습니다.


2) 실적 측정항목 변경 시도

정확도는 불균형 데이터세트로 작업할 때 사용할 메트릭이 아닙니다. 우리는 그것이 오해의 소지가 있음을 보았습니다.

불균형 클래스로 작업할 때 보다 진실한 이야기를 전달하도록 설계된 메트릭이 있습니다.

내 게시물 “분류 정확도가 충분하지 않습니다 : 사용할 수 있는 더 많은 성능 측정“에서 다양한 성능 측정을 선택하는 방법에 대한 자세한 조언을 제공합니다.

그 게시물에서 나는 환자의 유방암 재발을 특징 짓는 불균형한 데이터세트를 살펴 봅니다.

이 게시물에서 기존 분류 정확도보다 모델의 정확도에 대한 더 많은 통찰력을 제공할 수 있는 다음 성능 측정값을 살펴보는 것이 좋습니다.

  • 혼동 행렬: 올바른 예측(대각선)과 수행된 잘못된 예측의 유형(잘못된 예측이 할당된 클래스)을 보여주는 테이블로 예측을 분석합니다.
  • 정밀도: 분류자 정확도의 측정값입니다.
  • 회수: 분류기 완전성의 측정값
  • F1 점수(또는 F-점수): 정밀도 및 재현율의 가중 평균입니다.


또한 다음을 살펴 보는 것이 좋습니다.

  • Kappa(또는Cohen의 kappa): 데이터에 있는 클래스의 불균형에 의해 정규화된 분류 정확도입니다.
  • ROC 곡선: 정밀도 및 재현율과 마찬가지로 정확도는 민감도와 특이도로 나뉘며 이러한 값의 균형 임계값을 기반으로 모델을 선택할 수 있습니다.


ROC 곡선을 사용하여 분류 정확도를 비교하는 방법에 대한 자세한 내용은 “ROC 곡선과 분류기 성능 평가 및 비교” 게시물을 참조하십시오.

아직 확실하지 않습니까? kappa로 시작하면 분류 정확도보다 무슨 일이 일어나고 있는지 더 잘 알 수 있습니다.


3) 데이터세트를 다시 샘플링하십시오.

예측 모델을 작성하는 데 사용하는 데이터세트를 변경하여 보다 균형 잡힌 데이터를 가질 수 있습니다.

이 변경을 데이터세트 샘플링이라고 하며 클래스를 균등하게 하는 데 사용할 수 있는 두 가지 주요 방법이 있습니다.

  1. 오버샘플링이라고하는 과소 표현된 클래스에서 인스턴스의 복사본을 추가 할 수 있습니다.
  2. 언더샘플링이라고 하는 과잉 표현된 클래스에서 인스턴스를 삭제할 수 있습니다.

이러한 접근 방식은 구현하기가 매우 쉽고 빠르게 실행할 수 있어서 훌륭한 출발점이 됩니다.

사실, 모든 불균형 데이터세트에 대해 항상 두 가지 접근 방식을 모두 시도하여 선호하는 정확도 측정이 향상되는지 확인하는 것이 좋습니다.

Wikipedia 기사 “데이터 분석의 오버 샘플링 및 언더 샘플링“에서 조금 더 배울 수 있습니다.


몇 가지 경험 법칙

  • 데이터가 많은 경우(수만 또는 수십만 개 이상의 인스턴스) 언더샘플링 테스트 고려
  • 데이터가 많지 않은 경우(수만 개 이하의 레코드) 오버샘플링으로 테스트하는 것이 좋습니다.
  • 무작위 및 비무작위(예: 계층화된) 샘플링 체계를 테스트해 보십시오.
  • 다른 리샘플링 비율을 테스트하는 것이 좋습니다(예: 이진 분류 문제에서 1:1 비율을 목표로 할 필요가 없으며 다른 비율을 시도).

4) 합성 샘플 생성 시도

합성 샘플을 생성하는 간단한 방법은 소수 클래스의 인스턴스에서 특성을 무작위로 샘플링하는 것입니다.

데이터세트 내에서 경험적으로 샘플링하거나 반대로 실행할 때 각 속성을 독립적으로 샘플링 할 수있는 Naive Bayes와 같은 방법을 사용할 수 있습니다. 더 많은 다른 데이터를 갖게 되지만 특성 간의 비선형 관계는 유지되지 않을 수 있습니다.

합성 샘플을 생성하는 데 사용할 수 있는 체계적인 알고리즘이 있습니다. 이러한 알고리즘 중 가장 인기있는 것은 SMOTE 또는 합성 소수 오버 샘플링 기술입니다.

이름에서 알 수 있듯이 SMOTE는 오버샘플링 방법입니다. 복사본을 만드는 대신 부 클래스에서 합성 샘플을 만들어 작동합니다. 알고리즘은 두 개 이상의 유사한 인스턴스를 선택하고(거리 측정값 사용) 인접 인스턴스와의 차이 내에서 임의의 양만큼 한 번에 한 속성씩 인스턴스를 테스트합니다.

SMOTE에 대해 자세히 알아보려면 “SMOTE: 합성 소수 과잉 샘플링 기술“이라는 제목의 원본 2002년 논문을 참조하십시오.

예를 들어 SMOTE 알고리즘에는 여러 가지 구현이 있습니다.

  • 파이썬에서는 “UnbalancedDataset“모듈을 살펴보십시오. SMOTE의 여러 구현과 시도할 수 있는 다양한 기타 리샘플링 기술을 제공합니다.
  • R에서DMwR 패키지는 SMOTE의 구현을 제공합니다.
  • Weka에서는SMOTE 관리 필터를 사용할 수 있습니다.

5) 다른 알고리즘 시도

항상 그렇듯이 모든 문제에 대해 좋아하는 알고리즘을 사용하지 말 것을 강력히 권고합니다. 적어도 주어진 문제에 대해 다양한 유형의 알고리즘을 검사해야 합니다.

스팟 체크 알고리즘에 대한 자세한 내용은 내 게시물 “머신러닝 문제에 대한 스팟 체크 알고리즘이어야하는 이유”를 참조하십시오.

즉, 의사 결정 트리는 종종 불균형 데이터세트에서 잘 수행됩니다. 트리 생성에 사용된 클래스 변수를 확인하는 분할 규칙은 두 클래스를 모두 처리하도록 강제할 수 있습니다.

확실하지 않은 경우 C4.5, C5.0, CART 및 랜덤 포레스트와 같은 몇 가지 인기 있는 의사 결정 트리 알고리즘을 사용해 보십시오.

의사 결정 트리를 사용하는 R 코드의 예는 “의사 결정 트리가있는 R의 비선형 분류“라는 제목의 내 게시물을 참조하십시오.

파이썬과 scikit-learn에서 CART를 사용하는 예제는 “지금 scikit-Learn Now로 손을 더럽히십시오“라는 제목의 내 게시물을 참조하십시오.


6) 벌칙 모델 시도

동일한 알고리즘을 사용할 수 있지만 문제에 대해 다른 관점을 제공할 수 있습니다.

벌칙을 받은 분류는 학습 중에 소수 클래스에 대한 분류 실수를 하는 모델에 추가 비용을 부과합니다. 이러한 처벌은 모델이 소수 계급에 더 많은 관심을 기울이도록 편향시킬 수 있습니다.

종종 클래스 벌칙 또는 가중치의 처리는 학습 알고리즘에 특화되어 있습니다. 벌칙-SVM 및 벌칙-LDA와 같은 벌칙 버전의 알고리즘이 있습니다.

벌칙된 모델에 대한 일반적인 프레임워크를 가질 수도 있습니다. 예를 들어 Weka에는 모든 분류자를 래핑하고 미스 분류에 대한 사용자 지정 페널티 매트릭스를 적용할 수 있는CostSensitiveClassifier가 있습니다.

특정 알고리즘에 고정되어 있고 다시 샘플링할 수 없거나 결과가 좋지 않은 경우 벌칙을 사용하는 것이 좋습니다. 클래스의 “균형”을 유지하는 또 다른 방법을 제공합니다. 페널티 매트릭스 설정은 복잡할 수 있습니다. 다양한 처벌 체계를 시도하고 문제에 가장 적합한 것이 무엇인지 확인해야 할 것입니다.


7) 다른 관점을 시도하십시오

불균형 데이터세트에 전념하는 연구 분야가 있습니다. 그들은 그들 자신의 알고리즘, 측정 및 용어를 가지고 있습니다.

이러한 관점에서 문제를 살펴보고 생각하면 때때로 일부 아이디어가 느슨해질 수 있습니다.

고려할 수 있는 두 가지는 변칙 검색과 변경 검색입니다.

변칙 검색은 드문 이벤트를 검색하는 것입니다. 이것은 진동을 통해 표시된 기계 오작동이거나 일련의 시스템 호출로 표시된 프로그램에 의한 악의적인 활동일 수 있습니다. 이벤트는 드물며 정상 작동과 비교할 때 발생합니다.

이러한 사고의 전환은 마이너 클래스를 이상치 클래스로 간주하여 샘플을 분리하고 분류하는 새로운 방법을 생각하는 데 도움이 될 수 있습니다.

변경 검색은 변칙을 찾는 것이 아니라 변경 또는 차이를 찾는 것을 제외하고 변칙 검색과 유사합니다. 이는 사용 패턴 또는 은행 거래에서 관찰되는 사용자 동작의 변화일 수 있습니다.

이 두 가지 변화는 분류 문제에 대해 보다 실시간으로 입장을 취하여 문제에 대한 새로운 사고 방식과 시도할 수 있는 몇 가지 기술을 제공할 수 있습니다.


8) 창의력을 발휘하십시오

실제로 문제 속으로 올라가서 더 다루기 쉬운 작은 문제로 나누는 방법에 대해 생각하십시오.

영감을 얻으려면 “분류에서 불균형 학습 세트를 어떻게 처리합니까?“라는 질문에 대한 응답으로 Quora에 대한 매우 창의적인 답변을 살펴보십시오.

예를 들어:

더 큰 클래스를 더 적은 수의 다른 클래스로 분해하십시오 …

… 하나의 클래스 분류자를 사용하십시오 … (예 : 이상값 감지처럼 처리)

… 불균형 학습 세트를 하나의 균형 잡힌 세트가 아니라 여러 세트로 리샘플링합니다. 이러한 집합에서 분류기 앙상블을 실행하면 하나의 분류자만 실행하는 것보다 훨씬 더 나은 결과를 얻을 수 있습니다.

이것들은 당신이 시도 할 수있는 흥미롭고 창의적인 아이디어 중 일부일뿐입니다.

더 많은 아이디어를 얻으려면 reddit 게시물 “내 교육 세트의 80%가 한 클래스일 때 분류“에 대한 다음 의견을 확인하십시오.


방법 선택 및 조치 취하기

불균형 데이터세트에서 정확하고 신뢰할 수 있는 모델을 구축하기 위해 알고리즘 마법사나 통계학자가 될 필요는 없습니다.

불균형 데이터세트를 모델링하는 데 사용할 수 있는 여러 기술을 다루었습니다.

예를 들어 정확도 메트릭을 변경하고 데이터세트를 다시 샘플링하는 등 선반에서 꺼내 즉시 적용할 수 있는 한두 가지가 있기를 바랍니다. 둘 다 빠르며 즉시 영향을 미칩니다.

어떤 방법을 시도하시겠습니까?


마지막 조언, 작게 시작하십시오

어떤 접근 방식이 귀하와 귀하가 작업중인 데이터세트에 가장 적합한 지 알 수 없습니다.

일부 전문가 휴리스틱을 사용하여 이 방법 또는 그 방법을 선택할 수 있지만 결국 내가 줄 수있는 최선의 조언은 “과학자가되어” 각 방법을 경험적으로 테스트하고 최상의 결과를 제공하는 방법을 선택하는 것입니다.

작게 시작하여 배운 것을 기반으로 구축하십시오.

네피리티
No Comments

Sorry, the comment form is closed at this time.