【发布时间】:2021-09-08 13:14:25
【问题描述】:
我正在使用 Keras 顺序模型,预测输出的形状为 (1, 5)(5 个特征)。
我有一个准确度指标定义如下:
对于 N 个预测,模型的准确度将是预测样本的百分比,使得:对于每个预测及其各自的真实标签,所有特征的差异不超过 10。
例如,如果 y_i = [1, 2, 3, 4, 5] 和 ypred_i = [1, 2, 3, 4, 16] 不匹配,因为最后一个特征的差异为 11。如果 y_i = [1, 2, 3, 4, 5] 和 ypred_i = [10, 8, 0, 5, 7] 是匹配的,因为所有特征与其各自的差异不超过 10真实的特征。
我想知道在我的 Keras 序列模型中使用哪个损失函数来最大程度地提高解释的准确性。我应该定义一个自定义损失函数,它应该是什么样子,或者我应该如何进行?
我的代码是:
class NeuralNetMulti(Regressor):
def __init__(self):
self.name = 'keras-sequential'
self.model = Sequential()
# self.earlystopping = callbacks.EarlyStopping(monitor="mae",
# mode="min", patience=5,
# restore_best_weights=True)
def fit(self, X, y):
print('Fitting into the neural net...')
n_inputs = X.shape[1]
n_outputs = y.shape[1]
self.model.add(Dense(400, input_dim=n_inputs, kernel_initializer='he_uniform', activation='relu'))
# self.model.add(Dense(20, activation='relu'))
self.model.add(Dense(200, activation='relu'))
# self.model.add(Dense(10, activation='relu'))
self.model.add(Dense(n_outputs))
self.model.summary()
self.model.compile(loss='mae', optimizer='adam', metrics=['mse', 'mae', 'accuracy'])
history = self.model.fit(X, y, verbose=1, epochs=200, validation_split=0.1)
# self.model.fit(X, y, verbose=1, epochs=1000, callbacks=[self.earlystopping])
print('Fitting completed!')
def predict(self, X):
print('Predicting...')
predictions = self.model.predict(X, verbose=1)
print('Predicted!')
return predictions
我对损失函数的建议:
def N_distance(y_true, y_pred):
score = 0
vals = abs(y_true - y_pred)
if all(a <= 10 for a in vals):
return 0
return 1
返回:
-
0如果条件成立 -
1否则。
【问题讨论】:
-
请注意,使用当前方法(使用 mae 函数),我可以达到 55% 的准确度(55% 的样本符合上述条件)。但是我得到的rmse好像是7.5,非常不错,考虑到输出特征范围从0到100,感觉只需要使用更合适的损失函数即可。
-
如果你推荐一个方法,我会使用它并运行它,看看它的执行情况。
-
尝试使用阈值为 10 的
Huber loss可能会有所帮助。tensorflow.org/api_docs/python/tf/keras/losses/Huber -
所以设置 self.model.compile(loss=tf.keras.losses.Huber(delta=10), optimizer='adam', metrics=['mse', 'mae', 'accuracy ']) ?
-
我认为 Huber 损失与您的目标相反。 Huber 损失对异常值不太敏感,因为它返回二次损失,对于低于阈值的误差,但对于异常值是线性的。如果你对异常值比较敏感(10 以上),可以从 huber loss 中获取灵感,反向实现。
标签: python tensorflow keras neural-network loss-function