[更新:下面由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看起来很好,但我不确定为什么我的结果如此遥远
你有一个问题,无法衡量你的预测;你首先在这里做:
然后在构建数据帧时再次执行此操作:
不太确定其影响,但这是一个错误。这也是一个很好的例子,说明了为什么在转换变量后使用相同的名称不是一个好主意(突然,您不确定
prediction
是否是反向缩放的)通常,您应该为功能和标签使用两个单独的定标器:
这似乎不是问题,但这似乎是巧合,因为您使用相关命令的顺序;它需要关注
还要记住的一点是,在类似情况下,Keras返回的MSE实际上是一个标度MSE。要获得预测的“真实”MSE,您应该这样做
前提是
Y
这里是您的初始未标度目标更多信息,请参见How to interpret MSE in Keras Regressor中的自己的答案
相关问题 更多 >
编程相关推荐