keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度

Posted

技术标签:

【中文标题】keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度【英文标题】:Different loss values and accuracies of MLP regressor in keras and scikit-learn 【发布时间】:2021-09-13 00:38:36 【问题描述】:

我有一个神经网络,其中一个隐藏层在 Keras 和 scikit-learn 中实现,用于解决回归问题。在 scikit-learn 中,我使用了具有大多数默认参数的 MLPregressor 类,在 Keras 中,我有一个隐藏的 Dense 层,其参数设置为与 scikit-learn 相同的默认值(它使用具有相同学习率和 epsilon 的 Adam,batch_size 为 200)。当我训练网络时,scikit-learn 模型的损失值约为 keras 的一半,并且其准确性(以平均绝对误差衡量)也更好。如果不相同,损失值不应该相似并且精度也相似吗?有没有人经历过类似的事情并且能够使 Keras 模型更准确?

Scikit-learn 模型:

clf = MLPRegressor(hidden_layer_sizes=(1600,), max_iter=1000, verbose=True, learning_rate_init=.001)

Keras 模型:

inputs = keras.Input(shape=(cols,))
x = keras.layers.Dense(1600, activation='relu', kernel_initializer="glorot_uniform", bias_initializer="glorot_uniform", kernel_regularizer=keras.regularizers.L2(.0001))(inputs)
outputs = keras.layers.Dense(1,kernel_initializer="glorot_uniform", bias_initializer="glorot_uniform", kernel_regularizer=keras.regularizers.L2(.0001))(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer=keras.optimizers.Adam(epsilon=1e-8, learning_rate=.001),loss="mse")
model.fit(x=X, y=y, epochs=1000, batch_size=200)

【问题讨论】:

【参考方案1】:

这是因为scikit-learn的均方损失(MSE)公式与tensorflow不同。

来自scikit-learn的源码:

def squared_loss(y_true, y_pred):
    return ((y_true - y_pred) ** 2).mean() / 2

而来自 tensorflow 的 MSE:

backend.mean(math_ops.squared_difference(y_pred, y_true), axis=-1)

如您所见,scikit-learn 一除以 2,与您所说的一致:

scikit-learn 模型的损失值约为 keras 的一半

这意味着 keras 和 scikit-learn 的模型实际上实现了相似的性能。这也意味着 scikit-learn 中的 0.001 学习率不等同于 tensorflow 中的相同学习率。

另外,另一个较小但显着的区别是 L2 正则化的公式。

来自scikit-learn的源码,

# Add L2 regularization term to loss
values = 0
for s in self.coefs_:
   s = s.ravel()
   values += np.dot(s, s)
loss += (0.5 * self.alpha) * values / n_samples

而张量流的那个是loss = l2 * reduce_sum(square(x))

因此,在 l2 正则化参数相同的情况下,张量流一的正则化更强,这将导致对训练数据的拟合更差。

【讨论】:

以上是关于keras 和 scikit-learn 中 MLP 回归器的不同损失值和准确度的主要内容,如果未能解决你的问题,请参考以下文章

关于DevOps,数据科学家需要了解这些

Keras 和 scikit-learn 的 MLP 结果完全不同

机器学习技术系列:一篇图文笔记了解机器学习基础知识

如何在交叉验证中获得 Keras scikit-learn 包装器的训练和验证损失?

Cloud ML Engine 和 Scikit-Learn:“LatentDirichletAllocation”对象没有“predict”属性

如何在 Python 中使用带有 Keras 的 scikit-learn 评估指标函数?