#python #keras #regression
#python #keras #регрессия
Вопрос:
Я создал глубокую нейронную сеть Keras для 2 моделей регрессии и построил результирующие линии регрессии с фактическими данными и прогнозами для тестовых данных. Я получаю следующие графики:
График 1: Прогнозы для тестовых данных близки к фактическим данным, но линия регрессии не отражает тестовые прогнозы.
График 2: Прогнозы для тестовых данных отражают линию регрессии, но прогнозы постоянны и далеки от фактических данных
Я обучил обе модели одинаково, используя одну и ту же структуру, но они ведут себя по-разному, и ни одна из них не кажется правильной. В чем может быть проблема?
Код для прогнозирования и построения графиков:
X = df["X"]
Y = df["Y"]
(train, test) = train_test_split(df, test_size=0.3, random_state=42)
# scale Y
maxY = train["Y"].max()
trainY = train["Y"] / maxY
testY = test["Y"] / maxY
# scale X
trainX = scalerx.fit_transform(train["X"].values.reshape(-1,1))
testX = scalerx.fit_transform(test["X"].values.reshape(-1,1))
model = Sequential()
model.add(Dense(8, input_dim=dim, activation="relu"))
model.add(Dense(6, activation="relu"))
model.add(Dense(4, activation="relu"))
model.add(Dense(1, activation="linear"))
opt = Adam(learning_rate=1e-2, decay=1e-3/200)
model.compile(loss="mean_absolute_percentage_error", optimizer=opt)
model.fit(x=trainX, y=trainY, validation_data=(testX, testY), epochs=500, batch_size=4)
# predict regression line
x = np.arange(0, X.max() 0.1 , 0.01)
preds = model.predict(scalerx.fit_transform(x.reshape(-1, 1)))
preds = preds * maxY
# predict for test data
pred_y = model.predict(testX)
pred_y = pred_y * maxY
plt.scatter(X, Y, label='data')
plt.scatter(test["X"], pred_y, label='test data')
plt.plot(x, preds, 'r', label='regression line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
Комментарии:
1. фрагмент кода неполон. отсутствуют многие объявления переменных.
2. Вы неправильно используете MinMaxScaler, вы должны подогнать его к обучающим данным, а затем использовать его (не подгонять его снова) с тестовыми данными и новыми прогнозами (например, inverse_transform). Вы устанавливаете ее несколько раз, и это означает, что масштаб входных данных совершенно неверен.
3. Я исправил масштабирование, и оно исправило график 1, но график 2 остался прежним. Почему он предсказывает постоянные значения Y для всех X?