Ran*_*oms 5 python neural-network keras tensorflow loss-function
我的数据存在严重的阶级失衡。约99.99%的样品为阴性。正数(大致)在其他三个类别之间平均分配。我认为我正在训练的模型基本上总是在预测多数学生。因此,我正在尝试对课程进行加权。
模型
model = Sequential()
#Layer 1
model.add(Conv1D( {{choice([32, 64, 90, 128])}}, {{choice([3, 4, 5, 6, 8])}}, activation='relu', kernel_initializer=kernel_initializer, input_shape=X_train.shape[1:]))
model.add(BatchNormalization())
#Layer 2
model.add(Conv1D({{choice([32, 64, 90, 128])}}, {{choice([3, 4, 5, 6])}}, activation='relu',kernel_initializer=kernel_initializer))
model.add(Dropout({{uniform(0, 0.9)}}))
#Flatten
model.add(Flatten())
#Output
model.add(Dense(4, activation='softmax'))
Run Code Online (Sandbox Code Playgroud)
({{...}}用于Hyperas。)
我如何尝试加权
\ 1。class_weight在中使用model.fit()
model.fit(X_train, Y_train, batch_size=64, epochs=10, verbose=2, validation_data=(X_test, Y_test), class_weight={0: 9999, 1:9999, 2: 9999, 3:1})
Run Code Online (Sandbox Code Playgroud)
\ 2。使用class_weight在model.fit()与sklearn compute_class_weight()
model.fit(..., class_weight=class_weight.compute_class_weight("balanced", np.unique(Y_train), Y_train)
Run Code Online (Sandbox Code Playgroud)
\ 3。具有自定义损失功能
from keras import backend as K
def custom_loss(weights):
#gist.github.com/wassname/ce364fddfc8a025bfab4348cf5de852d
def loss(Y_true, Y_pred):
Y_pred /= K.sum(Y_pred, axis=-1, keepdims=True)
Y_pred = K.clip(Y_pred, K.epsilon(), 1 - K.epsilon())
loss = Y_true * K.log(Y_pred) * weights
loss = -K.sum(loss, -1)
return loss
return loss
extreme_weights = np.array([9999, 9999, 9999, 1])
model.compile(loss=custom_loss(extreme_weights),
metrics=['accuracy'],
optimizer={{choice(['rmsprop', 'adam', 'sgd','Adagrad','Adadelta'])}}
)
#(then fit *without* class_weight)
Run Code Online (Sandbox Code Playgroud)
结果
较差的。所有类别的准确度均为〜.99,而所有类别的不平衡准确度均为〜.5。但是,更有意义的指标(如auPRC)却大不相同。auPRC几乎1适用于多数阶层,0其余阶层几乎适用。
Keras是如何平衡班级的?它只是确保它们之间的准确性是相同的,或者指标是否应该相等或可比?还是我指定的权重错误?
Keras 在训练期间使用类别权重,但准确性并不能反映这一点。准确度是在所有样本中计算的,与类别之间的权重无关。这是因为您在compile() 中使用了度量“准确性”。您可以定义自定义且更准确的加权精度并使用它或使用 sklearn 指标(例如 f1_score() 可以是“二进制”、“加权”等)。
例子:
def macro_f1(y_true, y_pred):
return f1_score(y_true, y_pred, average='macro')
model.compile(loss=custom_loss(extreme_weights),
metrics=['accuracy', macro_f1],
optimizer={{choice(['rmsprop', 'adam', 'sgd','Adagrad','Adadelta'])}}
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1832 次 |
| 最近记录: |