次の状況でKerasのデフォルトの動作を解釈する方法がわかりません。
私のY(グラウンドトゥルース)はscikit-learnのMultilabelBinarizer
()を使用して設定されました。
したがって、ランダムな例を挙げると、私のy
列の1行は、[0,0,0,1,0,1,0,0,0,0,1]
のようにワンホットエンコードされます。
したがって、予測できるクラスは11個あり、複数のクラスが当てはまる場合があります。したがって、問題のマルチラベルの性質。この特定のサンプルには3つのラベルがあります。
非マルチラベル問題(通常のビジネス)の場合と同じようにモデルをトレーニングしますが、エラーは発生しません。
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy',])
model.fit(X_train, y_train,epochs=5,batch_size=2000)
score = model.evaluate(X_test, y_test, batch_size=2000)
score
Kerasは、私のy_train
に遭遇し、それが「マルチ」ワンホットエンコードされていること、つまりy_train
の各行に複数の「1」が存在することを確認するとどうなりますか?基本的に、Kerasはマルチラベル分類を自動的に実行しますか?スコア測定基準の解釈に違いはありますか?
softmax
を使用しないでください。
出力レイヤーのアクティブ化にはsigmoid
を使用します。
損失関数にはbinary_crossentropy
を使用します。
評価にはpredict
を使用します。
softmax
では、1つのラベルのスコアを上げると、他のすべてのラベルが下がります(確率分布です)。複数のラベルがある場合は、これは望ましくありません。
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(5000, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.1))
model.add(Dense(600, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(y_train.shape[1], activation='sigmoid'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy',
optimizer=sgd)
model.fit(X_train, y_train, epochs=5, batch_size=2000)
preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
# score = compare preds and y_test