Keras를 사용하여 미래 시간대의 미래 가치를 예측하는 방법은 무엇입니까?


11

방금 Keras로 LSTM 신경망을 구축 했습니다.

    import numpy as np
    import pandas as pd 
    from sklearn import preprocessing
    from keras.layers.core import Dense, Dropout, Activation
    from keras.activations import linear
    from keras.layers.recurrent import LSTM
    from keras.models import Sequential
    from matplotlib import pyplot

    #read and prepare data from datafile
    data_file_name = "DailyDemand.csv"
    data_csv = pd.read_csv(data_file_name, delimiter = ';',header=None, usecols=[1,2,3,4,5])
    yt = data_csv[1:]
    data = yt
    data.columns = ['MoyenneTransactHier', 'MaxTransaction', 'MinTransaction','CountTransaction','Demand']
    # print (data.head(10))
    pd.options.display.float_format = '{:,.0f}'.format
    data = data.dropna ()
    y=data['Demand'].astype(int)
    cols=['MoyenneTransactHier', 'MaxTransaction', 'MinTransaction','CountTransaction']
    x=data[cols].astype(int)

    #scaling data
    scaler_x = preprocessing.MinMaxScaler(feature_range =(-1, 1))
    x = np.array(x).reshape ((len(x),4 ))
    x = scaler_x.fit_transform(x)
    scaler_y = preprocessing.MinMaxScaler(feature_range =(-1, 1))
    y = np.array(y).reshape ((len(y), 1))
    y = scaler_y.fit_transform(y)
    print("longeur de y",len(y))
    # Split train and test data
    train_end = 80
    x_train=x[0: train_end ,]
    x_test=x[train_end +1: ,]
    y_train=y[0: train_end]
    y_test=y[train_end +1:] 
    x_train=x_train.reshape(x_train.shape +(1,))
    x_test=x_test.reshape(x_test.shape + (1,))

    print("Data well prepared")
    print ('x_train shape ', x_train.shape)
    print ('y_train', y_train.shape)

    #Design the model - LSTM Network
    seed = 2016
    np.random.seed(seed)
    fit1 = Sequential ()
    fit1.add(LSTM(
        output_dim = 4,
        activation='tanh',
        input_shape =(4, 1)))
    fit1.add(Dense(output_dim =1))
    fit1.add(Activation(linear))
    #rmsprop or sgd
    batchsize = 1
    fit1.compile(loss="mean_squared_error",optimizer="rmsprop")
    #train the model
    fit1.fit(x_train , y_train , batch_size = batchsize, nb_epoch =20, shuffle=True)

    print(fit1.summary ())

    #Model error
    score_train = fit1.evaluate(x_train ,y_train ,batch_size =batchsize)
    score_test = fit1.evaluate(x_test , y_test ,batch_size =batchsize)
    print("in  train  MSE = ",round(score_train,4))
    print("in test  MSE = ",round(score_test ,4))

    #Make prediction
    pred1=fit1.predict(x_test)
    pred1 = scaler_y.inverse_transform(np.array(pred1).reshape ((len(pred1), 1)))
    real_test = scaler_y.inverse_transform(np.array(y_test).reshape ((len(y_test), 1))).astype(int)

    #save prediction
    testData = pd.DataFrame(real_test)
    preddData = pd.DataFrame(pred1)
    dataF = pd.concat([testData,preddData], axis=1)
    dataF.columns =['Real demand','Predicted Demand']
    dataF.to_csv('Demandprediction.csv')

    pyplot.plot(pred1, label='Forecast')
    pyplot.plot(real_test,label='Actual')
    pyplot.legend()
    pyplot.show()

그런 다음이 결과를 생성합니다. 테스트 데이터에 대한 예측

과거 데이터에 대한 좋은 모델을 구축하고 훈련 한 후에 미래의 가치에 대한 예측을 어떻게 생성 할 수 있는지 모르겠습니다. 예를 들어 다음 10 일의 수요. 데이터는 매일입니다.

이것은 데이터가 형성되는 방법의 예입니다

주의 : 이것은 데이터가 어떻게 형성되는지의 예이고, 녹색은 라벨이고 노란색은 특징입니다.
후에 dropna()는 100 개 개의 데이터 행을 유지 (삭제 널 (null) 값), 나는 훈련 (80)와 테스트에서 20를 사용했습니다.


시계열을 끊을 때 인스턴스가 몇 개입니까?
JahKnows

죄송합니다. 이해가되지 않습니다. 더 설명해 주시겠습니까? 감사합니다
Nbenz

예측 문제에 대해 데이터를 재구성 한 후 몇 줄의 예제가 있습니까?
JahKnows

시간 순서대로 단일 포인트를 줄 수 있습니까? 포인트로 예측하는 방법을 보여 드리겠습니다.
JahKnows

데이터 형식과 모양의 예를 추가하여 내가 편집 한 질문을 다시 확인할 수 있습니다. 감사
Nbenz

답변:


5
이 답변은 약간 다른 방향으로 진행되지만 여전히 귀하의 질문에 대답하기를 바랍니다. 롤링 예측 / 예측이라는 아이디어를 사용합니다.

horizon 이라는 단어를 사용하기 때문에 주어진 시간 단계에서 미래로 10 일을 예측한다고 가정합니다. 이를 수행하는 몇 가지 방법이 있습니다. 이러한 종류의 시계열 문제에서는 특정 이력 만 다음 몇 가지 시간 단계 (계절 효과 무시)에 영향을 줄 것이라고 가정하는 것이 일반적입니다.

단어의 예 :

예를 들어, 이전 60 일을 사용하고 다음 10 일을 예측할 수 있습니다. 예를 들어 100 행의 데이터를 예로 들면, (100 - 60 - 9) = 3110 단계 씩 앞서는 각 예측을 실제로 예측할 수 있습니다. 31 predictive_blocks 나중에). 100 행에서 첫 번째 모형에 맞게 처음 60 개를 잃습니다. 나머지 40 행의 데이터 중에서 10 단계 앞으로 (행 61-70) 예측 한 다음 전체 행을 한 행 더 이동 한 후 반복합니다. 10 개의 미래 포인트의 마지막 예측은 91 ~ 100 행에 대한 것입니다. 그 후에 우리는 더 이상 10 단계를 예측할 수 없으므로 중지합니다. 이것이 추가 9를 빼야하는 이유입니다. [물론 모든 데이터를 사용하려면 예측을 계속하는 방법이 있습니다]

천 단어로 된 예 :

그림을 그리겠습니다. 변화하는 창 예측의 아이디어를 설명하는 데 도움이됩니다.

각 열차 세트 (예 : t=0t=5빨간색 - 기차 세트 1), 당신은 (- 테스트 세트 1t 주황색 = 6에 해당) 다음 H 시간 단계를 예측합니다. 여기서 당신의 지평은 단순히 하나 H=1입니다.

샘플 외부 롤링 예측의 기본 스케치

내가 이해 한 바에 따르면 향후 10 일을 예측하고 싶습니다 H=10.

예제를 사용 하여이 작업을 시도하려면 두 가지 사항을 변경해야한다고 생각합니다.

# 1 변경

기차와 테스트 세트의 모양이 새로운 지평과 일치해야합니다. 모델 입력의 각 샘플 (x_trainx_test이전과 동일하게 유지 될 수 있지만 테스트 세트의 각 샘플에는 H=10단일 값이 아니라 다음 레이블 값이 포함되어야합니다 .

이 작업을 수행하는 방법에 대한 대략적인 예는 다음과 같습니다.

# Define our horizon
H = 10

# Create data split, using values from my example above
window_size = 60
num_pred_blocks = 31    # as computed above

# Loop over the train and test samples to create the sliding window sets
x_train = []
y_train = []
for i in range(num_pred_blocks):
    x_train_block = x_train[i:(i + window_size)]    # 31 blocks of 60 * num-columns
    x_train.append(x_train_block)
    y_train_block = y_train[(i + window_size):(i + window_size + H)]    # 31 blocks of 10 * 1
    y_train.append(y_train_block)

표본 외 (out-of-sample) 테스트를 수행하고 있기 때문에 예측은 이미 분석에 흥미 롭습니다. 이 작업이 실행되면 언급 한 새 데이터로 동등한 테스트 데이터 세트를 작성할 수 있습니다.

데이터를 잘 모르면 입력과 동일한 행 또는 다음 행의 y 값을 예측 해야하는지 알 수 없습니다. 또한 데이터에 따라 yx_train블록 에 과거 값을 포함시킬 수 있습니다 . 이 경우 x전체 테이블, 즉 data[cols]where을 교체하면 new_cols = ['Demand'] + cols됩니다.

# 2 변경

출력 H값 을 강제로 적용하여 모델이이 지평을 반영하도록해야 합니다.

다음은 모델을 지정하는 방법의 예입니다.

# Define our horizon
H = 10

# Create the model using the parameterised horizon
fit1 = Sequential ()
fit1.add(LSTM(output_dim = 4, activation='tanh', input_shape =(4, 1)))
fit1.add(Dense(output_dim=30, activation='sigmoid')
fit1.add(Dense(output_dim=H))    # our horizon is produced!

참고 : 모델 사양에서는 Activation기본적으로 이전 밀도 레이어에 선형 활성화가 포함 되므로 최종 linear를 추가 할 필요가 없습니다 . 보다여기서 훌륭한 문서를 하십시오 .

이것은 큰 주제이며 시도 할 수있는 많은 것들이 있습니다. 귀하의 질문에 대한 의견에 동의합니다. RNN이 모델을 의미있게 표현할 수 있도록 더 많은 데이터가 필요하다는 데 동의합니다.

LSTM 등에 대해 배우기 위해이 작업을 수행하지 않는 경우 ARIMA 모델 과 같은 더 간단한 시계열 모델을 보는 것이 실제적인 또 다른 접근법 일 수 있습니다 (복잡한 이름으로 협박하지 마십시오-LSTM보다 훨씬 간단합니다) . 이러한 모델을 사용하여, 파이썬으로 아주 쉽게 구성 할 수 statsmodels 패키지 가, 멋진 구현 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.