sklearn.linear_model.Lasso不会返回简单的解决方案

时间:2015-10-07 00:08:45

标签: python scikit-learn

我认为关注Lasso问题有一个简单的解决方案[1,2,0,0],因为np.dot(x, [1,2,0,0])会返回[[5,7,6,8]]

clf = linear_model.Lasso(alpha=0.2)
x = np.matrix([[1,3,4,2],[2,2,1,3],[2,1,1,1],[3,1,2,2]]).transpose()
y = [5,7,6,8]
clf.fit(x, y)
print clf.coef_
print clf.intercept_

然而,我无法获得[1,2,0,0]。上面的Lasso代码打印[0,0,6,-0.400,-0.399]和6.600。

为什么上面的代码没有返回[1,2,0,0]?

1 个答案:

答案 0 :(得分:2)

scikit-learn中的默认LASSO模型自动添加一个不受L1惩罚控制的截距(直观地说:你不需要支付大的截距,而大系数由于惩罚而很昂贵)

因此,该模型将尝试尽可能多地从截距中获得解释。

如果你想公平,让模特知道没有拦截,并使用非常低的alpha:

from sklearn import linear_model
import numpy as np

clf = linear_model.Lasso(alpha=0.0001, fit_intercept=False)
x = np.array([[1,3,4,2],[2,2,1,3],[2,1,1,1],[3,1,2,2]], dtype=float).T
y = np.array([5,7,6,8], dtype=float)
clf.fit(x, y)
print(clf.coef_)

然后结果将接近最优,而不是惩罚的解决方案:

[  1.00000732e+00   1.99959807e+00   2.37193884e-03  -1.07734723e-03]