Làm thế nào để buộc các trọng số không âm trong hồi quy tuyến tính


27

Tôi đang sử dụng một hồi quy tuyến tính tiêu chuẩn bằng cách sử dụng scikit-learn trong python. Tuy nhiên, tôi muốn buộc các trọng số phải tích cực cho mọi tính năng (không phải tiêu cực), có cách nào tôi có thể thực hiện được không? Tôi đã xem tài liệu nhưng không thể tìm ra cách để hoàn thành nó. Tôi hiểu rằng tôi có thể không có được giải pháp tốt nhất, nhưng tôi cần các trọng số là không âm.

Câu trả lời:


27

Những gì bạn đang tìm kiếm, là hồi quy bình phương nhỏ nhất không âm . Đây là một vấn đề tối ưu hóa đơn giản trong lập trình bậc hai trong đó hạn chế của bạn là tất cả các hệ số (còn gọi là trọng số) phải dương.

Phải nói rằng, không có triển khai tiêu chuẩn về bình phương tối thiểu không âm trong Scikit-Learn. Yêu cầu kéo vẫn mở .

Nhưng, có vẻ như Scipy đã thực hiện như vậy .

PS: Tôi chưa thử phiên bản scipy. Tôi tìm thấy nó chỉ bằng cách googling xung quanh.


1
Điều gì về hồi quy sườn núi nơi nó buộc phải tích cực?
Charlie Parker

15

Tôi sử dụng một cách giải quyết với Lasso trên Scikit Learn (Đây chắc chắn không phải là cách tốt nhất để làm mọi thứ nhưng nó hoạt động tốt). Lasso có một tham số positivecó thể được đặt thành Truevà buộc các hệ số là dương. Hơn nữa, việc đặt hệ số Chính quy hóa alphanằm gần 0 sẽ khiến Lasso bắt chước tuyến tính hồi quy không có tính chính quy. Đây là mã:

from sklearn.linear_model import Lasso
lin = Lasso(alpha=0.0001,precompute=True,max_iter=1000,
            positive=True, random_state=9999, selection='random')
lin.fit(X,y)

0

Dưới đây là một ví dụ về lý do tại sao bạn muốn làm điều đó (và khoảng như thế nào).

Tôi có 3 mô hình dự đoán về giá nhà đất: tuyến tính, tăng cường độ dốc, mạng lưới thần kinh.

Tôi muốn pha trộn chúng thành một trung bình có trọng số và tìm trọng lượng tốt nhất.

Tôi chạy hồi quy tuyến tính và tôi nhận được một giải pháp với các trọng số như -3.1, 2.5, 1.5 và một số đánh chặn.

Vì vậy, những gì tôi làm thay vì sử dụng sklearn là

blendlasso = LassoCV(alphas=np.logspace(-6, -3, 7),
                     max_iter=100000,
                     cv=5,
                     fit_intercept=False,
                     positive=True)

Và tôi nhận được trọng số dương tổng (rất gần) đến 1. Trong ví dụ của tôi, tôi muốn alpha hoạt động tốt nhất ngoài mẫu nên tôi sử dụng LassoCV với xác thực chéo.

Các tài liệu sklearn nói rằng bạn không nên đặt alpha thành 0 vì lý do số, tuy nhiên bạn cũng có thể sử dụng Lasso () và đặt tham số alpha ở mức thấp nhất có thể để có câu trả lời hợp lý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.