Глубокая нейронная сеть Keras дает неправильную / постоянную линию регрессии

#python #keras #regression

#python #keras #регрессия

Вопрос:

Я создал глубокую нейронную сеть Keras для 2 моделей регрессии и построил результирующие линии регрессии с фактическими данными и прогнозами для тестовых данных. Я получаю следующие графики:

1. Прогнозы для тестовых данных близки к фактическим данным, но линия регрессии не отражает тестовые прогнозы

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?