回答:
探しているのは、非負の最小二乗回帰です。これは、2次計画法の単純な最適化問題であり、制約はすべての係数(別名、重み)が正であることです。
そうは言っても、Scikit-Learnには非負の最小二乗法の標準的な実装はありません。プルリクエストはまだ開いています。
しかし、Scipyは同じものを実装しているようです。
PS: scipyバージョンは試していません。私はただグーグルでそれを見つけました。
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)
なぜそうするのか(そしてほぼどのように)するかの例を次に示します。
住宅価格の予測モデルには、線形、勾配ブースティング、ニューラルネットワークの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()を使用して、妥当な答えを得るためにアルファパラメータをできるだけ低く設定することもできます。