我认为下面的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]?
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]