Обратная шкала прогнозируемых данных в Керасе - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь использовать модель NN для прогнозирования с новыми данными.Однако прогнозируемые данные имеют неправильный масштаб (значения, полученные 1e-10, когда они должны быть 0,3 и т. Д.).

В моей модели я использовал minmaxscaler для данных x и y.Модель дала мне значение 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-х!

Есть идеи о том, как я могу правильно прогнозировать на этих новых данных?Я не уверен, какие данные масштабировать, а какие нет, так как я считаю, что использование pipe.predict будет включать масштабирование для x и y.поэтому мне нужен какой-то скаляр обратного конвейера после выполнения этих прогнозов?Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 14 июня 2019

В вашем подходе есть одна незначительная и одна серьезная проблема.

  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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...