Keras中的回归具有较低的MSE,但结果相差甚远

2024-10-03 02:43:55 发布

您现在位置:Python中文网/ 问答频道 /正文

[更新:下面由desertnaut给出的答案发现了一个编码错误(双重取消了我的预测,导致它们成为~^{),但即使纠正了这一点,我的问题仍然存在。]


我正在努力理解我的错误在哪里。我在玩机器学习如何更好地做回归,但我无法成功地做一个简单的回归,因为我的结果太差了

我取了3个财务变量,用其中的2个来计算一个新的列,然后试着看看我的模型是否可以预测我创建的列。我想这很容易,因为我要取两个变量,然后减去它们。我的MSE分数很低,这看起来很有希望,但当我看我的实际成绩时,他们却相去甚远

以下是我的结果(请注意,我是根据收益总成本计算grossProfit1的。预测栏是我的预测,正如您所看到的,这与我的预测相去甚远):

     grossProfit1  totalRevenue Exchange  costOfRevenue    prediction
0    9.839200e+10  2.601740e+11   NASDAQ   1.617820e+11  1.115318e+11
1    9.839200e+10  2.601740e+11   NASDAQ   1.617820e+11  1.115318e+11
2    1.018390e+11  2.655950e+11   NASDAQ   1.637560e+11  1.137465e+11
3    1.018390e+11  2.655950e+11   NASDAQ   1.637560e+11  1.137465e+11
4    8.818600e+10  2.292340e+11   NASDAQ   1.410480e+11  9.953879e+10
..            ...           ...      ...            ...           ...
186  4.224500e+10  9.113400e+10     NYSE   4.888900e+10  4.286892e+10
187  4.078900e+10  9.629300e+10     NYSE   5.550400e+10  4.505001e+10
188  3.748200e+10  8.913100e+10     NYSE   5.164900e+10  4.277003e+10
189  3.397500e+10  8.118600e+10     NYSE   4.721100e+10  4.012077e+10
190  3.597700e+10  8.586600e+10     NYSE   4.988900e+10  4.168953e+10

以下是我的简化代码(清理了变量名,对其进行了更多注释,等等),根据下面的@desertnaut答案,基于双反比例进行了更新:

#data
#create grossProfit column, to predict
df['grossProfit1'] = df['totalRevenue'] - df['costOfRevenue'] 
variableToPredict = ['grossProfit1']
#all columns we are using - grossProfit1 is what we will predict, and it's created simply from substracting totalRevenue from costOfRevenue. Exchange is just there for see if neural can ignore it.
df2=df[['grossProfit1','totalRevenue','Exchange', 'costOfRevenue']]
#I process this data frame, remove duplicates, drop variable to predict,etc.

#create the dataset for prediction
X_train=df2
X_train = X_train.drop(columns=variableToPredict) 
#add data for features 
y_train=df2[variableToPredict]

#check to see if there is any catergories
catergoryEncoder = OrdinalEncoder()
columnsObjects = list(cleanData.select_dtypes(include=['object']).columns) 
if len(columnsObjects) != 0:
    X_train[columnsObjects] = catergoryEncoder.fit_transform(X_train[columnsObjects])

#scale the data
scaler_X = MinMaxScaler()
scaler_Y = MinMaxScaler()
Xscaled = scaler_X.fit_transform(X_train)
unscaled = scaler_X.inverse_transform(Xscaled)
Yscaled = scaler_Y.fit_transform(y_train)

#run simple model for prediction:
model = tf.keras.Sequential() #using tensorflow keras
model.add(layers.Dense(64, activation='relu', input_shape=(numInputColumns,)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['MSE'])
model.fit(Xscaled,Yscaled,epochs=10,validation_split=0.2)

# this is the result - seems good with low MSE.
# Epoch 10/10
# 152/152 [==============================] - 0s 174us/sample - loss: 0.0075 - MSE: 0.0075 - val_loss: 0.0076 - val_MSE: 0.0076

#do the predictions on previous data
prediction = model.predict(Xscaled)
# prediction = scaler.inverse_transform(prediction)  # REMOVED after desertnaut's answer below

#join all the data together
new_data_frame=pd.DataFrame(df2) 
new_data_frame['prediction'] = (scaler_Y.inverse_transform(np.asarray(prediction)))
print(new_data_frame)

这种回归我做错了什么?在其他教程中,效果很好(波士顿房价、每加仑英里数回归教程)。我被建议用于回归问题,MSE是一个比准确度更好的指标(对于分类问题更好),MSE看起来很好,但我不确定为什么我的结果如此遥远


Tags: theadddatamodeltransformtrainpredictprediction
1条回答
网友
1楼 · 发布于 2024-10-03 02:43:55

你有一个问题,无法衡量你的预测;你首先在这里做:

#do the predictions on previous data
prediction = model.predict(Xscaled)
prediction = scaler.inverse_transform(prediction) 

然后在构建数据帧时再次执行此操作:

new_data_frame=pd.DataFrame(df2) 
new_data_frame['prediction'] = (scaler.inverse_transform(np.asarray(prediction)))

不太确定其影响,但这是一个错误。这也是一个很好的例子,说明了为什么在转换变量后使用相同的名称不是一个好主意(突然,您不确定prediction是否是反向缩放的)

通常,您应该为功能和标签使用两个单独的定标器:

#scale the data
scaler_X = MinMaxScaler()
Xscaled = scaler_X.fit_transform(X_train)
scaler_Y = MinMaxScaler()
Yscaled = scaler_Y.fit_transform(y_train)

这似乎不是问题,但这似乎是巧合,因为您使用相关命令的顺序;它需要关注

还要记住的一点是,在类似情况下,Keras返回的MSE实际上是一个标度MSE。要获得预测的“真实”MSE,您应该这样做

y_pred_scaled = model.predict(Xscaled)
from sklearn.metrics import mean_squared_error
MSE_true = mean_squared_error(Y, scaler_Y.inverse_transform(y_pred_scaled)) 

前提是Y这里是您的初始未标度目标

更多信息,请参见How to interpret MSE in Keras Regressor中的自己的答案

相关问题 更多 >