LSTM समय श्रृंखला पूर्वानुमान के आसपास भविष्यवाणी अंतराल


14

LSTM (या अन्य आवर्तक) तंत्रिका नेटवर्क से एक समय श्रृंखला पूर्वानुमान के आसपास भविष्यवाणी अंतराल (संभावना वितरण) की गणना करने के लिए एक विधि है?

उदाहरण के लिए, मैं भविष्य में 10 नमूनों की भविष्यवाणी कर रहा हूं (टी + 1 से टी + 10), पिछले 10 देखे गए नमूनों (टी -9 से टी) के आधार पर, मैं टी + 1 पर भविष्यवाणी की उम्मीद करूंगा t + 10 पर भविष्यवाणी से सटीक। आमतौर पर, कोई अंतराल दिखाने के लिए भविष्यवाणी के आसपास त्रुटि सलाखों को आकर्षित कर सकता है। ARIMA मॉडल (सामान्य रूप से वितरित त्रुटियों की धारणा के तहत) के साथ, मैं प्रत्येक अनुमानित मूल्य के आसपास एक भविष्यवाणी अंतराल (जैसे 95%) की गणना कर सकता हूं। क्या मैं LSTM मॉडल से समान (या कुछ ऐसा जो भविष्यवाणी अंतराल से संबंधित है) की गणना कर सकता हूं?

मैं Keras / पायथन में LSTMs साथ काम कर रहा हूँ, से उदाहरण के बहुत सारे निम्नलिखित machinelearningmastery.com जहाँ से मेरी उदाहरण कोड (नीचे) पर आधारित है,। मैं असतत डिब्बे में वर्गीकरण के रूप में समस्या को फिर से समझने पर विचार कर रहा हूं, क्योंकि यह प्रति वर्ग आत्मविश्वास पैदा करता है, लेकिन यह एक खराब समाधान लगता है।

कुछ इसी तरह के विषय हैं (जैसे नीचे), लेकिन LSTM (या वास्तव में अन्य) तंत्रिका नेटवर्क से भविष्यवाणी अंतराल के मुद्दे को सीधे संबोधित करने के लिए कुछ भी नहीं लगता है:

/stats/25055/how-to-calculate-the-confidence-interval-for-time-series-prediction

ARIMA बनाम LSTM का उपयोग करके समय श्रृंखला की भविष्यवाणी

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from math import sin
from matplotlib import pyplot
import numpy as np

# Build an LSTM network and train
def fit_lstm(X, y, batch_size, nb_epoch, neurons):
    X = X.reshape(X.shape[0], 1, X.shape[1]) # add in another dimension to the X data
    y = y.reshape(y.shape[0], y.shape[1])      # but don't add it to the y, as Dense has to be 1d?
    model = Sequential()
    model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(y.shape[1]))
    model.compile(loss='mean_squared_error', optimizer='adam')
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=1, shuffle=False)
        model.reset_states()
    return model

# Configuration
n = 5000    # total size of dataset
SLIDING_WINDOW_LENGTH = 30
SLIDING_WINDOW_STEP_SIZE = 1
batch_size = 10
test_size = 0.1 # fraction of dataset to hold back for testing
nb_epochs = 100 # for training
neurons = 8 # LSTM layer complexity

# create dataset
#raw_values = [sin(i/2) for i in range(n)]  # simple sine wave
raw_values = [sin(i/2)+sin(i/6)+sin(i/36)+np.random.uniform(-1,1) for i in range(n)]  # double sine with noise
#raw_values = [(i%4) for i in range(n)] # saw tooth

all_data = np.array(raw_values).reshape(-1,1) # make into array, add anothe dimension for sci-kit compatibility

# data is segmented using a sliding window mechanism
all_data_windowed = [np.transpose(all_data[idx:idx+SLIDING_WINDOW_LENGTH]) for idx in np.arange(0,len(all_data)-SLIDING_WINDOW_LENGTH, SLIDING_WINDOW_STEP_SIZE)]
all_data_windowed = np.concatenate(all_data_windowed, axis=0).astype(np.float32)

# split data into train and test-sets
# round datasets down to a multiple of the batch size
test_length = int(round((len(all_data_windowed) * test_size) / batch_size) * batch_size)
train, test = all_data_windowed[:-test_length,:], all_data_windowed[-test_length:,:]
train_length = int(np.floor(train.shape[0] / batch_size)*batch_size) 
train = train[:train_length,...]

half_size = int(SLIDING_WINDOW_LENGTH/2) # split the examples half-half, to forecast the second half
X_train, y_train = train[:,:half_size], train[:,half_size:]
X_test, y_test = test[:,:half_size], test[:,half_size:]

# fit the model
lstm_model = fit_lstm(X_train, y_train, batch_size=batch_size, nb_epoch=nb_epochs, neurons=neurons)

# forecast the entire training dataset to build up state for forecasting
X_train_reshaped = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
lstm_model.predict(X_train_reshaped, batch_size=batch_size)

# predict from test dataset
X_test_reshaped = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
yhat = lstm_model.predict(X_test_reshaped, batch_size=batch_size)

#%% Plot prediction vs actual

x_axis_input = range(half_size)
x_axis_output = [x_axis_input[-1]] + list(half_size+np.array(range(half_size)))

fig = pyplot.figure()
ax = fig.add_subplot(111)
line1, = ax.plot(x_axis_input,np.zeros_like(x_axis_input), 'r-')
line2, = ax.plot(x_axis_output,np.zeros_like(x_axis_output), 'o-')
line3, = ax.plot(x_axis_output,np.zeros_like(x_axis_output), 'g-')
ax.set_xlim(np.min(x_axis_input),np.max(x_axis_output))
ax.set_ylim(-4,4)
pyplot.legend(('Input','Actual','Predicted'),loc='upper left')
pyplot.show()

# update plot in a loop
for idx in range(y_test.shape[0]):

    sample_input = X_test[idx]
    sample_truth = [sample_input[-1]] + list(y_test[idx]) # join lists
    sample_predicted = [sample_input[-1]] + list(yhat[idx])

    line1.set_ydata(sample_input)
    line2.set_ydata(sample_truth)
    line3.set_ydata(sample_predicted)
    fig.canvas.draw()
    fig.canvas.flush_events()

    pyplot.pause(.25)

जवाबों:


10

प्रत्यक्ष रूप से, यह संभव नहीं है। हालांकि, यदि आप इसे एक अलग तरीके से मॉडल करते हैं तो आप विश्वास अंतराल प्राप्त कर सकते हैं। आप एक सामान्य प्रतिगमन के बजाय एक निरंतर संभाव्यता वितरण का अनुमान लगा सकते हैं। हर चरण के लिए ऐसा करने से आप अपने वितरण की साजिश कर सकते हैं। इसे करने के तरीके हैं कर्नेल मिक्सचर नेटवर्क ( https://janvdvegt.github.io/2017/06/07/Kernel-Mixture-Networks.html , प्रकटीकरण, मेरा ब्लॉग) या घनत्व मिश्रण नेटवर्क ( http: //edcedar) .buffalo.edu / ~ श्रीहरि / CSE574 / Chap5 / Chap5.7-MixDensityNetworks.pdf ), पहला आधार के रूप में कर्नेल का उपयोग करता है और इन कर्नेल पर मिश्रण का अनुमान लगाता है और दूसरा एक वितरण के मिश्रण का अनुमान लगाता है, जिसमें से प्रत्येक के मापदंडों को शामिल करता है। वितरण। आप मॉडल को प्रशिक्षित करने के लिए लॉग संभावना का उपयोग करते हैं।

अनिश्चितता के लिए मॉडलिंग का एक अन्य विकल्प प्रशिक्षण के दौरान और फिर निष्कर्ष के दौरान ड्रॉपआउट का उपयोग करना है। आप इसे कई बार करते हैं और हर बार जब आप अपने पीछे से एक नमूना प्राप्त करते हैं। आपको केवल नमूने नहीं मिलते हैं, बल्कि इसे लागू करना सबसे आसान है और यह बहुत अच्छा काम करता है।

आपके मामले में आपको उस तरीके के बारे में सोचना होगा जिससे आप t + 10 तक t + 2 उत्पन्न करते हैं। अपने वर्तमान सेटअप के आधार पर आपको पिछले समय के कदम से नमूना लेना होगा और अगले एक के लिए खिलाना होगा। यह पहले दृष्टिकोण के साथ बहुत अच्छी तरह से काम नहीं करता है, न ही दूसरे के साथ। यदि आपके पास 10 आउटपुट प्रति टाइम स्टेप (t + 1 अप टू t + 10) है तो ये सभी एप्रोच अधिक साफ हैं लेकिन थोड़ा कम सहज है।


2
मिश्रण नेटवर्क का उपयोग करना दिलचस्प है, मैं इसे लागू करने का प्रयास करूंगा। : यहाँ छोड़ने वालों के प्रयोग पर कुछ ठोस अनुसंधान है arxiv.org/abs/1709.01907 और arxiv.org/abs/1506.02142
4Oh4

ड्रॉपआउट के लिए एक नोट, आप वास्तव में मोंटे कार्लो ड्रॉपआउट की भविष्यवाणी के विचरण की गणना कर सकते हैं, और इसका उपयोग अनिश्चितता की मात्रा के रूप में कर सकते हैं
चार्ल्स चाउ

यह सच है @CharlesChow लेकिन यह इस संदर्भ में एक विश्वास अंतराल का निर्माण करने का एक खराब तरीका है। मूल्यों को छांटना और संभावित रूप से बहुत तिरछी वितरण के कारण मात्राओं का उपयोग करना बेहतर होगा।
Jan van der Vegt

@JanvanderVegt सहमत हैं, लेकिन आप अभी भी आउटपुट वितरण की धारणा के बिना एमसी ड्रॉपआउट के आंकड़ों का अनुमान लगा सकते हैं, मेरा मतलब है कि आप एमसी ड्रॉपआउट के सीआई के निर्माण के लिए प्रतिशतक या बूटस्ट्रैपिंग का भी उपयोग कर सकते हैं
चार्ल्स चाउ

2

बफ़र शब्द के रूप में अनुरूप भविष्यवाणी आपके लिए दिलचस्प हो सकती है क्योंकि यह कई परिस्थितियों में काम करता है - विशेष रूप से इसे सामान्य वितरित त्रुटि की आवश्यकता नहीं है और यह लगभग किसी भी मशीन लर्निंग मॉडल के लिए काम करता है।

स्कॉट लॉकलिन और हेनरिक लिनुसन द्वारा दो अच्छे परिचय दिए गए हैं ।


1

मैं थोड़ा विचलित करने जा रहा हूं और तर्क देता हूं कि गणना विश्वास अंतराल अभ्यास में है आमतौर पर करने के लिए एक मूल्यवान चीज नहीं है। इसका कारण यह है कि हमेशा आपके द्वारा बनाई जाने वाली मान्यताओं का एक पूरा समूह है। यहां तक ​​कि सबसे सरल रैखिक प्रतिगमन के लिए, आपके पास होना चाहिए

  • रैखिक संबंध।
  • बहुभिन्नरूपी सामान्यता।
  • कोई या थोड़ी बहुसंख्या नहीं।
  • कोई ऑटो-सहसंबंध नहीं।
  • Homoscedasticity।

एक मोंटे कार्लो सिमुलेशन करने के लिए एक बहुत अधिक व्यावहारिक दृष्टिकोण है। यदि आप पहले से ही अपने इनपुट चर के वितरण के आसपास धारणा बनाने या जानने के इच्छुक हैं, तो नमूने का एक पूरा गुच्छा लें और इसे आपको LSTM को खिलाएं, अब आप अपने "आत्मविश्वास अंतराल" की गणना कर सकते हैं।


1

हाँ तुम कर सकते हो। केवल एक चीज जिसे आपको बदलने की आवश्यकता है वह है हानि फ़ंक्शन। मात्रात्मक प्रतिगमन में उपयोग किए गए हानि फ़ंक्शन को लागू करें और इसे एकीकृत करें। इसके अलावा, आप उन अंतरालों का मूल्यांकन करना चाहते हैं। उसके लिए, मैं ICP, MIL और RMIL मेट्रिक्स का उपयोग करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.