回答:
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を使用して不均衡なマルチクラス分類問題を処理するとき、誰もがこの質問に出くわします。私もそうしました!
私はそれを適用する方法をよりよく理解するための例を探していました。下記のリンクを見つけるためにほぼ1時間を費やしました。例を探しているすべての人のために、ここに行きます-
ありがとう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)