我有一个模型,它有5个输入特性,输入看起来像这样:
- 500.0 -- 499.752 -- 499.813 -- 0.061 -- -0.016 -
- 499.91 -- 499.763 -- 499.828 -- 0.064 -- 0.005 -
- 499.83 -- 499.768 -- 499.828 -- 0.06 -- 0.021 -
- 499.91 -- 499.779 -- 499.841 -- 0.062 -- 0.035 -
- 499.95 -- 499.792 -- 499.858 -- 0.066 -- 0.045 -
- 500.0 -- 499.807 -- 499.879 -- 0.073 -- 0.054 -
- 500.0 -- 499.821 -- 499.898 -- 0.077 -- 0.06 -
- 500.0 -- 499.834 -- 499.914 -- 0.079 -- 0.065 -
- 500.0 -- 499.847 -- 499.927 -- 0.08 -- 0.069 -
- 499.96 -- 499.855 -- 499.932 -- 0.077 -- 0.071 -
- 500.0 -- 499.866 -- 499.943 -- 0.077 -- 0.072 -
- 500.0 -- 499.876 -- 499.951 -- 0.076 -- 0.074 -
- 500.0 -- 499.885 -- 499.959 -- 0.074 -- 0.075 -
- 500.0 -- 499.894 -- 499.965 -- 0.072 -- 0.076 -
- 499.99 -- 499.901 -- 499.969 -- 0.068 -- 0.075 -
如您所见,特征1、2和3在500附近移动,特征4和5在0附近移动。我有一个单一的MSE损失函数,它使模型预测所有特征的相似数量。
一个例子:
Should have predicted:
- 500.0 -- 499.866 -- 499.943 -- 0.077 -- 0.072 -
But predicted:
- 34.875 -- 22.658 -- 42.792 -- -4.824 -- -24.389 -
你可以看到它是如何试图产生所有相似的数字的。当模型变得更准确但损失更大时,你也可以在训练中看到这一点。
我正在寻找的是一种方法,可以对特征1、2和3进行单独的MSE损失,然后对4和5进行另一种损失,这样模型实际上可以在特定于特征的范围内输出。
我还考虑过将功能4和5缩放到与1、2和3相同的范围,但我不知道这是否也能起作用。
如果还有其他可能的解决方案,请分享。谢谢
不管上面的问题如何,你确定你的模型实现是正确的吗
然而,对于您的情况,我认为最好使用Min-Max scaler
,它将所有特征的值缩放到0和1之间(默认情况下(,然后应用模型并比较结果。
我将在@Meysam的回答中添加scikit learn中的MinMaxScaller具有inverse_transform
函数,该函数允许再现初始值。
例如,您可能有:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(Y)
(... training here ...)
Y_pred = model.predict(X_test)
你的预测模型显然会被缩放,所以如果你想在初始缩放时获得值,你应该使用相同的缩放器:
Y_pred_original_scaling = scaler.inverse_transform(Y_pred)