RNN dengan banyak fitur

27

Saya memiliki sedikit pengetahuan otodidak yang bekerja dengan algoritma Machine Learning (jenis dasar Random Forest dan Linear Regression). Saya memutuskan untuk bercabang dan mulai belajar RNN dengan Keras. Ketika melihat sebagian besar contoh, yang biasanya melibatkan prediksi stok, saya belum dapat menemukan contoh dasar beberapa fitur yang diterapkan selain 1 kolom sebagai tanggal fitur dan yang lainnya sebagai output. Apakah ada hal mendasar utama yang saya lewatkan atau sesuatu?

Jika ada yang punya contoh, saya akan sangat menghargainya.

Terima kasih!

Rjay155
sumber
1
Tidak yakin apa yang Anda maksud dengan "banyak fitur". Jika Anda bermaksud lebih dari satu fitur yang berdampak pada pembelajaran, maka Anda cukup menggunakan matriks desain multivarian. Tolong jelaskan dengan contoh atau sesuatu.
horaceT
@horaceT Saya uraikan di multiple features sini , pertanyaan yang lebih spesifik tentang cara menggunakan RNN untuk prediksi deret waktu dengan fitur yang berisi data numerik dan data non-numerik?
hhh

Jawaban:

25

Jaringan saraf berulang (RNN) dirancang untuk mempelajari data sekuens. Seperti yang Anda duga, mereka pasti dapat mengambil banyak fitur sebagai input! Keras 'RNNs mengambil input 2D ( T , F ) dari timesteps T dan fitur F (Saya mengabaikan dimensi batch di sini).

Namun, Anda tidak selalu membutuhkan atau menginginkan catatan waktu menengah, t = 1, 2 ... ( T - 1). Karena itu, Keras secara fleksibel mendukung kedua mode. Untuk mengeluarkan semua timesteps T , kirimkan return_sequences=Trueke RNN Anda (misalnya, LSTMatau GRU) pada konstruksi. Jika Anda hanya ingin catatan waktu terakhir t = T , maka gunakan return_sequences=False(ini adalah default jika Anda tidak meneruskan return_sequenceske konstruktor).

Di bawah ini adalah contoh dari kedua mode ini.

Contoh 1: Mempelajari urutannya

Berikut ini adalah contoh cepat melatih LSTM (tipe RNN) yang menjaga seluruh urutan. Dalam contoh ini, setiap titik data input memiliki 2 timesteps, masing-masing dengan 3 fitur; data output memiliki 2 timesteps (karena return_sequences=True), masing-masing dengan 4 titik data (karena itu adalah ukuran yang saya lewatkan LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    [
        # Target features at timestep 1
        [101, 102, 103, 104],
        # Target features at timestep 2
        [105, 106, 107, 108]
    ],
    # Datapoint 2
    [
        # Target features at timestep 1
        [201, 202, 203, 204],
        # Target features at timestep 2
        [205, 206, 207, 208]
    ]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=True, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=True)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)

Contoh 2: Mempelajari tanda waktu terakhir

Jika, di sisi lain, Anda ingin melatih LSTM yang hanya mengeluarkan stempel waktu terakhir dalam urutan, maka Anda perlu mengatur return_sequences=False(atau hanya menghapusnya dari konstruktor sepenuhnya, karena Falseini adalah default). Dan kemudian data output Anda ( data_ydalam contoh di atas) perlu disusun ulang, karena Anda hanya perlu menyediakan catatan waktu terakhir. Jadi, dalam contoh kedua ini, setiap titik input data masih memiliki 2 waktu, masing-masing dengan 3 fitur. Data keluaran, bagaimanapun, hanyalah sebuah vektor tunggal untuk setiap titik data, karena kami telah meratakan semuanya menjadi satu timestep tunggal. Masing-masing vektor keluaran ini masih memiliki 4 fitur (karena itu adalah ukuran yang saya berikan LSTM).

import keras.layers as L
import keras.models as M

import numpy

# The inputs to the model.
# We will create two data points, just for the example.
data_x = numpy.array([
    # Datapoint 1
    [
        # Input features at timestep 1
        [1, 2, 3],
        # Input features at timestep 2
        [4, 5, 6]
    ],
    # Datapoint 2
    [
        # Features at timestep 1
        [7, 8, 9],
        # Features at timestep 2
        [10, 11, 12]
    ]
])

# The desired model outputs.
# We will create two data points, just for the example.
data_y = numpy.array([
    # Datapoint 1
    # Target features at timestep 2
    [105, 106, 107, 108],
    # Datapoint 2
    # Target features at timestep 2
    [205, 206, 207, 208]
])

# Each input data point has 2 timesteps, each with 3 features.
# So the input shape (excluding batch_size) is (2, 3), which
# matches the shape of each data point in data_x above.
model_input = L.Input(shape=(2, 3))

# This RNN will return timesteps with 4 features each.
# Because return_sequences=False, it will output 2 timesteps, each
# with 4 features. So the output shape (excluding batch size) is
# (2, 4), which matches the shape of each data point in data_y above.
model_output = L.LSTM(4, return_sequences=False)(model_input)

# Create the model.
model = M.Model(input=model_input, output=model_output)

# You need to pick appropriate loss/optimizers for your problem.
# I'm just using these to make the example compile.
model.compile('sgd', 'mean_squared_error')

# Train
model.fit(data_x, data_y)
Adam Sypniewski
sumber
Terima kasih atas penjelasannya. Apa hubungan antara datapoint # 1 dan datapoint # 2. Misalnya, dalam situasi pertama, jika Anda menghapus datapoint 2 dan menempatkannya di bawah datapoint 1, maka sekarang kami memiliki 4 langkah waktu. Bagaimana hal itu memengaruhi model secara keseluruhan?
Rjay155
Tidak ada hubungan khusus antara titik data. Satu set pelatihan pembelajaran mendalam yang baik akan memiliki puluhan ribu atau bahkan jutaan titik data. Satu titik data = satu sampel pelatihan, itu saja. Jika Anda "menggabungkan" titik data # 1 dan # 2, maka data_xhanya akan berisi titik data tunggal, dan titik data tersebut akan memiliki empat cap waktu, masing-masing dari 3 dimensi (dan juga, Anda harus menggabungkan data_ydengan cara yang sama). Jumlah cap waktu yang Anda gunakan hanya tergantung pada apa yang Anda coba modelkan (dan berapa banyak cap waktu yang relevan untuk proses itu).
Adam Sypniewski
@Adam Sypniewski Saya punya pertanyaan tentang y. data_y = numpy.array ([# Datapoint 1 # Fitur target di timestep 2 [[105, 106, 107, 108], [0, 1]], # Datapoint 2 # Fitur target di timestep 2 [[205, 206, 207 , 208], [1, 0]]]) jika salah satu dari saya adalah fitur kategorikal. Bagaimana saya menyusun ini. Terima kasih!
Hua Ye
2
Dalam hal ini, Anda mungkin harus mengumpankan output RNN ke dalam lapisan padat, sehingga setiap catatan waktu keluaran akan dipetakan ke dalam kategori satu-panas.
Adam Sypniewski
Bagaimana Anda bisa memvisualisasikan hasil di sini? Beberapa plot akan bermanfaat.
hhh