python - santa - ¿Cómo maneja Keras la clasificación multicabel?
santa not santa keras (1)
En breve
No uses
softmax
.
Use
sigmoid
para la activación de su capa de salida.
Use
binary_crossentropy
para la función de pérdida.
Utilice
predict
para la evaluación.
Por qué
En
softmax
al aumentar la puntuación para una etiqueta, todas las demás se reducen (es una distribución de probabilidad).
No quieres eso cuando tienes varias etiquetas.
Código completo
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
No estoy seguro de cómo interpretar el comportamiento predeterminado de Keras en la siguiente situación:
Mi Y (verdad básica) se configuró utilizando el
MultilabelBinarizer
() de scikit-learn.
Por lo tanto, para dar un ejemplo aleatorio, una fila de mi columna
y
está codificada en caliente como tal:
[0,0,0,1,0,1,0,0,0,0,1]
.
Entonces tengo 11 clases que podrían predecirse, y más de una puede ser cierta; De ahí la naturaleza multicabel del problema. Hay tres etiquetas para esta muestra en particular.
Entreno el modelo como lo haría para un problema que no es de múltiples capas (negocios como siempre) y no obtengo errores.
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
¿Qué hace Keras cuando se encuentra con mi
y_train
y ve que está codificado en caliente "multi", lo que significa que hay más de un ''uno'' presente en cada fila de
y_train
?
Básicamente, ¿Keras realiza automáticamente la clasificación de múltiples etiquetas?
¿Alguna diferencia en la interpretación de las métricas de puntuación?