Python Keras中预测数据的逆比例

Python Keras中预测数据的逆比例,python,machine-learning,keras,scikit-learn,neural-network,Python,Machine Learning,Keras,Scikit Learn,Neural Network,我试图用一个神经网络模型来预测新的数据。然而,预测数据的刻度不正确(当其应为0.3等时,从1e-10获得的值) 在我的模型中,我对x和y数据使用了minmaxscaler。当使用试验列车分割法时,模型给我的R2值为0.9,使用管道法和交叉val法时,模型给我的MSE值为0.01%。所以我相信我创建的模型是可以的 这是我做的模型 data=pd.read_csv(r'''F:\DataforANNfromIESFebAugPowerValues.csv''') data.dropna(axis=0

我试图用一个神经网络模型来预测新的数据。然而,预测数据的刻度不正确(当其应为0.3等时,从1e-10获得的值)

在我的模型中,我对x和y数据使用了minmaxscaler。当使用试验列车分割法时,模型给我的R2值为0.9,使用管道法和交叉val法时,模型给我的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'])
看到我在初始训练模型上使用了定标器,我想我也需要对新数据进行此操作。我试过了 定标器逆_变换(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=管道预测(xnew) 然而,这给了我主要由1组成的数据

你知道我如何根据这些新数据正确预测吗?我不确定哪些数据需要缩放,哪些不太需要,因为我相信使用pipeline.predict会包括x和y的缩放。因此,在做出这些预测之后,我需要某种反向管道标量吗?
非常感谢您的帮助。

您的方法有一个小问题和一个大问题

  • 次要的一点:没有必要调整你的目标变量,它不会影响你的优化功能
  • 主要的一点是:在要运行预测的数据上再次拟合scaler。通过这样做,您完全扭曲了数据中的关系,因此预测的输出具有非常不同的规模。此外,您还定义了
    scaler
    ,以后不再使用它。让我们把它修好
  • (……)


    如您所见,我们首先使用
    定标器
    学习适当的规范化因子,然后在运行
    预测

    的新数据上使用它(
    转换

  • 次要的一点:没有必要调整你的目标变量,它不会影响你的优化功能
  • 主要的一点是:在要运行预测的数据上再次拟合scaler。通过这样做,您完全扭曲了数据中的关系,因此预测的输出具有非常不同的规模。此外,您还定义了
    scaler
    ,以后不再使用它。让我们把它修好
  • (……)


    如您所见,我们首先使用
    定标器
    学习适当的规范化因子,然后在运行
    predict
    的新数据上使用它(
    transform
    ),谢谢您的帮助。当我在不缩放y数据的情况下运行模型时,我得到了一个糟糕的模型,accuray随时间减少,损失增加。我是否不需要缩放y数据,使其处于激活功能的范围内?谢谢您的帮助对不起,我没有注意到您正在使用
    sigmoid
    。将其替换为
    线性
    。说不需要缩放目标是不对的,它确实改变了优化问题,你可以在使用神经网络的边界框回归中很容易看到这一点。@MatiasValdenegro它是如何改变优化的?你能从数学或算法的角度说明它是如何影响优化问题的吗?这里有一个解释它是如何不影响它的:@LukaszTracewski对于一个神经网络来说,它确实会改变它,当你规范化目标并在输出处放置一个适当的激活,因此范围匹配,例如,将目标规范化为[0,1],并在网络的输出处放置一个sigmoid激活。您链接的答案不适用于复杂的非线性模型,在这些模型中,您还进行了一些小的体系结构更改。另一个原因是,如果不进行缩放,网络必须学习缩放,因此规范化并强制网络使用确定的缩放可以消除一个学习问题。这不仅仅是一个线性变换。谢谢你的帮助。当我在不缩放y数据的情况下运行模型时,我得到了一个糟糕的模型,accuray随时间减少,损失增加。我是否不需要缩放y数据,使其处于激活功能的范围内?谢谢您的帮助对不起,我没有注意到您正在使用
    sigmoid
    。将其替换为
    线性
    。说不需要缩放目标是不对的,它确实改变了优化问题,你可以在使用神经网络的边界框回归中很容易看到这一点。@MatiasValdenegro它是如何改变优化的?你能从数学或算法的角度说明它是如何影响优化问题的吗?这里有一个解释它是如何不影响它的:@LukaszTracewski对于一个神经网络来说,它确实会改变它,当你规范化目标并在输出处放置一个适当的激活,因此范围匹配,例如,将目标规范化为[0,1],并在网络的输出处放置一个sigmoid激活。您链接的答案不适用于复杂的非线性模型,在这些模型中,您还进行了一些小的体系结构更改。另一个原因是,如果不进行缩放,网络必须学习缩放,因此规范化并强制网络使用确定的缩放可以消除一个学习问题。这不仅仅是一个线性变换。
    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)