python - Keras 中预测数据的反比例
问题描述
我试图使用 NN 模型来预测新数据。然而,预测数据的比例不正确(当它应该是 0.3 时,得到的值是 1e-10 等)。
在我的模型中,我在 x 和 y 数据上使用了 minmaxscaler。使用测试列车拆分方法时,该模型给我的 R2 值为 0.9,使用管道方法和交叉验证方法时,MSE 为 0.01%。所以我相信我创建的模型是好的。
这是我制作的模型。
data=pd.read_csv(r'''F:\DataforANNfromIESFebAugPowerValues.csv''')
data.dropna(axis=0,how='all')
x=data[['Dry-bulb_temperature_C','Wind_speed_m/s','Cloud_cover_oktas','External_relative_humidity_%','Starrag1250','StarragEcospeed2538','StarragS191','StarragLX051','DoosanCNC6700','MakinoG7','HermleC52MT','WFL_Millturn','Hofler1350','MoriNT4250','MoriNT5400','NMV8000','MoriNT6600','MoriNVL1350','HermleC42','CFV550','MoriDura635','DMGUltrasonic10']]
y=data[['Process_heat_output_waste_kW','Heating_plant_sensible_load_kW','Cooling_plant_sensible_load_kW','Relative_humidity_%','Air_temperature_C','Total_electricity_kW','Chillers_energy_kW','Boilers_energy_kW']]
epochs=150
learning_rate=0.001
decay_rate=learning_rate/epochs
optimiser=keras.optimizers.Nadam(lr=learning_rate, schedule_decay=decay_rate)
def create_model():
model=Sequential()
model.add(Dense(21, input_dim=22, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(19, activation='relu')) #hidden layer 2
model.add(Dropout(0.2))
model.add(Dense(8, activation='sigmoid')) #output layer
model.compile(loss='mean_squared_error', optimizer=optimiser,metrics=['accuracy','mse'])
return model
scaler=MinMaxScaler()
x=MinMaxScaler().fit_transform(x)
print(x)
y=MinMaxScaler().fit_transform(y)
model=KerasRegressor(build_fn=create_model, verbose=0,epochs=150, batch_size=70)
model.fit(x, y, epochs=150, batch_size=70)
##SET UP NEW DATA FOR PREDICTIONS
xnewdata=pd.read_csv(r'''F:\newdatapowervalues.csv''')
xnewdata.dropna(axis=0,how='all')
xnew=xnewdata[['Dry-bulb_temperature_C','Wind_speed_m/s','Cloud_cover_oktas','External_relative_humidity_%','Starrag1250','StarragEcospeed2538','StarragS191','StarragLX051','DoosanCNC6700','MakinoG7','HermleC52MT','WFL_Millturn','Hofler1350','MoriNT4250','MoriNT5400','NMV8000','MoriNT6600','MoriNVL1350','HermleC42','CFV550','MoriDura635','DMGUltrasonic10']]
xnew=MinMaxScaler().fit_transform(xnew)
ynew=model.predict(xnew)
ynewdata=pd.DataFrame(data=ynew)
ynewdata.to_csv(r'''F:\KerasIESPowerYPredict.csv''',header=['Process_heat_output_waste_kW','Heating_plant_sensible_load_kW','Cooling_plant_sensible_load_kW','Relative_humidity_%','Air_temperature_C','Total_electricity_kW','Chillers_energy_kW','Boilers_energy_kW'])
看到我在初始训练模型上使用了缩放器,我想我也需要对新数据执行此操作。我试过在 model.predict(ynew) 之后做 scaler.inverse_transform(ynew) 但是我得到了 minmaxscaler 实例不适合 y 的错误。因此,我尝试使用管道方法。
estimators = []
estimators.append(('standardize', MinMaxScaler()))
estimators.append(('mlp', KerasRegressor(build_fn=create_model, epochs=150, batch_size=70, verbose=0)))
pipeline = Pipeline(estimators)
pipeline.fit(x,y)
对于初始训练模型,而不是
x=MinMaxScaler().fit_transform(x)
y=MinMaxScaler().fit_transform(y)
model=KerasRegressor(build_fn=create_model, verbose=0,epochs=150, batch_size=70)
model.fit(x, y, epochs=150, batch_size=70)
然后我使用了 ynew=pipeline.predict(xnew) 但这给了我主要由 1 组成的数据!
关于如何正确预测这些新数据的任何想法?我不确定要缩放哪些数据,哪些不是,因为我相信使用 pipeline.predict 将包括缩放 x 和 y。因此,在做出这些预测之后,我是否需要某种逆流水线标量?非常感谢您的帮助。
解决方案
你的方法有一个小问题和一个大问题。
- 次要一:无需缩放目标变量,它不会影响您的优化功能。
- 主要问题:您再次将缩放器安装在要运行预测的数据上。通过这样做,您完全扭曲了数据中的关系,因此预测的输出具有非常不同的规模。此外,您定义
scaler
并稍后不使用它。让我们修复它。
(...)
scaler=MinMaxScaler()
x=scaler.fit_transform(x)
model=KerasRegressor(build_fn=create_model, verbose=0,epochs=150, batch_size=70)
model.fit(x, y, epochs=150, batch_size=70)
##SET UP NEW DATA FOR PREDICTIONS
xnewdata=pd.read_csv(r'''F:\newdatapowervalues.csv''')
xnewdata.dropna(axis=0,how='all')
xnew=xnewdata[['Dry-bulb_temperature_C','Wind_speed_m/s','Cloud_cover_oktas','External_relative_humidity_%','Starrag1250','StarragEcospeed2538','StarragS191','StarragLX051','DoosanCNC6700','MakinoG7','HermleC52MT','WFL_Millturn','Hofler1350','MoriNT4250','MoriNT5400','NMV8000','MoriNT6600','MoriNVL1350','HermleC42','CFV550','MoriDura635','DMGUltrasonic10']]
xnew=scaler.transform(xnew)
ynew=model.predict(xnew)
ynewdata=pd.DataFrame(data=ynew)
如您所见,我们使用第scaler
一个来学习正确的规范化因子,然后transform
在我们运行的新数据上使用它( )predict
。
推荐阅读
- c++ - 我可以从构造函数中传递成员函数指针吗?
- masstransit - 无法通过 SSL 使用 MassTransit 连接到 AmazonMQ
- node.js - 我下载了更新版本的 Jest,现在我的反应应用程序无法打开
- python - 阻止 py.exe 打开新的控制台窗口
- shell - 詹金斯管道找不到shell文件
- python - Pandas 数据框到 JSON 层次结构
- excel - 计数范围的总和是否满足条件
- vue.js - Vuejs beforeRouteEnter 没有收到数据。不明确的
- python - 无法从网页中抓取所有评论
- r - 应用多个类别进行预测时出现 Keras 错误