web-dev-qa-db-ja.com

簡単な方法でKerasにclass_weightを割り当てるにはどうすればよいですか?

データセットが不均衡なときにKerasでclass_weightを適用する最も簡単な方法は何ですか?

ターゲットには2つのクラスしかありません。

ありがとう。

16
Javi

fit()関数のclass_weightパラメータは、クラスを重み値にマッピングする辞書です。

Class_weight = {0:3、1:1}でフィードするよりも、クラス0の500サンプルとクラス1の1500サンプルがあるとします。これにより、クラス0はクラス1の3倍の重みになります。

train_generator.classesは、重み付けに適したクラス名を提供します。

これをプログラムで計算する場合は、scikit-learnの sklearn.utils.compute_class_weight() を使用できます。

この関数は、ラベルの分布を調べ、トレーニングセットのクラスの過少または過大に等しくペナルティを課す重みを生成します。

こちらの便利なスレッドもご覧ください: https://github.com/fchollet/keras/issues/1875

そして、このスレッドも役に立ちます: Kerasのflow_from_directoryからclass_weightを自動的に推測することは可能ですか?

19
petezurich

Sklearnキットのclass_weightを使用します。

私もこの方法を使用して不均衡データを処理します

from sklearn.utils import class_weight
class_weight = class_weight.compute_class_weight('balanced'
                                               ,np.unique(Y_train)
                                               ,Y_train)

その後、model.fit

Classifier.fit(train_X,train_Y,batch_size = 100, epochs = 10
           ,validation_data= (test_X,test_Y),class_weight = class_weight )
15
Johnny Hsieh

1-ラベルとそれに関連付けられた重みで辞書を定義します

class_weight = {0: 0.1,
                1: 1.,
                2: 2.}

2-辞書をパラメーターとしてフィードします。

model.fit(X_train, Y_train, batch_size = 100, epochs = 10, class_weight=class_weight)
1
javac

適用する適切な重み付け、またはコードでそれを行う方法について質問していますか?コードは簡単です:

class_weights = {}
    for i in range(2):
        class_weights[i] = your_weight

その後、引数class_weight=class_weightsmodel.fit

使用する適切な重み付けは、ある種の逆周波数です。少し試行錯誤することもできます。

1
Michele Tonutti

クラスの重みは辞書タイプを取ります。

from collections import Counter
itemCt = Counter(trainGen.classes)
maxCt = float(max(itemCt.values()))
cw = {clsID : maxCt/numImg for clsID, numImg in itemCt.items()}
0
Allie