रैखिक प्रतिगमन में भार को गैर-नकारात्मक होने के लिए कैसे मजबूर किया जाए


27

मैं एक मानक रेखीय प्रतिगमन का उपयोग कर रहा हूं जो कि अजगर में सीखें। हालाँकि, मैं वेट्स को हर फीचर के लिए पॉजिटिव होने के लिए मजबूर करना चाहूंगा (निगेटिव नहीं), क्या ऐसा कोई तरीका है जिससे मैं इसे पूरा कर सकूं? मैं प्रलेखन में देख रहा था, लेकिन उसे पूरा करने का कोई तरीका नहीं खोज सका। मैं समझता हूं कि मुझे सबसे अच्छा समाधान नहीं मिल सकता है, लेकिन मुझे गैर-नकारात्मक होने के लिए वजन की आवश्यकता है।

जवाबों:


27

आप जो खोज रहे हैं, वह गैर-नकारात्मक कम से कम वर्ग प्रतिगमन है । यह द्विघात प्रोग्रामिंग में एक सरल अनुकूलन समस्या है जहां आपका अवरोध है कि सभी गुणांक (उर्फ वज़न) सकारात्मक होना चाहिए।

यह कहने के बाद कि, Scikit-Learn में गैर-नकारात्मक कम से कम वर्गों का कोई मानक कार्यान्वयन नहीं हैपुल अनुरोध अभी भी खुला है

लेकिन, लगता है कि सिप्पी ने ही इसे लागू किया है

पुनश्च: मैं scipy संस्करण की कोशिश नहीं की है। मैंने इसे पूरी तरह से गुगली करके पाया।


1
रिज प्रतिगमन के बारे में क्या जहां यह सकारात्मक करने के लिए मजबूर है?
चार्ली पार्कर

15

मैं Scikit Learn पर Lasso के साथ वर्कअराउंड का उपयोग करता हूं (यह निश्चित रूप से चीजों को करने का सबसे अच्छा तरीका नहीं है लेकिन यह अच्छी तरह से काम करता है)। लासो के पास एक पैरामीटर है positiveजो Trueगुणांक को सकारात्मक होने के लिए निर्धारित और बाध्य कर सकता है। इसके अलावा, alpha0 के करीब झूठ बोलने के लिए नियमितीकरण गुणांक की स्थापना बिना किसी नियमितीकरण के लसो नकल रैखिक प्रतिगमन बनाती है। यहाँ कोड है:

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. मेरे उदाहरण में मैं चाहता हूं कि जो अल्फा सबसे अच्छा आउट-ऑफ-नमूना काम करता है, इसलिए मैं क्रॉस-मान्यता के साथ लैस्सो वीवी का उपयोग करता हूं।

स्केलेरन डॉक्स बताता है कि आप संख्यात्मक कारणों से अल्फा को 0 पर सेट नहीं करना चाहिए, हालांकि आप सीधे लैस्सो () का भी उपयोग कर सकते हैं और अल्फा पैरामीटर को कम सेट कर सकते हैं क्योंकि आप उचित उत्तर प्राप्त करने के लिए दूर जा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.