Chào mừng các bạn quay trở lại với loạt bài về Keras Cơ Bản của tek4.vn. Như tiêu đề của bài viết, trong bài này chúng ta sẽ cùng nhau tìm hiểu về cách phát triển mô hình mạng neural hồi quy. Bắt đầu thôi!
Xem thêm bài viết trước: Phát Triển Các Mô Hình Mạng Neural Tích Chập
Mạng neural hồi quy – Recurrent Neural Networks hay viết tắt là RNN, được thiết kế để hoạt động dựa trên các chuỗi dữ liệu.
Chúng đã được chứng minh là rất hiệu quả đối với các vấn đề xử lý ngôn ngữ tự nhiên trong đó các chuỗi văn bản được cung cấp làm đầu vào cho mô hình. RNN cũng đã đạt được một số thành công khiêm tốn đối với dự báo chuỗi thời gian và nhận dạng giọng nói.
Loại RNN phổ biến nhất là mạng Long Short-Term, gọi tắt là LSTM. LSTM có thể được sử dụng trong một mô hình để chấp nhận một chuỗi dữ liệu đầu vào và đưa ra dự đoán, chẳng hạn như gán nhãn lớp hoặc dự đoán một giá trị số như giá trị tiếp theo hoặc các giá trị trong chuỗi.
Chúng ta sẽ sử dụng tập dữ liệu về doanh số bán xe hơi để chứng minh một LSTM RNN cho dự báo chuỗi thời gian đơn biến.
Bài toán này liên quan đến việc dự đoán số lượng xe bán ra mỗi tháng.
Tập dữ liệu sẽ được tải xuống tự động bằng Pandas, nhưng bạn có thể tìm hiểu thêm về tập dữ liệu tại đây.
Chúng ta sẽ giải quyết vấn đề để lấy dữ liệu của năm tháng qua sau đó dự đoán dữ liệu của tháng hiện tại.
Để đạt được điều này, chúng ta sẽ xác định một hàm mới có tên split_sequence() sẽ chia chuỗi đầu vào thành các sequence into windows thích hợp để điều chỉnh mô hình học có giám sát, như LSTM.
Ví dụ: nếu trình tự là:
1 |
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 |
Sau đó, các mẫu để đào tạo mô hình sẽ như sau:
1 2 3 4 5 |
Input Output 1, 2, 3, 4, 5 6 2, 3, 4, 5, 6 7 3, 4, 5, 6, 7 8 ... |
Chúng ta sẽ sử dụng dữ liệu của 12 tháng qua làm tập dữ liệu thử nghiệm.
LSTM mong đợi mỗi mẫu trong tập dữ liệu có hai dimensions. Đầu tiên là số bước thời gian (trong trường hợp này là 5) và thứ hai là số quan sát trên mỗi bước thời gian (trong trường hợp này là 1).
Bởi vì nó là một bài toán kiểu hồi quy, chúng ta sẽ sử dụng một hàm kích hoạt tuyến tính (không có hàm kích hoạt) trong lớp đầu ra và tối ưu hóa hàm mất mát mean squared error. Chúng ta cũng sẽ đánh giá mô hình bằng cách sử dụng mean absolute error (MAE).
Dưới đây là ví dụ đầy đủ về việc điều chỉnh và đánh giá LSTM cho một bài toán dự báo chuỗi thời gian đơn biến.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# lstm for time series forecasting from numpy import sqrt from numpy import asarray from pandas import read_csv from tensorflow.keras import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.layers import LSTM # split a univariate sequence into samples def split_sequence(sequence, n_steps): X, y = list(), list() for i in range(len(sequence)): # find the end of this pattern end_ix = i + n_steps # check if we are beyond the sequence if end_ix > len(sequence)-1: break # gather input and output parts of the pattern seq_x, seq_y = sequence[i:end_ix], sequence[end_ix] X.append(seq_x) y.append(seq_y) return asarray(X), asarray(y) # load the dataset path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/monthly-car-sales.csv' df = read_csv(path, header=0, index_col=0, squeeze=True) # retrieve the values values = df.values.astype('float32') # specify the window size n_steps = 5 # split into samples X, y = split_sequence(values, n_steps) # reshape into [samples, timesteps, features] X = X.reshape((X.shape[0], X.shape[1], 1)) # split into train/test n_test = 12 X_train, X_test, y_train, y_test = X[:-n_test], X[-n_test:], y[:-n_test], y[-n_test:] print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) # define model model = Sequential() model.add(LSTM(100, activation='relu', kernel_initializer='he_normal', input_shape=(n_steps,1))) model.add(Dense(50, activation='relu', kernel_initializer='he_normal')) model.add(Dense(50, activation='relu', kernel_initializer='he_normal')) model.add(Dense(1)) # compile the model model.compile(optimizer='adam', loss='mse', metrics=['mae']) # fit the model model.fit(X_train, y_train, epochs=350, batch_size=32, verbose=2, validation_data=(X_test, y_test)) # evaluate the model mse, mae = model.evaluate(X_test, y_test, verbose=0) print('MSE: %.3f, RMSE: %.3f, MAE: %.3f' % (mse, sqrt(mse), mae)) # make a prediction row = asarray([18024.0, 16722.0, 14385.0, 21342.0, 17180.0]).reshape((1, n_steps, 1)) yhat = model.predict(row) print('Predicted: %.3f' % (yhat)) |
Chạy ví dụ trước tiên báo cáo shape của tập dữ liệu, sau đó fit mô hình và đánh giá nó trên tập dữ liệu thử nghiệm. Cuối cùng, một dự đoán được đưa ra cho một hàng dữ liệu.
Lưu ý: Kết quả của bạn có thể thay đổi do bản chất ngẫu nhiên của thuật toán hoặc quy trình đánh giá, hoặc sự khác biệt về độ chính xác số. Hãy xem xét chạy ví dụ một vài lần và so sánh kết quả trung bình.
Bạn nhận được kết quả gì? Bạn có thể thay đổi mô hình để làm tốt hơn không? Hãy bình luận kết quả của bạn ở phía dưới bài viết.
Đầu tiên shape của tập train và test được hiển thị, xác nhận rằng 12 ví dụ cuối cùng dùng để đánh giá mô hình.
Trong trường hợp này, mô hình đã đạt được MAE khoảng 2.800 và dự đoán giá trị tiếp theo trong chuỗi từ bộ thử nghiệm là 13.199, trong đó giá trị kỳ vọng là 14.577 (khá gần).
1 2 3 |
(91, 5, 1) (12, 5, 1) (91,) (12,) MSE: 12755421.000, RMSE: 3571.473, MAE: 2856.084 Predicted: 13199.325 |
Lưu ý: bạn nên chia tỷ lệ và làm cho chuỗi dữ liệu cố định trước khi fit mô hình.
Bài viết tiếp theo: Cách Visualize một mô hình học sâu