Как улучшить качество предсказания? (keras)
from keras.models import Sequential
from keras.layers import Dense
from keras.models import load_model
import h5py
x_train,y_train = np.load('datsx.npy'),np.load('datsy.npy')
# Среднее значение
mean = x_train.mean(axis=0)
# Стандартное отклонение
std = x_train.std(axis=0)
x_train -= mean
x_train /= std
x_test,y_test = np.load('datsx_test.npy'),np.load('datsy_test.npy')
x_test -= mean
x_test /= std
model = Sequential()
model.add(Dense(128, activation='relu', input_shape=(x_train.shape[1],)))#shape 1
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(3))
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
model.fit(x_train, y_train, epochs=1000, batch_size=20, verbose=2)
mse, mae = model.evaluate(x_test, y_test, verbose=0)
print("Средняя абсолютная ошибка (тысяч долларов):", mae)
pred = model.predict(x_test)
print("Предсказанная стоимость:", pred, ", правильная стоимость:", y_test)
Я получил:
pred = [[7.5767965 6.5368557 1.4546983] [7.5767965 6.5368557 1.4546983] [7.5767965 6.5368557 1.4546983] [6.581648 5.627339 1.4382766] [7.5767965 6.5368557 1.4546983] [6.5488234 5.5973387 1.437735 ] [6.615987 5.658723 1.4388433] [7.5767965 6.5368557 1.4546983] [6.7741213 5.8032503 1.4414527] [6.892623 5.911555 1.4434083] [6.6503396 5.6901193 1.4394102] [7.5767965 6.5368557 1.4546983] [7.5767965 6.5368557 1.4546983] [7.5767965 6.5368557 1.4546983]
pred должен быть почти
y_test = [[2., 1., 1.], [0., 2., 2.], [2., 0., 1.], [1., 2., 2.], [2., 0., 1.], [0., 1., 2.], [0., 1., 2.], [2., 1., 1.], [1., 2., 2.], [2., 1., 1.], [2., 1., 1.], [2., 0., 1.], [2., 0., 1.], [0., 2., 2.], [2., 0., 1.], [2., 0., 1.], [1., 2., 2.], [2., 0., 1.], [2., 0., 1.], [1., 2., 2.], [1., 2., 2.], [1., 2., 2.], [1., 3., 2.]]`
Данные для:
x_train,y_train = np.load('datsx.npy'),np.load('datsy.npy')
x_test,y_test = np.load('datsx_test.npy'),np.load('datsy_test.npy')
можно скачать от сюда :https://transfiles.ru/pn2om
Ответы (1 шт):
В общем, я покрутил по-всякому ваши данные и могу вам сказать, что с такими данными не помогут никакие нейросети. В ваших данных просто практически нет зависимости компонент y от компонент x, вот графики (в гриде по вертикали идут по очереди 4 компоненты x, по горизонтали - компоненты y, на самих же графиках снизу x, слева y):
Видите - никаких намёков на диагонали в рисунке, т.е. практически нет никакой вообще зависимости y от x ни по одной из компонент. В такой ситуации всё, что можно сделать - это предсказать для каждой компоненты y просто "среднюю температуру по больнице", что в итоге и будет делать любой метод машинного обучения, который вы примените. И я даже могу это показать:
print(np.mean(y_train, axis=0))
array([7.29743973, 6.33168606, 1.43495386])
Видите? Очень похоже на тот прогноз, который получили вы, при том, что я тут просто взял "среднюю температуру по больнице" отдельно для каждой компоненты y. Да, за счёт усложнения модели можно получить чуть-чуть лучшую метрику на тренировочных данных, но не надо себя обманывать - это будет ерунда, а не результат, случайные флуктуации. В ваших данных просто нет сигнала, которому можно научиться, чтобы его предсказывать. Почему так - я не знаю, разбирайтесь с вашими данными.
Вот ещё матрица корреляции, первые 4 компоненты - это компоненты x, последние 3 - компоненты y, и тут опять же видно, что какая-то корреляция есть только у компонент y между собой, а компоненты x не коррелируют вообще ни с чем, кроме самих себя, они не коррелируют даже с другими компонентами x, не говоря уже о корреляции с компонентами y.

