언밸런스 클래스를 사용하면 유효성 검사 / 테스트 데이터 세트에서 샘플링을 사용해야합니까?


13

저는 기계 학습의 초보자이며 상황에 직면하고 있습니다. IPinYou 데이터 세트로 실시간 입찰 문제를 해결 중이며 클릭 예측을 시도하고 있습니다.

문제는 알 수 있듯이 데이터 세트의 균형이 매우 불균형하다는 것입니다. 1 긍정적 인 예 (클릭)에 대해 약 1300 개의 부정적인 예 (비 클릭).

이것이 제가하는 것입니다:

  1. 데이터로드
  2. 데이터 세트를 3 개의 데이터 세트로 분할 : A = 교육 (60 %) B = 유효성 검사 (20 %) C = 테스트 (20 %)
  3. 각 데이터 세트 (A, B, C)에 대해 5의 비율을 갖도록 각 네거티브 클래스에서 언더 샘플링을 수행합니다 (1 개의 긍정적 인 예의 경우 5 개의 부정적인 예). 이것은 더 균형 잡힌 3 개의 새로운 데이터 세트를 제공합니다 : A 'B'C '

그런 다음 데이터 세트 A '및 로지스틱 회귀로 모델을 학습시킵니다.

내 질문은 :

  1. 유효성 검사를 위해 어떤 데이터 세트를 사용해야합니까? B 또는 B '?

  2. 테스트에 어떤 데이터 세트를 사용해야합니까? C 또는 C '

  3. 내 모델을 평가하는 데 가장 적합한 측정 항목은 무엇입니까? F1Score는 잘 사용되는 지표 인 것 같습니다. 그러나 불균형 클래스 (데이터 세트 B와 C를 사용하는 경우)로 인해 정밀도가 낮고 (0.20 미만) F1Score는 리콜 / 정밀도가 낮습니다. aucPR 또는 aucROC를 사용하는 것이 더 정확합니까?

  4. 학습 곡선을 그리려면 어떤 메트릭을 사용해야합니까? (유효성을 위해 B '데이터 세트를 사용하는 경우 % error는 관련이 없음을 알고 있음)

시간 내 주셔서 감사합니다!

문안 인사.

답변:


9

좋은 질문입니다. 다음은 번호가 매겨진 질문에 대한 구체적인 답변입니다.

1)B`가 아닌 B에 대해 교차 검증해야합니다. 그렇지 않으면 클래스 밸런싱이 얼마나 잘 작동하는지 알 수 없습니다. B B` 에서 교차 유효성 검사를 해치지 않았으며 아래 4에 대한 답변을 기반으로 유용합니다.

2) 아래 4를 기준으로 C와 C` 모두에서 테스트해야합니다.

3)나는 F1을 고수하고 ROC-AUC를 사용하는 것이 유용 할 수 있으며 이것은 좋은 위생 검사를 제공합니다. 둘 다 불균형 클래스에 유용합니다.

4)정말 까다로워집니다. 이것의 문제점은 가장 좋은 방법은 학습 곡선이 어떻게 생겼는지 다시 해석하거나 재 샘플링 된 데이터 세트와 원본 데이터 세트를 모두 사용해야한다는 것입니다.

학습 곡선의 고전적인 해석은 다음과 같습니다.

  • 초과 적합 -선이 서로 겹치지 않습니다.
  • 언더 핏 -라인이 함께 나오지만 F1 점수가 너무 낮습니다.
  • 바로 -라인은 합리적인 F1 점수와 함께 제공됩니다.

이제 A에 대해 훈련하고 C에 대해 테스트하는 경우 라인이 완전히 결합되지 않습니다. A에 대해 훈련하고 C에 대해 시험하는 경우 원래 문제와 관련하여 결과가 의미가 없습니다. 그래서 당신은 무엇을합니까?

정답은 A를 훈련시키고 B를 시험하는 것뿐만 아니라 B를 시험하는 것입니다. 원하는 곳의 B`에 대한 F1 점수를 얻은 다음 B에 대한 F1 점수를 확인하십시오. 그런 다음 테스트를 수행하고 학습 곡선을 생성하십시오 곡선은 함께 나오지 않지만 F1 (B)와 F1 (B`)의 차이 인 수용 가능한 편향에 대한 감각을 갖게 될 것입니다.

이제 학습 곡선에 대한 새로운 해석은 다음과 같습니다.

  • 초과 적합 -선은 함께 나오지 않으며 F1 (B`) -F1 (B)보다 멀리 떨어져 있습니다.
  • Underfit- 선이 합쳐지지 않지만 차이는 F1 (B`) -F1 (B)보다 작고 F1 (C) 점수는 F1 (B) 미만입니다.
  • 딱 맞습니다 -선이 합쳐지지 않지만 그 차이는 F1 (B)와 유사한 F1 (C) 점수를 가진 F1 (B`) -F1 (B)보다 작습니다.

일반 : 언밸런스 클래스의 경우 위에서 설명한 모든 엄격한 도덕을 피할 수 있으므로 오버 / 언더 샘플링 대신 학습 알고리즘에서 클래스 가중치를 먼저 조정하십시오. scikit-learn과 같은 라이브러리에서는 매우 쉽고 시그 모이 드 함수 또는 과반수 투표를 사용하는 모든 것에서 핸드 코딩하기가 쉽습니다.

도움이 되었기를 바랍니다!


감사합니다 @ AN605. 정말 멋져요! 몇 가지 질문이 있습니다. 4)- "A '를 훈련시키고 B'를 시험하기 위해"라고 말할 때, 당신은 확인을 의미합니까? - "C에 대한 학습 곡선 생성"& "F1 (C) 점수가 F1 (B) 이하 / 유사" 그러나 학습 곡선의 경우 훈련 세트 (A 또는 A ')에 대한 오류 메트릭과 유효성 검사 세트 (B 또는 B')에 대한 오류 메트릭 만 플롯해야했습니다. 여기서 C를 "확인"하지 않습니까?
jmvllt

"클래스 가중치"를 사용하는 방법에 대해, 내가 틀렸다면 바로 수정하십시오 (단순히 살펴 보았습니다). 그러나이 트릭은 앞에 계수 / 무게 "k"를 추가하여 비용 함수를 "수정"하는 것입니다. 언밸런스 클래스, 맞습니까? : 􏲏 Cost (h (x), y) = -y * k * log (h (x))-(1-y) * log ((h (x)) 이와 같이 알고리즘은 오 분류를 고려해야합니다 긍정적 인 클래스의 가치를 더 중요하게 생각합니다. 그러나 모든 모델을 빌드하기 위해 Apache Spark & ​​MLlib를 "사용해야"한다는 점이 있습니다. 스파크를 사용하여 비용 함수를 쉽게 수정할 수 있는지 확신 할 수 없습니다. 시간!
jmvllt

5

들어 1)2), 당신이 원하는

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

따라서 이러한 데이터 세트의 경우 클래스 균형을 맞출 필요가 없습니다.

언더 샘플링 / 오버 샘플링 대신 클래스 가중치를 사용하여이 결정을 처리 할 수도 있습니다.

들어 3)당신은 가능성이 (가 경쟁 인 경우) 당신이 득점됩니다 메트릭 어떤 사용하여 최적화 할. 그러나 그것이 고려되지 않는다면, 모든 모델은 훌륭한 선택입니다. F1은 낮은 정밀도의 영향을받을 수 있지만이를 캡처하려고합니다. F1과 같은 점수가 관련이있는 일부 메트릭을 통해 순진한 모델 (대부분의 클래스 추측과 같은)이 정확하게 점수를 매길 수있는 시점입니다.

에 관해서는 4)당신이 최적화 결국 메트릭 중 표시와 아무것도 잘못이있다.


안녕하세요 @ jamesmf, 멋진 답변 주셔서 감사합니다. F1Score의 경우, 내가 겪고있는 문제는 False Negative보다 False Positive를 제거하는 데 더 집중하고 싶을 수 있습니다. 정밀도와 리콜 계산에서 FP와 FN에 다른 "무게"를 추가하는 것이 옳습니까?
jmvllt

그것은 나에게 의미가 있습니다. 또한 클래스 가중치에 대한 설명이 정확하며 MLib에서 구현 된 것으로 보이지 않지만 기능 요청의 가치가있을 수 있습니다.
jamesmf

알았어 고마워 제임스! 현재 LogisticGradient 클래스를 확장하고 계산 방법을 덮어 쓰면서 혼자서하려고합니다. 이것이 나에게 좋은 결과를 줄 수 있는지 알려 드리겠습니다. 좋은 하루 되세요.
jmvllt 2016

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.