Regularized linear regression

Machine Learning cơ bản với NumPy

0.0 (0 đánh giá)
Tạo bởi Huy Trịnh Cập nhật lần cuối 5 năm trước 12.724 lượt xem 11 bình luận
Tác giả/Dịch giả: Huy Trịnh
Học nhanh

Danh sách bài học

Regularized linear regression

Dẫn nhập

Trong bài trước, chúng ta đã tìm hiểu về TẠO POLYNOMIAL FEATURE.

Ở bài này Kteam sẽ giới thiệu về Regularized linear regression để giúp thuật toán chúng ta tránh rơi vào tình trạng overfit.


Nội dung

Để theo dõi bài này tốt nhất bạn cần có kiến thức về:

Trong bài này chúng ta sẽ tìm hiểu về:

  • Regularization là gì?
  • Regularized cost function cho linear regression
  • Regularized cost gradient và sử dụng thư viện scipy để train thuật toán
  • Regularized normal equation cho linear regression

Regularization là gì?

Khi chúng ta gặp phải vấn đề về overfit, regularization là một trong những giải pháp hiệu quả để giải quyết trường hợp này, giúp chúng ta tránh overfit nhưng vẫn giữ nguyên tính bao quát của thuật toán (không cần phải loại bỏ bất kì feature nào của training set). Cách hoạt động của regularization là giảm độ lớn của các theta đi, làm giảm sức ảnh hưởng của một số feature khiến hàm h_\theta(x) đơn giản hơn, tránh được overfit (vì hàm dự đoán càng phức tạp thì càng dễ rơi vào overfit).

Lưu ý:

  • Nếu chúng ta tăng parameter lambda của regularization lên quá cao (đồng nghĩa với việc sử dụng regularization quá mức), thuật toán của chúng ta sẽ rơi vào trường hợp underfit.
  • Chúng ta sẽ không thực hiện regularization trên feature x0

Regularized cost function

Đầu tiên chúng ta sẽ thực hiện regularized cho hàm cost. Để làm việc này chúng ta chỉ cần thêm một hạng tử regularization vào hàm J(θ) là được:

J(\theta)=\frac{1}{2m} * \sum_{i=0}^m(h_\theta(x^{(i)}) - y^{(i)})^2 +\frac{\lambda}{2m}* \sum_{j=1}^n\theta_{(j)}^2

Trong đó:

  • \frac{1}{2m} * \sum_{i=0}^m(h_\theta(x^{(i)}) - y^{(i)})^2 là công thức hàm cost bình thường (chưa thêm hạng tử regularization vào)
  • \lambda (lambda) là parameter regularization, quyết định “cường độ” của việc regularization
  • \sum_{j=1}^n\theta_{(j)}^2 dùng để tính tổng các bình phương theta, chỉ lấy từ θ1 đến θn , không lấy θ0 vì chúng ta không cần phải regularized feature bias x0

Để thuận tiện cho việc lập trình hàm này trong python, chúng ta có thể vectorize nó thành như thế này:

J(\theta)=\frac{1}{2m}*(h_\theta(x)-y)^T(h_\theta(x)-y)+\frac{\lambda}{2m}*\theta^T\theta

Chúng ta có thể rút gọn thành như vậy vì khi lấy VT * V (với V là 1 vector) thì sẽ đồng nghĩa với việc tính tổng các bình phương của các phần tử trong vector đó.

Bây giờ, chúng ta sẽ lập trình hàm cost regularized này với python. Đầu tiên chúng ta define một hàm mới trong file functions.py với các parameter như sau:

Tiếp theo, ta sẽ khởi tạo một số giá trị để tiện sử dụng:

Sau đó ta sẽ tính error và hạng tử regularization:

Cuối cùng ta chỉ việc tính J(θ) dựa theo công thức:

Vậy là chúng ta đã lập trình được hàm J(θ) regularized. Tiếp theo, để train thuật toán, ta cần phải có đạo hàm của hàm này (để biết được “độ dốc” của J(θ) tại một vị trí θ nhất định)


Regularized cost gradient và sử dụng thư viện scipy để train thuật toán

Regularized cost gradient

Kteam đã tính sẵn cho bạn đạo hàm của hàm cost này. Đối với θ0, chúng ta sẽ không thực hiện regularization nên công thức sẽ là:

\frac{\partial J(\theta)}{\partial \theta_0} = \frac{1}{m} * \sum_{i=0}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}

Đối với \theta_1 đến \theta_n , ta sẽ thêm hạng tử regularization nên công thức sẽ như sau:

\frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} * \sum_{i=0}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\lambda}{m}*\theta_{(j)}

Trong đó:

  • \frac{1}{m} * \sum_{i=0}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} chính là đạo hàm của hàm J(θ) khi chưa regularized, Kteam đã đề cập trong các bài trước.
  • \frac{\lambda}{m}*\theta_{(j)}  chính là đạo hàm của hạng tử regularization, được thêm vào đối với các theta từ 1 tới n.

Để tránh phải sử dụng hàm tổng, ta có thể vectorized công thức thành:

\frac{\partial J(\theta)}{\partial \theta_0}=\frac{1}{m}*x_0^T(h_\theta(x)-y)

Đối với \theta_0 và:

\frac{\partial J(\theta)}{\partial \theta_{1..n}}= \frac{1}{m}*x^T_{1..n}(h_\theta(x)-y)+\frac{\lambda}{m}*\theta_{1..n}

Đối với θ1 đến θn . Ta có thể vectorized được như trên vì  sẽ tương đương với việc tính tổng các tích đơn thuần bằng hàm tổng.

Chúng ta tiếp tục define thêm 1 hàm grad_reg trong file functions:

Đầu tiên ta sẽ khởi tạo một số biến cần sử dụng:

Tiếp theo là tính error, cost gradient cho θ0 và cost gradient cho các theta còn lại:

Sử dụng thư viện scipy để train thuật toán

Để train thuật toán, bạn có thể tự lập trình Gradient Descent với công thức:

For i in range(iter)

\theta = \theta - \alpha * cost\_ grad

Ở bài này Kteam sẽ hướng dẫn các bạn 1 cách khác, đó là sử dụng thư viện scipy để train thuật toán.

Cài đặt scipy

Các bước thực hiện để cài đặt thư viện scipy:

Bước 1: Mở cmd với quyền admin:

Regularized linear regression, Python, Kteam, Howkteam

Tips: Bạn có thể mở nhanh cmd bằng tổ hợp phím Win + R; cmd; Enter.

Bước 2: Gõ lệnh:

python -m pip install [--user] scipy

Kteam khuyến khích bạn sử dụng --user để tránh bị lỗi nếu không có quyền truy cập toàn máy tính (local machine). --user chỉ cài đặt Scipy cho user hiện tại.

Sử dụng scipy để train thuật toán

Bài 11 - Resource

Đầu tiên là phần import các thư viện cần thiết:

Ta load data và tạo các polynomial feature tương tự bài trước:

Tiếp theo là phần train thuật toán bằng hàm scipy.optimize.fmin_cg()

fmin_cg(f, initial_theta, fprime)

Trong đó:

  • f là hàm cost
  • initial_theta là bộ theta ban đầu
  • fprime là đạo hàm của hàm f, cũng chính là hàm grad_reg của chúng ta

Lưu ý: Hàm fmin_cg chỉ truyền vào hàm f fprime 1 parameter là theta vì thế chúng ta phải define lại phiên bản rút gọn của 2 hàm này.

Cuối cùng là gọi hàm fmin_cg để train:

Bạn có thể plot kết quả ra để xem:Nếu bạn không thích hàm này in ra kết quả, bạn có thể truyền thêm keyword argument disp = False

Bạn hãy tự thay đổi lambda và xem kết quả nhé.

Regularized linear regression, Python, Kteam, Howkteam

Regularized linear regression, Python, Kteam, Howkteam

Regularized linear regression, Python, Kteam, Howkteam

Regularized linear regression, Python, Kteam, Howkteam


Regularized normal equation

Chúng ta còn có 1 phương pháp khác để có được bộ theta, đó là normal equation. Kteam sẽ hướng dẫn các bạn cách regularized hàm normal equation.

Công thức normal equation regularized:

\theta = (X^TX+\lambda*L)^{-1}X^Ty

Đây là công thức normal equation bình thường nhưng được thêm regularization term \lambda*L với L là 1 identity matrix kích thước n*n với phần tử 0,0 bằng 0:

L = [0 1 0 0 1 1]

Chúng ta lại tiếp tục define một hàm mới trong file functions:

Sau đó ta chỉ việc áp dụng công thức:Vậy là chúng ta đã lập trình xong regularized normal equation, để sử dụng bạn chỉ cần gọi tới hàm và truyền đầy đủ các parameter vào.


Kết luận

Qua bài này chúng ta đã tìm hiểu về regularized linear regression để tránh được tình trạng overfit.

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Regularized linear regression dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Chào các bạn!! Mình là Huy - một cậu bé đam mê lập trình :D Trong một mùa hè rảnh rỗi trước năm cuối cấp đầy cam go, sau khi đã cày hết 7749 bộ anime thì mình muốn làm một việc gì đó "có ích cho đời" hơn. Từ đó mình đã thành 1 Kter :)))

Liên hệ: huytrinhm@gmail.com

Khóa học

Machine Learning cơ bản với NumPy

Với mục đích giới thiệu đến mọi người về Machine Learning cũng như tạo điểm khởi đầu cho các bạn mới, muốn tham gia và tìm hiểu ban đầu về lĩnh vực khá hot này. Cùng Kteam tìm hiểu về Machine Learning cơ bản với ngôn ngữ Python.

Thông qua khóa học MACHINE LEARNING VỚI NUMPY, Kteam sẽ hướng dẫn các kiến thức cơ bản của thuật toán Machine Learning để các bạn có thể tạo ra những sản phẩm Machine Learning của riêng mình.

Đánh giá

0.0
0 đánh giá
Đánh giá
5
4
3
2
1

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
HEX Pythoner đã bình luận 4 năm trước
# ...

# hàm J_reg rút gọn, chỉ nhận 1 parameter t
j = lambda t: J_reg(X, y, t, l)

# hàm grad_reg rút gọn, chỉ nhận 1 parameter t
g = lambda t: grad_reg(X, y, t, l)

# ...

mình chưa hiểu 2 dòng này cho lắm, 2 hàm J_reg và grad_reg đều có tham số (X, y, theta, l = 0) vậy parameter t truyền vào là biến của hàm lambda, vậy biến t ở đây truyền vào nó lấy giá trị = mấy nhỉ.
Mình muốn xem giá trị của 2 biến j và g thì làm sao ạ.
Cảm ơn 

lam3082004 đã bình luận 4 năm trước

làm xử lí ảnh đi ạ

 

Do Van Trieu đã bình luận 4 năm trước

cho mình hỏi 1 chút. Với machine learning, khi đã ra được predict có các giá trị dự đoán từ bộ data mẫu đưa vào. Như thế mình muốn đưa vào giá trị bất kì của X không có trong bộ data mẫu để dự đoán dựa trên thuật toán đã chạy với data mẫu,thì phải làm thế nào. AD giúp mình với ạ. Thanks ad

Không có video.