データセットが不均衡なときにKerasでclass_weight
を適用する最も簡単な方法は何ですか?
ターゲットには2つのクラスしかありません。
ありがとう。
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を自動的に推測することは可能ですか?
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 )
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)
適用する適切な重み付け、またはコードでそれを行う方法について質問していますか?コードは簡単です:
class_weights = {}
for i in range(2):
class_weights[i] = your_weight
その後、引数class_weight=class_weights
model.fit
。
使用する適切な重み付けは、ある種の逆周波数です。少し試行錯誤することもできます。
クラスの重みは辞書タイプを取ります。
from collections import Counter
itemCt = Counter(trainGen.classes)
maxCt = float(max(itemCt.values()))
cw = {clsID : maxCt/numImg for clsID, numImg in itemCt.items()}