【问题标题】:How to use a custom loss function in a Neural Network with MLPClassifier Sklearn?如何在具有 MLPClassifier Sklearn 的神经网络中使用自定义损失函数?
【发布时间】:2019-05-01 02:06:19
【问题描述】:

我想使用自定义损失函数在 scikit learn 中训练神经网络;使用 MLPClassifier。我想更加重视更大的价值。因此,我想使用诸如均方误差之类的东西,但将分子乘以 y。因此,它看起来像:

1/n∑y(yi-y(hat)i)^2

这是我的模型的代码:

mlp10 = MLPClassifier(hidden_layer_sizes=(150,100,50,25,10), max_iter=1000, 
random_state=42)
mlp10.fit(X_train, y_train)

如何修改损失函数?

【问题讨论】:

  • 使用 MSE 进行分类通常被认为是一个坏主意,这就是 MLPClassifier 使用交叉熵的原因。
  • 我的数据集包含许多较小的值(0、0.5、1、1.5)和较少的较大值(>8)。我想正确预测那些更大的值。如果模型预测为 5,而每个示例的实际值为 0 或 2,我不介意,但是,如果模型预测为 2,而实际值为 14,则成本非常高。因此,我在考虑修改损失函数,但可能有更好的方法。

标签: python scikit-learn neural-network loss-function


【解决方案1】:

我不相信您可以直接修改损失函数,因为在分类器的构造中没有参数,documentation 明确指定它正在使用对数损失函数进行优化。如果您愿意灵活一点,您可能只需在训练前对y 值进行转换,然后使用逆变换恢复预测的ys 即可获得您正在寻找的效果测试后。

例如,将y_prime = transform(y)y = inverse_transform(y_prime) 映射到您将transforminverse_transform 定义为的每个值上:

def transform(y):
    return y ** 2

def inverse_transform(y_prime):
    return math.sqrt(y_prime)

会导致较大的y 值对训练产生更大的影响。显然,您可以尝试不同的转换来查看最适合您的用例的转换。关键是要确保transform 是超线性的。

在训练之前你需要做的事情:

y_train = map(transform, y_train)

在拨打predict之后:

y_predict = model.predict(x)
y_predict = map(inverse_transform, y_predict)

【讨论】:

  • 我无法训练。我有一条错误消息:“单例数组数组(, dtype=object)不能被视为有效集合。”我对地图不熟悉......但是在做了y_train = map(transform, y_train)之后。如果我打印 y_train,我会获得 _ _ ,
  • 啊,map 返回的内容是 python 2/3 的差异。尝试 np.array(map(transform, y_train)) 代替
  • 使用map(transform与简单使用np.power(target,2)相比有什么优势吗? target 只是一个包含我的 y 的 df,
  • 这也应该可以。然后在预测上使用np.power(target, 0.5)
  • 如果不是用1/n∑y(yi-y(hat)i)^2 训练我的神经网络,我只是用我的正常训练神经网络的预测和真实的 y 来计算它。然后,目标将是比较不同的模型,并且该指标具有较小值的模型将能够更好地预测较高值的模型。这样做合乎逻辑吗?
猜你喜欢
  • 2019-05-17
  • 2014-04-20
  • 2020-08-06
  • 2016-12-04
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2022-01-16
相关资源
最近更新 更多