Прогноз вне выборки. Как реализовать?
Задавал вопрос о прогнозе вне выборки, но ответов нет. Может на простом примере будет понятнее. Пример. Есть данные. [1,2,3,4,5,6,7,8,9] Потом. Нормализации данных. Подготовка на вход. Работа НС (бух-бах, волшебство) Инверсия данных. Выход. Следующий элемент должен быть. [9.98743] Это грубый пример. Сколько не смотрел примеров, везде только прогноз в выборке. То есть тестовых данных. А реализация прогноза вне выборки мне не понятен. Накидайте пожалуйста ссылок. Можно пример привести. Как такое реализовать?
Спасибо за ответ. Но я хотел узнать как реализовать предсказание на элементы вне выборки. Вот например в данном коде. Как узнать загрязнение на следующий день или следущию неделю или следущий месяц. Как сама функция этого реализуется. Не могу найти примеры такой реализации. '''
from math import sqrt
from numpy import concatenate
from matplotlib import pyplot
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# convert series to supervised learning
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
# load dataset
dataset = read_csv('pollution.csv', header=0, index_col=0)
values = dataset.values
# integer encode direction
encoder = LabelEncoder()
values[:,4] = encoder.fit_transform(values[:,4])
# ensure all data is float
values = values.astype('float32')
# normalize features
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(values)
# frame as supervised learning
reframed = series_to_supervised(scaled, 1, 1)
# drop columns we don't want to predict
reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True)
print(reframed.head())
# split into train and test sets
values = reframed.values
n_train_hours = 365 * 24
train = values[:n_train_hours, :]
test = values[n_train_hours:, :]
# split into input and outputs
train_X, train_y = train[:, :-1], train[:, -1]
test_X, test_y = test[:, :-1], test[:, -1]
# reshape input to be 3D [samples, timesteps, features]
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)
# design network
model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
# fit network
history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)
# plot history
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
pyplot.show()
# make a prediction
yhat = model.predict(test_X)
test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))
# invert scaling for forecast
inv_yhat = concatenate((yhat, test_X[:, 1:]), axis=1)
inv_yhat = scaler.inverse_transform(inv_yhat)
inv_yhat = inv_yhat[:,0]
# invert scaling for actual
test_y = test_y.reshape((len(test_y), 1))
inv_y = concatenate((test_y, test_X[:, 1:]), axis=1)
inv_y = scaler.inverse_transform(inv_y)
inv_y = inv_y[:,0]
# calculate RMSE
rmse = sqrt(mean_squared_error(inv_y, inv_yhat))
print('Test RMSE: %.3f' % rmse)
''' Вот пример с гитхаба. но и Здесь и в других примерах, которые я видел. Реализован только прогноз по выборки. А в не выборки нету.
Ответы (1 шт):
Любая модель машинного обучения / нейронных сетей всегда ожидает на вход данные в определенном формате или, говоря техническим языком, тензор одной и той же размерности, не учитывая первую или последнюю ось (количество образцов). Например если у вас набор данных в виде 2D матрицы или таблицы, то модель всегда будет ожидать одинаковое количество столбцов. Число строк может различаться.
Данные вне выборки это те данные, которые вы получите на вход в будущем. Для того чтобы натренировать и протестировать такую модель делают следующим образом:
- берется достаточно большая выборка данных
- разбивается на две части - обучающая и тестовая выборки
- если речь идет о временном ряде то в качестве тестовой выборки обычно берут последние (по времени) 20-30% данных. Если это не временной ряд, тогда данные перемешивают случайным образом и делят на две части - 70-80% на обучения, остальное на тесты.
- дальше обучаем модель на обучающем наборе, а точность модели проверяем на тестовом наборе данных.
- когда мы довольны результатами тестов, модель выкатывается в продакшн и начинает работать на совершенно новых данных. Разумеется все шаги препроцессинга (пред-обработки), которые вы делали для обучающей и тестовой выборок, нужно повторить и для новых входных данных.
- после этого ее модель обычно дообучают на новых данных
Вот как-то так...