XGBoostを使用した不均衡なマルチクラスデータ


19

このディストリビューションには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

6

@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

4

RでXGBoostを使用して不均衡なマルチクラス分類問題を処理するとき、誰もがこの質問に出くわします。私もそうしました!

私はそれを適用する方法をよりよく理解するための例を探していました。下記のリンクを見つけるためにほぼ1時間を費やしました。例を探しているすべての人のために、ここに行きます-

/datascience//a/9493/37156

ありがとうwacax


0

列車データの各インスタンスにクラスの重みを割り当てるだけです。最初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.