[ML] Hồi quy logistic (Logistic Regression) – Học Đấu Thầu

Trong các phần trước ta đã tìm hiểu về phương pháp hồi quy tuyến tính để dự đoán đầu ra liên tục, phần này ta sẽ tìm hiểu thêm một thuật toán nữa trong học có giám sát là hồi quy logistic (Logistic Regression) nhằm mục đính phân loại dữ liệu.

Mục lục

1. Định nghĩa

Phương pháp hồi quy logistic là một quy mô hồi quy nhằm mục đích Dự kiến giá trị đầu ra rời rạc ( discrete target variable ) USD y USD ứng với một véc-tơ nguồn vào USD \ mathbf { x } USD. Việc này tương tự với chuyện phân loại các nguồn vào USD \ mathbf { x } USD vào các nhóm USD y USD tương ứng .Ví dụ, xem một bức ảnh có chứa một con mèo hay không. Thì ở đây ta coi đầu ra USD y = 1 USD nếu bước ảnh có một con mèo và USD y = 0 USD nếu bức ảnh không có con mèo nào. Đầu vào USD \ mathbf { x } USD ở đây sẽ là các px một bức ảnh nguồn vào .

Bạn đang đọc: [ML] Hồi quy logistic (Logistic Regression)

Để đơn giản, trước tiên ta sẽ cùng đi tìm hiểu mô hình và cách giải quyết cho bài toán phân loại nhị phân tức là $y=\{0,1\}$. Sau đó ta mở rộng cho trường hợp nhiều nhóm sau.

[ML] Hồi quy logistic (Logistic Regression)

2. Mô hình

Sử dụng giải pháp thống kê ta hoàn toàn có thể coi rằng năng lực một đầu vào USD \ mathbf { x } USD nằm vào một nhóm USD y_0 USD là Phần Trăm nhóm USD y_0 USD khi biết USD \ mathbf { x } USD : USD p ( y_0 | \ mathbf { x } ) USD. Dựa vào công thức xác xuất hậu nghiệm ta có :USD USD \ begin { aligned } p ( y_0 | \ mathbf { x } ) và = \ dfrac { p ( \ mathbf { x } | y_0 ) p ( y_0 ) } { p ( \ mathbf { x } ) } \ cr \ và = \ dfrac { p ( \ mathbf { x } | y_0 ) p ( y_0 ) } { p ( \ mathbf { x } | y_0 ) p ( y_0 ) + p ( \ mathbf { x } | y_1 ) p ( y_1 ) } \ end { aligned } USD USDĐặt : USD USD a = \ ln \ dfrac { p ( \ mathbf { x } | y_0 ) p ( y_0 ) } { p ( \ mathbf { x } | y_1 ) p ( y_1 ) } USD USDTa có : USD USD p ( y_0 | \ mathbf { x } ) = \ dfrac { 1 } { 1 + \ exp ( – a ) } = \ sigma ( a ) USD USD

Hàm $\sigma(a)$ ở đây được gọi là hàm sigmoid (logistic sigmoid function). Hình dạng chữ S bị chặn 2 đầu của nó rất đặt biệt ở chỗ dạng phân phối đều ra và rất mượt.

Ở đây tôi không chứng tỏ, nhưng vận dụng thuyết phân phối chuẩn, ta hoàn toàn có thể chỉ ra rằng : USD USD a = \ mathbf { w } ^ { \ intercal } \ mathbf { x } + w_0 USD USD Đặt : USD \ mathbf { x } _0 = [ 1, …, 1 ] USD, ta hoàn toàn có thể viết gọn lại thành : USD USD a = \ mathbf { w } ^ { \ intercal } \ mathbf { x } USD USDCông thức tính Phần Trăm lúc này : USD USD p ( y_0 | \ mathbf { x } ) = \ dfrac { 1 } { 1 + \ exp ( – a ) } = \ sigma ( \ mathbf { w } ^ { \ intercal } \ mathbf { x } ) USD USDTrong đó, USD \ mathbf { x } USD là thuộc tính nguồn vào còn USD \ mathbf { w } USD là trọng số tương ứng .

Lưu ý rằng cũng như phần hồi quy tuyến tính thì USD \ mathbf { x } USD ở đây không nhất thiết là đầu vào thô của tập dữ liệu mà ta hoàn toàn có thể sử dụng các hàm cơ bản USD \ phi ( \ mathbf { x } ) USD để tạo ra nó. tuy vậy, ở đây để cho ngăn nắp tôi không viết USD \ phi ( \ mathbf { x } ) USD như lần trước nữa .

Có công thức tính được Phần Trăm rồi thì ta hoàn toàn có thể sử dụng một ngưỡng USD \ epsilon \ in [ 0,1 ] USD để quyết định hành động nhóm tương ứng. Cụ thể : USD USD \ begin { cases } \ mathbf { x } \ in y_0 và \ text { if } p ( y_0 | \ mathbf { x } ) \ ge \ epsilon \ cr \ mathbf { x } \ in y_1 và \ text { if } p ( y_0 | \ mathbf { x } )

3. Ước lượng tham số

3.1. Phương pháp GD

Để tối ưu hàm USD J ( \ mathbf { w } ) USD trên, ta lại sử dụng các chiêu thức Gradient Descent để thực thi. Ở đây, đạo hàm của hàm log trên hoàn toàn có thể được tính như sau : USD USD \ begin { aligned } \ frac { \ partial J ( \ mathbf { w } ) } { \ partial w_j } và = \ frac { 1 } { m } \ sum_ { i = 1 } ^ m ( \ sigma_j ^ { ( i ) } – y_j ^ { ( i ) } ) \ mathbf { x } _j ^ { ( i ) } \ cr \ và = \ frac { 1 } { m } \ sum_ { i = 1 } ^ m \ big ( \ sigma ( \ mathbf { w } ^ { \ intercal } \ mathbf { x } _j ^ { ( i ) } ) – y_j ^ { ( i ) } \ big ) \ mathbf { x } _j ^ { ( i ) } \ cr \ và = \ frac { 1 } { m } \ mathbf { X } _j ^ { \ intercal } \ big ( \ mathbf { \ sigma } _j – \ mathbf { y } _j \ big ) \ end { aligned } USD USDVí dụ, theo giải pháp BGD, ta sẽ cập nhập tham số sau mỗi vòng lặp như sau : USD USD \ mathbf { w } = \ mathbf { w } – \ eta \ frac { 1 } { m } \ mathbf { X } ^ { \ intercal } \ big ( \ mathbf { \ sigma } – \ mathbf { y } \ big ) USD USD

3.2. Phương pháp Newton-Raphson

Phương pháp ở phía trên ta chỉ sử dụng đạo hàm bậc nhất được cho phép GD quen thuộc, tuy vậy ở bài toán này việc sử dụng đạo hàm bậc 2 đem tại vận tốc tốt hơn .USD USD \ mathbf { w } = \ mathbf { w } – \ mathbf { H } ^ { – 1 } \ nabla J ( \ mathbf { w } ) USD USDTrong đó, USD \ nabla J ( \ mathbf { w } ) USD là ma trận Jacobi của USD J ( \ mathbf { w } ) USD, còn USD \ mathbf { H } USD là ma trận Hessian của USD J ( \ mathbf { w } ) USD. Hay nói cách khác, USD \ mathbf { H } USD là ma trận Jacobi của USD \ nabla J ( \ mathbf { w } ) USD .Phương pháp này có tên chính thức là Newton-Raphson. Phương pháp này không riêng gì sử dụng riêng cho bài toán hồi quy logistic mà còn hoàn toàn có thể vận dụng cho cả các bài toán hồi quy tuyến tính. tuy vậy, việc triển khai với hồi quy tuyến tính không thực sự phổ cập .Ta có : USD USD \ begin { aligned } \ nabla J ( \ mathbf { w } ) và = \ frac { 1 } { m } \ sum_ { i = 1 } ^ m ( \ sigma ^ { ( i ) } – y ^ { ( i ) } ) \ mathbf { x } ^ { ( i ) } \ cr \ và = \ frac { 1 } { m } \ mathbf { X } ^ { T } \ big ( \ mathbf { \ sigma } – \ mathbf { y } \ big ) \ end { aligned } USD USDĐạo hàm của hàm sigmoid : USD USD \ frac { d \ sigma } { da } = \ sigma ( 1 – \ sigma ) USD USDNên : USD USD \ begin { aligned } \ mathbf { H } và = \ nabla \ nabla J ( \ mathbf { w } ) \ cr \ và = \ frac { 1 } { m } \ sum_ { i = 1 } ^ m \ mathbf { x } ^ { ( i ) } { \ mathbf { x } ^ { ( i ) } } ^ { \ intercal } \ cr \ và = \ frac { 1 } { m } \ sum_ { i = 1 } ^ m \ mathbf { X } ^ { T } \ mathbf { X } \ end { aligned } USD USD

Thế vào công thức cập nhập tham số ta có tham số sau mỗi lần cập nhập là: $$\mathbf{w}=(\mathbf{X}^{T}\mathbf{X})^{-1}\mathbf{X}^{T}\mathbf{y}$$

Như vậy, so với cách lấy đạo hàm bậc 1 thì cách này tỏ ra đơn thuần và nhanh hơn .

4. Lập trình

Dựa vào các nghiên cứu và phân tích phía trên ta thử lập trình với BGD xem sao. Trong bài viết này tôi chỉ để cập tới đoạn mã chính để thực thi việc tối ưu, còn hàng loạt mã nguồn bạn hoàn toàn có thể xem trên Github .Tập dữ liệu được sử dụng ở đây là tài liệu bài tập trong khoá học ML của giáo sư Andrew Ng .

Giờ ta sử dụng phương pháp BGD để tối ưu hàm $J(\mathbf{w})$:bgd.pybgd.py

123456789101112131415161718192021222324252627282930313233343536# gradient descent max step INTERATIONS = 200000 # learning rate ALPHA = 0.001 # calc sigmoid function def sigmoid(z): return 1.0 / (1.0 + np.exp(-z)) # calc J function def compute_cost(X, y, theta): # number of training examples m = y.size # activation h = sigmoid(np.dot(X, theta)) # cost j = – np.sum(y * np.log(h) + (1 – y) * np.log(1 – h)) / m return j # implement BGD def gradient_descent(X, y, theta, alpha, num_inters): # number of training examples m = y.size jHistory = np.empty(num_inters) for i in range(num_inters): delta = np.dot(X.T, sigmoid(np.dot(X, theta))- y) / m theta -= alpha * delta jHistory[i] = compute_cost(X, y, theta) return theta, jHistory # train theta, jHistory = gradient_descent(X, y, np.zeros(X.shape), ALPHA, INTERATIONS) print(theta) # theta: [-7.45017822 0.06550395 0.05898701]

Kết quả thu được : USD USD \ begin { cases } w_0 = – 7.45017822 \ cr w_1 = 0.06550395 \ cr w_2 = 0.05898701 \ end { cases } USD USDThử vẽ đường phân tách với USD \ epsilon = 0.5 USD ta sẽ được :

5. Phân loại nhiều nhóm

Ở phần trên ta vừa nghiên cứu và phân tích giải pháp phân loại 2 nhóm USD y = \ { 0,1 \ } USD, dựa vào đó ta hoàn toàn có thể tổng quát hoá cho bài toán phân loại K nhóm USD y = \ { 1, .., K \ } USD. Về cơ bản 2 có 2 chiêu thức chính là :

Dựa theo phương pháp 2 nhómDựa theo mô hình xác suất nhiều nhóm

Cụ thể thế nào, ta cùng xem chi tiết cụ thể ngày phần dưới đây .

5.1. Dựa theo phương pháp 2 nhóm

Ta hoàn toàn có thể sử dụng giải pháp phân loại 2 nhóm để phân loại nhiều nhóm bằng cách tính xác xuất của tầng nhóm tương ứng rồi chọn nhóm có Tỷ Lệ lớn nhất là đích : USD USD p ( y_k | \ mathbf { x } ) = \ max p ( y_j | \ mathbf { x } ) ~ ~ ~, \ forall j = \ overline { 1, K } USD USDĐoạn quyết định hành động nhóm dựa theo ngưỡng USD \ epsilon USD vẫn trọn vẹn tương tự như như vậy. Nếu USD p ( y_k | \ mathbf { x } ) \ ge \ epsilon USD thì USD \ mathbf { x } \ in y_k USD, còn không thì nó sẽ không thuộc nhóm USD y_k USD .Phương pháp này khá đơn thuần và dễ hiểu tuy vậy việc thực thi hoàn toàn có thể rất tốn kém thời hạn do ta phải tính Phần Trăm của nhiều nhóm. Bởi vậy ta cùng xem 1 giải pháp khác hiệu suất cao hơn như dưới đây .

5.2. Dựa theo mô hình xác suất nhiều nhóm

Tương tự như phân loại 2 nhóm, ta có thể mở rộng ra thành nhiều nhóm với cùng phương pháp sử dụng công thức xác suất hậu nghiệm để được hàm softmax sau: $$ \begin{aligned} p(y_k|\mathbf{x})=p_k&=\frac{p(\mathbf{x}|y_k)p(y_k)}{\sum_jp(\mathbf{x}|y_j)p(y_j)} \cr\ &=\frac{\exp(a_k)}{\sum_j\exp(a_j)} \end{aligned} $$

Với USD a_j = \ log \ Big ( p ( \ mathbf { x } | y_j ) p ( y_j ) \ Big ) = \ mathbf { w } _j ^ { \ intercal } \ mathbf { x } USD. Trong đó, USD \ mathbf { w } _j USD là trọng số tương ứng với nhóm USD j USD, còn USD \ mathbf { x } USD là đầu vào tài liệu. Tập các USD \ mathbf { w } _j USD sẽ được gom lại bằng một ma trận trọng số USD \ mathbf { W } USD với mỗi cột tương ứng với trọng số của nhóm tương ứng .

Ở đây, ta sẽ mã hoá các nhóm của ta thành một véc-to one-hot với phần tử ở chỉ số nhóm tương ứng bằng 1 và các phần tử khác bằng 0. Ví dụ: $y_1=[1,0,…,0], y_3=[0,0,1,0,…,0]$. Tập hợp các véc-tơ này lại ta sẽ có được một ma trận chéo $\mathbf{Y}$ với mỗi cột tương ứng với 1 nhóm. Ví dụ, ma trận sau biểu diễn cho tập 3 nhóm: $$ \mathbf{Y}=\begin{bmatrix} 1 & 0 & 0 \cr 0 & 1 & 0 \cr 0 & 0 & 1 \end{bmatrix} $$

Như vậy, ta hoàn toàn có thể tính Phần Trăm hợp toàn tập với giả sử các tập dữ liệu là độc lập đôi một : USD USD \ begin { aligned } p ( \ mathbf { Y } | \ mathbf { W } ) và = \ prod_ { i = 1 } ^ m \ prod_ { k = 1 } ^ Kp ( y_k | \ mathbf { x } _i ) ^ { Y_ { ik } } \ cr \ và = \ prod_ { i = 1 } ^ m \ prod_ { k = 1 } ^ Kp_ { ik } ^ { Y_ { ik } } \ end { aligned } USD USDTrong đó, USD p_ { ik } = p_k ( \ mathbf { x } _i ) USD. Lấy log ta được hàm lỗi : USD USD J ( \ mathbf { W } ) = – \ sum_ { i = 1 } ^ m \ sum_ { k = 1 } ^ KY_ { ik } \ log p_ { ik } USD USD

Như vậy, ta có thể thấy đây là công thức tổng quát của hàm lỗi trong trường hợp 2 nhóm. Công thức này còn có tên gọi là cross-entropy error function.

Việc tối ưu hàm lỗi này cũng tương tự như như trường hợp 2 nhóm bằng cách lấy đạo hàm : USD USD \ nabla_ { w_j } J ( \ mathbf { W } ) = \ sum_ { i = 1 } ^ m \ big ( p_ { ij } – Y_ { ij } \ big ) \ mathbf { x } _i USD USD

cross-entropy là cách đo độ tựa như giữ 2 phân phối Phần Trăm với nhau. Nếu 2 phần phối càng giống nhau thì cross-entropy của chúng càng nhỏ. Như vậy để tìm quy mô gần với quy mô thực của tập dữ liệu, ta chỉ cần tối thiểu hoá cross-entropy của nó .

6. Over-fitting

Tương tự như phần hồi quy tuyến tính, ta hoàn toàn có thể giải quyết và xử lý overfitting bằng giải pháp thêm thông số chính quy hoá cho hàm lỗi : USD USD J ( \ mathbf { w } ) = – \ frac { 1 } { m } \ sum_ { i = 1 } ^ m \ Big ( y ^ { ( i ) } log \ sigma ^ { ( i ) } + ( 1 – y ^ { ( i ) } ) log ( 1 – \ sigma ^ { ( i ) } ) \ Big ) + \ lambda \ frac { 1 } { m } \ mathbf { w } ^ { \ intercal } \ mathbf { w } USD USDĐạo hàm lúc này sẽ là : USD USD \ frac { \ partial J ( \ mathbf { w } ) } { \ partial w_j } = \ frac { 1 } { m } \ mathbf { X } _j ^ { \ intercal } \ big ( \ mathbf { \ sigma } _j – \ mathbf { y } _j \ big ) + \ lambda \ frac { 1 } { m } w_j USD USD

7. Kết luận

Bài viết lần này đã tổng kết lại chiêu thức phân loại logistic regression dựa vào cách tính Tỷ Lệ của mỗi nhóm. Phương này khá đơn thuần nhưng cho tác dụng rất khả quan và được vận dụng rất nhiều trong đời sống .

Với phân loại nhị phân (2 nhóm), ta có cách tính xác suất: $$p(y_0|\mathbf{x})=\dfrac{1}{1+\exp(-a)}=\sigma(\mathbf{w}^{\intercal}\mathbf{x})$$

Hàm lỗi tương ứng : USD USD J ( \ mathbf { w } ) = – \ frac { 1 } { m } \ sum_ { i = 1 } ^ m \ Big ( y ^ { ( i ) } log \ sigma ^ { ( i ) } + ( 1 – y ^ { ( i ) } ) log ( 1 – \ sigma ^ { ( i ) } ) \ Big ) + \ lambda \ frac { 1 } { m } \ mathbf { w } ^ { \ intercal } \ mathbf { w } USD USDCó đạo hàm : USD USD \ frac { \ partial J ( \ mathbf { w } ) } { \ partial w_j } = \ frac { 1 } { m } \ mathbf { X } _j ^ { \ intercal } \ big ( \ mathbf { \ sigma } _j – \ mathbf { y } _j \ big ) + \ lambda \ frac { 1 } { m } w_j USD USD

Trong thực tế, ta thường xuyên phải phân loại nhiều nhóm. Việc này có thể áp dụng bằng cách lấy nhóm có xác suất lớn nhất hoặc sử dụng softmax để tính xác suất: $$p(y_k|\mathbf{x})=p_k=\frac{\exp(a_k)}{\sum_j\exp(a_j)}$$ Với $a_j=\mathbf{w}_j^{\intercal}\mathbf{x}$, trong đó véc-tơ $\mathbf{w}_j$ là trọng số tương ứng với mỗi nhóm.

Tìm hiểu thêm:

Tìm hiểu thêm: Chất Nào Sau Đây Là Đipeptit

Rate this post

Viết một bình luận