[LSTM] Используйте LSTM для прогнозирования ценности данных мониторинга.

искусственный интеллект .NET

Это предложение: Численный прогноз

В предыдущем посте нашей подтемой было предсказание следующего символа в последовательности символов с использованием LSTM.

Хотя предложение простое, оно имеет широкий спектр практических применений. Например, в методе ввода обязательно будут использоваться родственные технологии. Просто это не обязательно LSTM и уж точно нечто большее, чем одномерные функции. На этот раз это предложение относительно более практично: предсказать значение предстоящих индикаторов мониторинга на основе исторических данных прогнозного мониторинга.

Например, на картинке ниже представлены данные мониторинга этого сайта на Youmeng. Пунктирная линия справа — прогнозируемое значение Umeng:

Отдельное спасибо за код этой статьи: https://blog.csdn.net/aliceyangxi1987/article/details/73420583

Код предсказания был перенесен и используется сразу после простой модификации.

Конкретные изменения и обсуждения будут сделаны в конце.

Получить данные и отобразить

Поскольку координаты оси X слишком тесны для отображения, они здесь не отображаются.

Введение данных:

  • Это значение одного из наших индикаторов мониторинга. Точное название не скажу :D
  • Промежуток времени: один месяц
  • Гранулярность: одно значение в час
  • Загрузка данных:Ссылка на сайт

Видно, что в предыдущий период времени биение значения происходит относительно регулярно. Конечно, есть исключение в середине. Просто сзади вдруг появилось несколько больших гребней. Если это обнаружение аномалии, здесь должны быть выделены следующие пики.

Начать алхимию / модель поезда

Полный код выглядит следующим образом:

import numpy
import matplotlib.pyplot as plt
from pandas import read_csv
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
%matplotlib inline
 
 
# 加载数据
dataframe = read_csv("monitor-metics-data.csv", usecols=[1])
dataset = dataframe.values
# 将整型变为float
dataset = dataset.astype('float32') # numpy.ndarray 类型
 
# 创建matrix类型的数据集
def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY)
 
# fix random seed for reproducibility
numpy.random.seed(7)
 
 
# 数据正则化, 方法: Min Max
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
 
# 【注意】因为在我们的周期是小时, 基本上按天进行变动, 可以设置为24. 
# 实际上, 也可以设置为1,误差比想象中的小很多
look_back = 24 
 
# 切分train / test 数据 
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
 
# 开始构建数据集
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# 注意这里的reshape的操作。 
trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1], 1))
 
# 开始训练模型
# 可以把epochs 训练次数加大, 当前时间不足, 只进行了10次
model = Sequential()
model.add(LSTM(4, input_shape=(look_back,1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=10, batch_size=2, verbose=2)
 
 
# 为了展示区别, 训练、测试数据都预测。 
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
 
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
 
# 计算误差值/RMSE
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
 
# 绘图
# plot baseline and predictions
def plot_result() :
    raw = scaler.inverse_transform(dataset)
 
    x = read_csv("monitor-metics-data.csv", usecols=[0]).values.tolist()
 
    # shift train predictions for plotting
    trainPredictPlot = numpy.empty_like(dataset)
    trainPredictPlot[:, :] = numpy.nan
    trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict
 
    # shift test predictions for plotting
    testPredictPlot = numpy.empty_like(dataset)
    testPredictPlot[:, :] = numpy.nan
    testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict
 
    #创建绘图对象,figsize参数可以指定绘图对象的宽度和高度,单位为英寸,一英寸=80px
    fig, ax = plt.subplots(figsize=(20,5))
 
    raw_line, = plt.plot(x,raw, "m--", linewidth=1, label="Raw Data")   
    train_line, = plt.plot(x,trainPredictPlot, "b-", linewidth=1, label="Train Predict") 
    test_line, = plt.plot(x,testPredictPlot, "g-", linewidth=1, label="Test Predict") 
 
    plt.legend(handles=[raw_line, train_line, test_line])
 
    xticks=list(range(0,len(x),40))
    xlabels=[x[t] for t in xticks]
    xticks.append(len(x))
    xlabels.append(x[-1])
    ax.set_xticks(xticks)
    ax.set_xticklabels(xlabels, rotation=40)
 
    plt.show()
plot_result()
 

Как показано на фиг.1:

  • Красная пунктирная линия — исходные данные,
  • Синий — прогнозируемое значение обучающих данных. Общее совпадение
  • Зеленый — прогнозируемое значение тестовых данных. Хотя пик внезапно возрастает, прогнозируемое значение также соответственно возрастает. Но она все равно отличается от реальной стоимости. Это закладывает основу для использования LSTM для обнаружения аномалий.

Изменено место

  • look_back

    Look_back исходного текста равен 1. Я лично считаю, что его не следует использовать таким образом в реальном производстве.

    Изменено на 24 в соответствии с известным нам периодом временного окна.

  • numpy.reshape / input_shape

    Оригинальный код:

    # reshape input to be [samples, time steps, features]
    trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
    testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
     
    # ... 中间略
    model.add(LSTM(4, input_shape=(1, look_back)))
     

    Моя модификация:

    trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
    testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1], 1))
    # ... 中间略
    model.add(LSTM(4, input_shape=(look_back,1)))
     

    Мое понимание:

    1. Поскольку характеристики наших данных одномерны, поэтомуfeaturesЗначение должно быть1,
    2. И фактическое значение временного окна, которое мы оглядываемся назад, равноlook_backзначение . существуетcreate_datesetВнутри функции да, ширина набора данныхlook_back, СейчасtrainX.shape[1] == look_back
  • plot_resultфункция

    Первоначальная функция рисования слишком проста, и здесь были сделаны некоторые оптимизации, такие как:

    • Увеличить рисунок
    • есть легенда
    • Отображается интервал значений координаты x

Данная статья является оригинальной, и при перепечатке необходимо указывать источник:

[LSTM] Используйте LSTM для прогнозирования ценности данных мониторинга.