불균형 데이터 세트에 대해 xgboost에서 scale_pos_weight의 올바른 사용법은 무엇입니까?


26

매우 불균형 한 데이터 집합이 있습니다. 튜닝 조언 을 따르고 사용 scale_pos_weight하려고하지만 어떻게 튜닝 해야하는지 잘 모르겠습니다.

나는 그것을 볼 수 있습니다 RegLossObj.GetGradient:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

양성 샘플의 기울기가 더 영향을 미칩니다. 그러나 xgboost paper 에 따르면 그라디언트 통계는 항상 특정 트리의 특정 노드 인스턴스 내에서 로컬로 사용 됩니다 .

  1. 노드의 컨텍스트 내에서 후보 분할의 손실 감소를 평가
  2. 리프 노드의 컨텍스트 내에서 해당 노드에 주어진 가중치를 최적화

따라서 좋은 점을 미리 알 수있는 방법이 없습니다 scale_pos_weight. 긍정적 인 인스턴스와 부정적인 인스턴스 사이의 비율이 1 : 100 인 노드와 1 : 2 비율의 노드의 경우에는 매우 다릅니다.

힌트가 있습니까?


아마도 5 회 5 회 반복하여 CV의 매개 변수를 조정할 수 있습니다. 그러나 그렇게하려면 코드를 작성해야 할 수도 있습니다.
user2149631

답변:


22

일반적으로 Scale_pos_weight는 음수 클래스 대 양수 클래스의 비율입니다. 데이터 집합에 음수 클래스에 대한 90 개의 관측치와 양수 클래스에 대한 10 개의 관측치가 있다고 가정하면 scale_pos_Weight의 이상적인 값은 9 여야합니다. 다음 링크를 확인할 수 있습니다. http://xgboost.readthedocs.io/en/latest/parameter.html


1
멀티 클래스 데이터 세트에 어떻게 적용됩니까? 28 수업은 어떻습니까? 그것은 분명하지 않습니다
Gabriel Ziegler

1
@Gabriel 나는 그것이 클래스 웨이트를 사용하는 것이 낫다고 믿는다. 한 대 휴식 방법을 사용하여 scale_pos_weight를 사용할 수 있습니다. 예를 들어 28 개의 클래스에 대한 인형을 만듭니다. 그런 다음 각각을 이진 분류 문제로 사용할 수 있습니다. 그렇게하면 28 가지 모델을 처리하게됩니다.
Harshit Mehta

알지만 onevsrest를 사용할 때 분류자가 다중 레이블 출력도 제공하지 않습니다. 28의뿐만 아니라 하나의 클래스의 아웃
가브리엘 지글러

어떻게?. 예를 들어 : 클래스는 A, B, C입니다. 따라서 (A / Not A) 분류를위한 이진 분류기를 가질 수 있습니다. 또 다른 분류기는 (B / Not B)입니다. 'n'개의 클래스에 대해이 작업을 수행 할 수 있습니다. 그런 다음 각 분류 자에 해당하는 모든 확률 중에서 클래스를 할당하는 방법을 찾아야합니다.
Harshit Mehta

나는 멀티 라벨에 onevsrest를 사용하는 데 익숙하지만 시도해 볼 것입니다! 감사!
가브리엘 지글러

3

모든 문서는 다음과 같아야한다고 말합니다.

scale_pos_weight = count(negative examples)/count(Positive examples)

실제로는 꽤 잘 작동하지만 데이터 세트의 균형이 매우 불균형 인 경우보다 보수적 인 것을 사용하는 것이 좋습니다.

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

이것은 긍정적 인 예의 곱셈의 효과를 매우 높은 가중치로 제한하는 데 유용합니다.


1

귀하의 질문과 좌절을 이해하지만 이것이 분석적으로 계산 될 수있는 것이 확실하지 않습니다. 대부분의 하이퍼 매개 변수에서와 같이 교차 검증을 @ user2149631로 사용하여 데이터에 대해 좋은 설정을 경험적으로 결정해야합니다 제안했다. Xgboost와 함께 SelectFPR 및 sklearn API를 사용하여 기능 선택을 통해 XGBoost에 대한 FPR을 낮추고 scale_pos_weight를 0과 1.0 사이에서 추가로 조정했습니다. O.9는 데이터에 따라 YMMV와 같이 잘 작동하는 것처럼 보입니다. 문서를 살펴보면 XGboost에 보낼 때 각 데이터 포인트에 개별적으로 가중치를 지정할 수도 있습니다. sklearn 래퍼가 아닌 API를 사용해야합니다. 이렇게하면 한 세트의 데이터 포인트를 다른 세트보다 훨씬 높게 가중치를 적용 할 수 있으며 사용하는 부스팅 알고리즘에 영향을줍니다.


0

나는 또한이 딜레마에 걸려 최고의 해결책을 찾고있었습니다. 그러나 분류기에 가장 적합한 매개 변수 조정을 위해 Grid Search (Sklearn의 GridSearchCV)와 같은 방법을 사용하는 것이 좋습니다. 그러나 데이터 집합의 불균형이 높으면 샘플링 방법 (특히 랜덤 오버 샘플링 및 SMOTE 오버 샘플링 방법)을 고려하고 양수 및 음수 클래스 비율이 다른 데이터 샘플에서 앙상블을 모델링하는 것이 좋습니다. 다음은 불균형 데이터 세트 처리에 대한 훌륭하고 유용한 (거의 포괄적 인) 자습서입니다.

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

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