Mô hình đa thức (Polynomial Model)
Các mô hình tuyến tính (linear models) giúp chúng ta dễ hình dung và dễ học nhưng là mô hình không thể áp dụng trong thế giới thực. Quỹ đạo viên đạn, vệ tinh, sóng wifi, v.v. là các đường cong phức tạp thay vì là các đường thẳng đơn giản. Áp dụng cho các đường cong này, chúng ta có thể chuyển mô hình hồi quy từ mô hình tuyến tính sang mô hình đa thức.
Trong mô hình tuyến tính, chúng ta sử dụng phương trình đường thẳng hay tuyến tính có dạng:
f(x) = w1x1 + w0 (1)
Trong mô hình đa thức, chúng ta sử dụng phương trình đa thức mũ n – là dạng tổng quát của (1)
Để ý rằng, nếu n = 1 thì phương trình trên sẽ trở thành dạng (1).
Dữ liệu mẫu
Trong bài viết này chúng ta sẽ tìm một được cong tốt nhất (best-fit) cho các điểm dữ liệu (100 điểm) mẫu như hình sau:
Chúng ta có thể viết vài dòng Python để mô phỏng các điểm trên như sau:
import numpy as np import matplotlib.pyplot as plt trX = np.linspace(-1, 1, 101) num_coeffs = 6 # đa thức bậc 5 trY_coeffs = [1, 2, 3, 4, 5, 6] trY = 0 for i in range(num_coeffs): trY += trY_coeffs[i] * np.power(trX, i) trY += np.random.randn(*trX.shape) * 1.5 # dữ liệu tượng trưng cho độ nhiểu hay ồn plt.scatter(trX, trY) plt.show()
Mô hình
Một cách trực quan, đường cong tốt nhất cho những điểm dữ liệu như hình trên không thể là một đường thẳng. Vì dữ liệu mẫu hình trên biểu thị cho một đa thức bậc 5 nên chúng ta có thể tạo một mô hình đa thức bậc 5 như sau:
Đoạn mã Python:
X = tf.placeholder(tf.float32) # placeholder chứa các giá trị mẫu trX Y = tf.placeholder(tf.float32) # placeholder chứa các giá trị mẫu trY def model(X, w): terms = [] for i in range(num_coeffs): term = tf.multiply(w[i], tf.pow(X, i)) terms.append(term) return tf.add_n(terms)
Lưu ý trong mô hình trên chúng ta dùng các hàm từ thư viện TensorFlow nên cần khai báo:
import tensorflow as tf
Huấn luyện mô hình
Để huấn luyện mô hình trên, chúng ta dùng thuật toán Gradient Descent và lặp qua tất cả các điểm dữ liệu nhiều lần (ví dụ 40 lần)
w = tf.Variable([0.] * num_coeffs, name="parameters") # biến W y_model = model(X, w) cost = (tf.pow(Y-y_model, 2)) # hàm mất mát hay chi phí. # Huấn luyện với tỉ lệ học learning_rate train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) for epoch in range(training_epochs): # lặp qua tất cả các điểm dữ liệu # training_epochs lần for (x, y) in zip(trX, trY): sess.run(train_op, feed_dict={X: x, Y: y})
Trong lý thuyết thường dùng hằng số ½ trong hàm mất mát cho tiện việc tính toán nhưng trong trường hợp này chúng ta có thể bỏ qua vì hằng số này ảnh hưởng không đáng kể đến mô hình.
Hiển thị đường cong tốt nhất
Khi đã hoàn tất việc huấn luyện theo tỉ lệ học và số lần lặp cho trước, chúng ta có thể tìm đường cong tốt nhất cho các điểm dữ liệu mẫu như sau:
Đoạn mã Python:
w_val = sess.run(w) # vec tơ W nhận được sau khi huấn luyện sess.close() plt.scatter(trX, trY) trY_new = 0 # giá trị sau khi được huấn luyện for i in range(num_coeffs): trY_new += w_val[i] * np.power(trX, i) plt.plot(trX, trY_new, 'r') plt.show()
Kết luận
Việc sử dụng mô hình đa thức sẽ cho phép tìm ra các đường cong tối ưu cho dữ liệu mẫu nhưng điều này lại không tốt nếu đem áp dụng mô hình cho dữ liệu thực tế, ví dụ giá cả bất động sản, vốn đầy biến động. Vấn đề của mô hình đa thức như trên gọi là overfitting.
Trong bài kế tiếp chúng ta sẽ tìm hiểu kỹ thuật Regularization để xử lý vấn đề overfitting.
Đoạn mã hoàn chỉnh tại đây.
Ý kiến bài viết