Làm thế nào để dự đoán các giá trị tương lai của chân trời thời gian với Keras?


11

Tôi vừa mới xây dựng mạng lưới thần kinh LSTM này với Keras

    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()

sau đó nó tạo ra kết quả này: Dự đoán về dữ liệu thử nghiệm

Sau khi xây dựng và đào tạo một mô hình tốt về dữ liệu lịch sử, tôi không biết làm thế nào tôi có thể tạo dự đoán cho các giá trị trong tương lai? Ví dụ như nhu cầu trong 10 ngày tới. Dữ liệu là hàng ngày.

đây là một ví dụ về cách dữ liệu được định hình

NB: đây là một ví dụ về cách dữ liệu được định hình, màu xanh lá cây là nhãn và màu vàng là các tính năng.
sau dropna()(xóa các giá trị null) nó vẫn còn 100 hàng dữ liệu, tôi đã sử dụng 80 trong đào tạo và 20 trong thử nghiệm.


Khi bạn phá vỡ chuỗi thời gian của mình, bạn có bao nhiêu trường hợp?
JahKnows

Xin lỗi ngài, tôi không có bạn, bạn có thể giải thích thêm? cảm ơn bạn
Nbenz

Sau khi cơ cấu lại dữ liệu của bạn cho một vấn đề dự báo, bạn có bao nhiêu dòng ví dụ?
JahKnows

Bạn có thể cho tôi một chuỗi thời gian duy nhất và tôi sẽ chỉ cho bạn cách thực hiện dự báo với họ.
JahKnows

Bạn có thể kiểm tra lại câu hỏi tôi đã chỉnh sửa bằng cách thêm một ví dụ về định dạng và hình dạng dữ liệu. cảm ơn
Nbenz

Câu trả lời:


3
Câu trả lời này đi một chút theo một hướng khác, nhưng tôi hy vọng nó vẫn trả lời câu hỏi của bạn. Nó sử dụng ý tưởng của một dự báo / dự đoán cán.

Bởi vì bạn sử dụng từ chân trời , tôi sẽ cho rằng bạn có nghĩa là bạn muốn dự đoán 10 ngày tới tương lai ở một bước thời gian nhất định. Có một vài cách để làm điều này. Với loại vấn đề chuỗi thời gian này, người ta thường đưa ra giả định rằng chỉ một lịch sử nhất định sẽ ảnh hưởng đến các bước thời gian tiếp theo (bỏ qua các hiệu ứng theo mùa).

Ví dụ bằng từ:

Vì vậy, trong trường hợp của bạn, bạn có thể sử dụng, ví dụ 60 ngày trước và dự đoán 10. Tiếp theo, lấy 100 hàng dữ liệu của bạn làm ví dụ, điều này có nghĩa là bạn thực sự có thể đưa ra (100 - 60 - 9) = 31dự đoán, mỗi dự đoán về 10 bước trước (chúng tôi sẽ cần những bước này 31 dự đoán_blocks sau). Từ 100 hàng, chúng tôi mất 60 đầu tiên để phù hợp với mô hình đầu tiên. Trong số 40 hàng dữ liệu còn lại, chúng tôi có thể dự đoán 10 bước phía trước (hàng 61-70), sau đó chúng tôi chuyển toàn bộ một hàng tiếp theo và lặp lại. Dự đoán cuối cùng về 10 điểm trong tương lai sẽ dành cho các hàng 91-100. Sau đó, chúng tôi không thể dự đoán được 10 bước nữa, vì vậy chúng tôi dừng lại - và đây là lý do tại sao chúng tôi phải trừ thêm 9. [Tất nhiên có nhiều cách để tiếp tục đưa ra dự đoán, như sử dụng tất cả dữ liệu]

Ví dụ với một ngàn từ:

Hãy để tôi vẽ bức tranh; để giúp giải thích ý tưởng của một dự đoán cửa sổ thay đổi.

Đối với mỗi bộ đào tạo (ví dụ từ t=0để t=5màu đỏ - tàu set 1), bạn muốn để dự đoán các bước thời gian H sau (tương ứng với t = 6 màu cam - kiểm tra bộ 1). Trong đó, chân trời của bạn chỉ đơn giản là một nghĩa là H=1.

Bản phác thảo cơ bản của dự báo mẫu

Từ những gì tôi hiểu, bạn muốn dự đoán trong 10 ngày tới, nghĩa là bạn cần H=10.

Để thử điều này với ví dụ của bạn, tôi nghĩ bạn sẽ cần thực hiện hai thay đổi.

Thay đổi số 1

Hình dạng của bộ xe lửa và bộ kiểm tra của bạn sẽ cần phải phù hợp với chân trời mới. Mỗi mẫu của đầu vào mô hình của bạn ( x_trainx_testcó thể giữ nguyên như trước. Tuy nhiên, mỗi mẫu trong bộ thử nghiệm của bạn sẽ phải chứa các H=10giá trị tiếp theo của nhãn, không chỉ một giá trị.

Đây là một ví dụ sơ bộ về cách bạn có thể làm điều này:

# 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)

Bởi vì bạn đang thực hiện kiểm tra ngoài mẫu, dự đoán của bạn rất thú vị để xem xét phân tích. Khi điều này chạy, sau đó bạn có thể tạo các bộ dữ liệu thử nghiệm tương đương với dữ liệu mới mà bạn đã đề cập.

Không biết dữ liệu của bạn quá rõ, tôi không biết liệu bạn có nên dự đoán các giá trị y của cùng một hàng với đầu vào hoặc của hàng sau không. Ngoài ra, tùy thuộc vào dữ liệu của bạn, bạn có thể đưa vào các giá trị trong quá khứ của ytừng x_trainkhối. Trong trường hợp này, bạn chỉ cần trao đổi xcho toàn bộ bảng data[cols], tức là ở đâu new_cols = ['Demand'] + cols.

Thay đổi số 2

Bạn sẽ cần làm cho mô hình phản ánh chân trời này, bằng cách buộc nó thành Hcác giá trị đầu ra .

Dưới đây là một ví dụ về cách chỉ định mô hình:

# 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!

Lưu ý: Trong đặc tả mô hình của bạn, bạn không cần thêm tuyến tính cuối cùng Activation, vì lớp Mật độ trước đó theo mặc định bao gồm kích hoạt tuyến tính. Xem tài liệu tuyệt vời ở đây .

Đây là một chủ đề lớn và có nhiều điều mà bạn có thể thử. Tôi đồng ý với các ý kiến ​​về câu hỏi của bạn, rằng bạn sẽ cần nhiều dữ liệu hơn để cho phép một RNN thực hiện một đại diện ý nghĩa của mô hình.

Nếu bạn không chỉ làm điều này để tìm hiểu về các LSTM, v.v., một cách tiếp cận thực tế khác có thể là xem xét các mô hình chuỗi thời gian đơn giản hơn như mô hình ARIMA (không bị đe dọa bởi tên phức tạp - đơn giản hơn nhiều so với LSTM) . Các mô hình như vậy có thể được xây dựng khá dễ dàng với Python, sử dụng gói statsmodels , có triển khai tốt .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.