XGBoost를 통한 불평형 멀티 클래스 데이터


20

이 배포판에는 3 개의 수업이 있습니다.

Class 0: 0.1169
Class 1: 0.7668
Class 2: 0.1163

그리고 xgboost분류에 사용 하고 있습니다. 라는 매개 변수가 있음을 알고 scale_pos_weight있습니다.

그러나 '멀티 클래스'의 경우 어떻게 처리되며 어떻게 올바르게 설정할 수 있습니까?

답변:


18

scale_pos_weight언급 한대로 이진 분류에 사용됩니다. 불균형 클래스를 처리하는보다 일반적인 솔루션입니다. 값을 할당 할 때 좋은 방법 scale_pos_weight은 다음과 같습니다.

sum(negative instances) / sum(positive instances)

특정 경우, 개별 데이터 포인트에 가중치를 부여하고 부스터로 작업하는 동안 가중치를 고려하고 각 포인트가 동일하게 표시되도록 가중치와 관련하여 최적화가 이루어 지도록하는 다른 옵션이 있습니다. 당신은 단순히 다음을 사용해야합니다 :

xgboost.DMatrix(..., weight = *weight array for individual weights*)

가중치를 원하는대로 정의 할 수 있으며 그렇게하면 클래스 내에서의 불균형뿐만 아니라 다른 클래스에서의 불균형도 처리 할 수 ​​있습니다.


> scale_pos_weight에 값을 할당 할 때 좋은 방법은 다음과 같습니다. sum (음수 인스턴스) / sum (양수 인스턴스)
lcrmorin

1
나는 어디에서나이 조언을보고 덜 대표되는 클래스에 더 큰 가중치를 부여하는 것이 합리적이다. 그러나 나는이 정확한 가치를 논의하는 출처를 찾는 데 어려움을 겪고 있습니다. 나는 그 특정 가치에 대한 직관을 얻습니다 (샘플을 균형 잡게하십시오). 어딘가에 분산 균형이 있다고 생각합니다.
lcrmorin

7

@KeremT의 대답 은 정확합니다. 나는 정확한 구현에 여전히 문제가있는 사람들을위한 예를 제공합니다.

weightXGBoost의 매개 변수는 클래스가 아닌 인스턴스별로입니다. 따라서 각 클래스의 가중치를 인스턴스에 할당해야합니다. 이는 동일한 것입니다.

예를 들어 비율이 3 개인 불균형 클래스가있는 경우

class A = 10%
class B = 30%
class C = 60%

그들의 무게는 (가장 작은 클래스를 다른 사람들로 나눔)

class A = 1.000
class B = 0.333
class C = 0.167

그런 다음 훈련 데이터가

index   class
0       A
1       A
2       B
3       C
4       B

weight다음과 같이 벡터를 만듭니다 .

index   class    weight
0       A        1.000
1       A        1.000
2       B        0.333
3       C        0.167
4       B        0.333

5

R에서 XGBoost를 사용하여 언밸런스 드 멀티 클래스 분류 문제를 다룰 때 모든 사람이이 질문을 우연히 발견합니다. 나도 그렇게했습니다!

나는 그것을 적용하는 방법을 더 잘 이해하기위한 예를 찾고있었습니다. 아래에 언급 된 링크를 찾기 위해 거의 한 시간을 투자했습니다. 예를 찾는 모든 사람들을 위해 여기에 간다-

/datascience//a/9493/37156

감사합니다 wacax


1

열차 데이터의 각 인스턴스를 클래스 가중치로 지정하십시오. 먼저class_weight.compute_class_weight sklearn으로 얻은 다음 열차 데이터의 각 행에 적절한 가중치를 할당하십시오.

여기서 열차 데이터에는 클래스 번호가 포함 된 'class'열이 있다고 가정합니다. 또한 1에서 nb_classes의 nb_classes가 있다고 가정했습니다.

from sklearn.utils import class_weight
class_weights = list(class_weight.compute_class_weight('balanced',
                                             np.unique(train['class']),
                                             train['class']))

w_array = np.ones(y_train.shape[0], dtype = 'float')
for i, val in enumerate(y_train):
    w_array[i] = class_weights[val-1]

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