วิธีการบังคับให้น้ำหนักไม่เป็นค่าลบในการถดถอยเชิงเส้น


27

ฉันใช้การถดถอยเชิงเส้นมาตรฐานโดยใช้ scikit เรียนรู้ในหลาม อย่างไรก็ตามฉันต้องการบังคับให้น้ำหนักเป็นค่าบวกสำหรับทุก ๆ คุณสมบัติ (ไม่เป็นลบ) มีวิธีใดบ้างที่ฉันจะบรรลุเป้าหมายดังกล่าวได้? ฉันกำลังดูในเอกสาร แต่ไม่สามารถหาวิธีที่จะทำให้สำเร็จ ฉันเข้าใจว่าฉันอาจจะไม่ได้ทางออกที่ดีที่สุด แต่ฉันต้องการน้ำหนักที่ไม่เป็นลบ

คำตอบ:


27

สิ่งที่คุณกำลังมองหาคือไม่เชิงลบน้อยตารางการถดถอย มันเป็นปัญหาการเพิ่มประสิทธิภาพอย่างง่ายในการเขียนโปรแกรมสมการกำลังสองซึ่งข้อ จำกัด ของคุณคือสัมประสิทธิ์ทั้งหมด (น้ำหนักตุ้ม) ควรเป็นค่าบวก

ต้องบอกว่าไม่มีมาตรฐานการใช้งานของสี่เหลี่ยมจัตุรัสน้อยที่ไม่เป็นลบใน Scikit-Learn คำขอดึงยังคงเปิดอยู่

แต่ดูเหมือนSciPy ได้ดำเนินการเดียวกัน

PS:ฉันยังไม่ได้ลองเวอร์ชัน scipy ฉันพบ แต่เพียงผู้เดียวโดย googling รอบ ๆ


1
สิ่งที่เกี่ยวกับการถดถอยสันที่มันถูกบังคับให้บวก
Charlie Parker

15

ฉันใช้วิธีแก้ปัญหาร่วมกับ Lasso ใน Scikit Learn (ไม่ใช่วิธีที่ดีที่สุดในการทำสิ่งต่าง ๆ แต่ใช้งานได้ดี) Lasso มีพารามิเตอร์positiveที่สามารถตั้งค่าTrueและบังคับค่าสัมประสิทธิ์ให้เป็นค่าบวก นอกจากนี้การตั้งค่าสัมประสิทธิ์การalphaทำให้เป็นปกติอยู่ใกล้กับ 0 ทำให้ Lasso เลียนแบบการถดถอยเชิงเส้นโดยไม่มีการทำให้เป็นมาตรฐาน นี่คือรหัส:

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

นี่คือตัวอย่างของสาเหตุที่คุณต้องการทำ (และวิธีประมาณ)

ฉันมีแบบจำลองการทำนายราคาบ้าน 3 แบบคือแบบเส้นตรงการไล่ระดับสีแบบเลื่อนได้เครือข่ายประสาท

ฉันต้องการผสมผสานพวกมันให้เป็นค่าเฉลี่ยถ่วงน้ำหนักและหาน้ำหนักที่ดีที่สุด

ฉันใช้การถดถอยเชิงเส้นและฉันได้วิธีแก้ปัญหาด้วยน้ำหนักเช่น -3.1, 2.5, 1.5 และการสกัดกั้นบางอย่าง

ดังนั้นสิ่งที่ฉันทำแทนการใช้ sklearn คือ

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

และฉันได้น้ำหนักบวกที่รวมกัน (ใกล้มาก) ถึง 1 ในตัวอย่างของฉันฉันต้องการอัลฟ่าที่ทำงานได้ดีที่สุดของตัวอย่างดังนั้นฉันจึงใช้ LassoCV กับการตรวจสอบข้าม

สถานะเอกสาร sklearn ที่คุณไม่ควรตั้งค่าอัลฟาเป็น 0 สำหรับเหตุผลที่เป็นตัวเลขอย่างไรก็ตามคุณยังสามารถใช้ Lasso แบบตรง () และตั้งค่าพารามิเตอร์อัลฟ่าให้ต่ำที่สุดเพื่อให้ได้คำตอบที่สมเหตุสมผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.