Проблема в том, что вы подгоняете MinMaxScaler
к dataset
, затем разбиваете dataset
на x_train
и y_train
, а затем пытаетесь использовать метод inverse_transform
в прогнозах, которые имеют такой же формы, как y_train
. Я предлагаю вам создать x_train
и y_train
и установить MinMaxScaler
только для x_train
. y_train
не нужно масштабировать для модели, и это избавит вас от необходимости inverse_transform
прогнозов полностью.
Так что вместо
#Get the number of rows to train the model on, 40 rows for test
training_data_len = len(dataset) - 40
scaler = MinMaxScaler(feature_range=(0,1))
scaled_data = scaler.fit_transform(dataset)
train_data = scaled_data[0:int(training_data_len), :]
x_train = []
y_train = []
for i in range(60, len(train_data)):
x_train.append(train_data[i-60:i, 0])
y_train.append(train_data[i, 0])
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
Используйте
#Get the number of rows to train the model on, 40 rows for test
training_data_len = len(dataset) - 40
train_data = scaled_data[0:int(training_data_len), :]
x_train = []
y_train = []
for i in range(60, len(train_data)):
x_train.append(train_data[i-60:i, 0])
y_train.append(train_data[i, 0])
x_train, y_train = np.array(x_train), np.array(y_train)
scaler = MinMaxScaler(feature_range=(0,1))
x_train = scaler.fit_transform(x_train) # Only scaling x_train
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
и просто удалите строку predictions = scaler.inverse_transform(predictions)
.
Обновления, касающиеся дополнительных вопросов в комментариях
Определение y_test
не соответствует y_train
. В частности, y_test
определяется как y_test = dataset[training_data_len:, :]
, который использует все столбцы dataset
. Вместо этого, чтобы соответствовать y_train
, оно должно быть dataset[training_data_len:, 0]
.
Обработка разделения данных часто более понятна и менее подвержена ошибкам, если выполняется в pandas
:
# Starting with the dataframe 'data'
data = df.filter(['Close', 'Open', 'Volume'])
# Create x/y test/train directly from 'data'
training_data_len = len(data) - 40
x_train = data[['Open', 'Volume']][:training_data_len]
y_train = data.Close[:training_data_len]
x_test = data[['Open', 'Volume']][training_data_len:]
y_test = data.Close[training_data_len:]
# Then confirm you have the expected subsets by checking things like
# shape (and info(), describe(), etc.)
x_train.shape, x_test.shape
> ((160, 2), (40, 2))
y_train.shape, y_test.shape
> ((160,), (40,))