So erzwingen Sie, dass Gewichte in der linearen Regression nicht negativ sind

27

Ich verwende eine standardmäßige lineare Regression mit Scikit-Learn in Python. Ich möchte jedoch erzwingen, dass die Gewichte für jedes Merkmal alle positiv sind (nicht negativ). Kann ich das auf irgendeine Weise erreichen? Ich habe in der Dokumentation gesucht, aber keinen Weg gefunden, dies zu erreichen. Ich verstehe, dass ich möglicherweise nicht die beste Lösung bekomme, aber ich muss die Gewichte nicht negativ sein.

Benutzer
quelle

Antworten:

27

Was Sie suchen, ist die nicht negative Regression der kleinsten Quadrate . Es ist ein einfaches Optimierungsproblem bei der quadratischen Programmierung, bei dem Ihre Einschränkung darin besteht, dass alle Koeffizienten (auch als Gewichte bezeichnet) positiv sein sollten.

Allerdings gibt es in Scikit-Learn keine Standardimplementierung von nicht-negativen kleinsten Quadraten. Die Pull-Anfrage ist noch offen .

Sieht aber so aus, als hätte Scipy dasselbe implementiert .

PS: Ich habe die Scipy-Version nicht ausprobiert. Ich habe es nur durch googeln gefunden.

Dawny33
quelle
1
Was ist mit der Gratregression, bei der sie zum Positiven gezwungen wurde?
Charlie Parker
15

Bei Scikit Learn verwende ich eine Problemumgehung mit Lasso (dies ist definitiv nicht die beste Methode, aber sie funktioniert gut). Lasso hat einen Parameter, mit positivedem Truedie Koeffizienten positiv eingestellt und erzwungen werden können. Wenn Sie den Regularisierungskoeffizienten alphaauf nahe 0 einstellen, ahmt das Lasso die lineare Regression ohne Regularisierung nach. Hier ist der Code:

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)
Adarsh ​​Chavakula
quelle
0

Hier ist ein Beispiel, warum Sie dies tun möchten (und ungefähr wie).

Ich habe 3 prädiktive Modelle der Immobilienpreise: linear, Gradientenerhöhung, neuronales Netz.

Ich möchte sie zu einem gewichteten Durchschnitt zusammenfassen und die besten Gewichte finden.

Ich führe eine lineare Regression durch und erhalte eine Lösung mit Gewichten wie -3,1, 2,5, 1,5 und einigen Abschnitten.

Also, was ich stattdessen mit sklearn mache ist

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

Und ich erhalte positive Gewichte, die sich (sehr nahe) zu 1 summieren. In meinem Beispiel möchte ich das Alpha, das am besten außerhalb der Stichprobe funktioniert, also verwende ich LassoCV mit Kreuzvalidierung.

In den sklearn-Dokumenten wird angegeben, dass Sie aus numerischen Gründen kein Alpha auf 0 setzen sollten. Sie können jedoch auch Straight Lasso () verwenden und den Alpha-Parameter so niedrig wie möglich einstellen, um eine vernünftige Antwort zu erhalten.

Rocky McNuts
quelle