Не удается получить правильные результаты, даже если средняя абсолютная ошибка невелика

#python #pandas #tensorflow

Вопрос:

 import pandas as pd
df=pd.read_csv('final sheet for project.csv')
features=['moisture','volatile matter','fixed carbon','calorific value','carbon %','oxygen%']
train_data=df[features]
target_data=df.pop('Activation energy')
X_train, X_test, y_train, y_test = train_test_split(train_data,target_data,  test_size=0.09375, random_state=1)

standard_X_train=pd.DataFrame(StandardScaler().fit_transform(X_train))
standard_X_test=pd.DataFrame(StandardScaler().fit_transform(X_test))

y_train=y_train.values
y_train = y_train.reshape((-1, 1))

scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(y_train)

normalized_y_train = scaler.transform(y_train)

y_test=y_test.values
y_test = y_test.reshape((-1, 1))

scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(y_test)

normalized_y_test = scaler.transform(y_test)

model=keras.Sequential([layers.Dense(units=20,input_shape=[6,]),layers.Dense(units=1,activation='tanh')])

model.compile(
    optimizer='adam',
    loss='mae',
)


history = model.fit(standard_X_train,normalized_y_train, validation_data=(standard_X_test,normalized_y_test),epochs=200)

 

Я хочу создать модель для прогнозирования энергии активации с использованием некоторых функций . Я получаю потерю при обучении: 0,0629 и val_loss: 0,4213.
Но когда я пытаюсь предсказать энергии активации некоторых других невидимых данных ,я получаю странные результаты. Я новичок в ML.

Может кто-нибудь, пожалуйста, помочь, какие изменения могут быть внесены в код. ( Я хочу создать модель с одним скрытым слоем из 20 единиц, которая имеет функцию активации tanh.)

Комментарии:

1. Вы также должны сравнить исходное и прогнозируемое значение RMSE

Ответ №1:

Вы не должны использовать fit_transform для проверки данных. Вы должны использовать fit_transform данные для обучения и применять их только transform к тестовым данным, чтобы использовать те же параметры для обучающих данных в тестовых данных.

Итак, часть преобразования вашего кода должна измениться следующим образом:

 scaler_x = StandardScaler()
standard_X_train = pd.DataFrame(scaler_x.fit_transform(X_train))
standard_X_test  = pd.DataFrame(scaler_x.transform(X_test))

y_train=y_train.values
y_train = y_train.reshape((-1, 1))
y_test=y_test.values
y_test = y_test.reshape((-1, 1))

scaler_y = MinMaxScaler(feature_range=(0, 1))
normalized_y_train = scaler_y.fit_transform(y_train)
normalized_y_test  = scaler_y.transform(y_test)
 

Кроме того, поскольку вы масштабируете свои данные, вы должны делать то же самое для любого прогноза. Итак, ваша строка прогноза должна быть примерно такой:

 preds = scaler_y.inverse_transform(
     model.predict(scaler_x.transform(pred_input)) #if it is standard_X_test you don't need to transform again, since you already did it. 
     )
 

Кроме того, поскольку вы преобразуете свои метки в диапазоне от 0 до 1, вам может потребоваться изменить функцию активации последнего слоя на sigmoid вместо tanh , или даже, возможно, лучше использовать функцию активации, как relu в вашем первом слое, если вы все еще получаете плохие результаты после вышеуказанных изменений.

 model=keras.Sequential([
                        layers.Dense(units=20,input_shape=[6,],activation='relu'),
                        layers.Dense(units=1,activation='sigmoid')
                       ])
 

Комментарии:

1. Я только что попробовал эти модификации , которые вы предложили, но все равно получаю неверный вывод. Есть ли какие-либо другие модификации, которые можно попробовать? например ,вместо масштабирования target_y с помощью MinMaxScaler, что-нибудь еще?

2. Не имея знаний о ваших данных, практически невозможно сказать, полезна вам настройка масштаба или любого другого параметра или нет. Кроме того, вы должны указать, что вы подразумеваете под неправильным выводом. Всегда существует показатель, который измеряет, насколько желаемый результат далек от результата модели, такого как потери, который вы должны использовать вместо того, чтобы сообщать неправильные результаты.

3. Также, когда я использую relu в первом слое и сигмоиду во втором слое, мои потери при обучении=0,0445 и потери при тестировании=0,1103

4. Похоже, ваши показатели улучшились. Однако вы не удовлетворены результатами прогнозирования. Теперь вы должны попытаться изменить свои параметры, например, изменить потерю с mae на mse . или добавьте больше слоев в свою сеть и так далее.

5. потеря mae для моих прогнозов по новым данным составит 145,3105