답변:
scale_pos_weight
언급 한대로 이진 분류에 사용됩니다. 불균형 클래스를 처리하는보다 일반적인 솔루션입니다. 값을 할당 할 때 좋은 방법 scale_pos_weight
은 다음과 같습니다.
sum(negative instances) / sum(positive instances)
특정 경우, 개별 데이터 포인트에 가중치를 부여하고 부스터로 작업하는 동안 가중치를 고려하고 각 포인트가 동일하게 표시되도록 가중치와 관련하여 최적화가 이루어 지도록하는 다른 옵션이 있습니다. 당신은 단순히 다음을 사용해야합니다 :
xgboost.DMatrix(..., weight = *weight array for individual weights*)
가중치를 원하는대로 정의 할 수 있으며 그렇게하면 클래스 내에서의 불균형뿐만 아니라 다른 클래스에서의 불균형도 처리 할 수 있습니다.
@KeremT의 대답 은 정확합니다. 나는 정확한 구현에 여전히 문제가있는 사람들을위한 예를 제공합니다.
weight
XGBoost의 매개 변수는 클래스가 아닌 인스턴스별로입니다. 따라서 각 클래스의 가중치를 인스턴스에 할당해야합니다. 이는 동일한 것입니다.
예를 들어 비율이 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
R에서 XGBoost를 사용하여 언밸런스 드 멀티 클래스 분류 문제를 다룰 때 모든 사람이이 질문을 우연히 발견합니다. 나도 그렇게했습니다!
나는 그것을 적용하는 방법을 더 잘 이해하기위한 예를 찾고있었습니다. 아래에 언급 된 링크를 찾기 위해 거의 한 시간을 투자했습니다. 예를 찾는 모든 사람들을 위해 여기에 간다-
감사합니다 wacax
열차 데이터의 각 인스턴스를 클래스 가중치로 지정하십시오. 먼저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)