Это сложная задача, но на самом деле ее легко исправить:
Ваши цели Y_valid
имеют форму (2000,)
, то есть просто массив из 2000 чисел. Однако сетевые выходы имеют форму (2000, 1)
. Затем выражение Y_valid - preds
пытается вычесть фигуру (2000, 1)
из фигуры (2000,)
... Эти два несовместимы и должны быть переданы. Стандартные правила вещания будут действовать следующим образом:
1. Align like
( 2000,)
(2000, 1)`
2. add extra dimension in front
(1, 2000,)
(2000, 1)
3. broadcast to make compatible
(2000, 2000)
(2000, 2000)
... и поэтому вы фактически вычитаете два массива размером (2000, 2000)
друг из друга. Вы в основном вычисляете разницу между каждым прогнозом и всеми целями вместо только соответствующего. Очевидно, что среднее значение этого будет гораздо больше.
tl; др: model.evaluate
правильно. Ручное вычисление некорректно из-за забавного вещания. Вы можете исправить это, изменив прогнозы на (2000,)
(или цели на (2000, 1)
:
preds = model.predict(X_valid)[:, 0]
np.abs(Y_valid - preds).mean()