Keras中预测数据的反比例

时间:2019-06-14 10:49:10

标签: python machine-learning keras scikit-learn neural-network

我正在尝试使用NN模型来预测新数据。但是,预测数据的规模不正确(值应为1e-10时应为0.3等)

在我的模型中,我在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'])

看到我在初始训练模型上使用了缩放器,我想我也需要对新数据执行此操作。香港专业教育学院试图做     scaler.inverse_transform(ynew) 在model.predict(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。因此,做出这些预测后是否需要某种逆流水线标量? 非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的方法存在一个小问题和一个大问题。

  1. 次要:无需缩放目标变量,它不会影响优化功能。
  2. 主要问题:您将缩放器再次适合要运行预测的数据。这样,您就完全偏离了数据中存在的关系,因此预测输出的比例非常不同。另外,您定义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的新数据。