線形回帰で重みを非負にする方法


27

Pythonでscikit-learnを使用する標準の線形回帰を使用しています。ただし、すべての機能に対して重みをすべて正(負ではない)にしたいのですが、それを達成する方法はありますか?私はドキュメントを見ていましたが、それを達成する方法を見つけることができませんでした。最善の解決策が得られない可能性があることは理解していますが、重みが負でないことが必要です。

回答:


27

探しているのは、非負の最小二乗回帰です。これは、2次計画法の単純な最適化問題であり、制約はすべての係数(別名、重み)が正であることです。

そうは言っても、Scikit-Learnには非負の最小二乗法の標準的な実装はありませんプルリクエストはまだ開いています。

しかし、Scipyは同じものを実装しているようです。

PS: scipyバージョンは試していません。私はただグーグルでそれを見つけました。


1
それが正に強制された尾根回帰はどうですか?
チャーリーパーカー

15

Scikit LearnでLassoの回避策を使用します(これは間違いなく最善の方法ではありませんが、うまく機能します)。なげなわには、係数を正にpositive設定しTrueたり強制したりできるパラメータがあります。さらに、正則化係数alphaを0に近い値に設定すると、ラッソは正則化なしで線形回帰を模倣します。コードは次のとおりです。

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.