scikit-learn中的Lasson回归和Elastic Net回归

来源:互联网 发布:linux jira破解版下载 编辑:程序博客网 时间:2024/06/06 15:53
原理:
我们知道岭回归是使用二范数(平方项)来对代价函数进行有偏分析。Lasson回归则是使用一范数(绝对值项)对代价函数进行有偏分析。而Elastic net是将二者结合,即使用平方项又使用绝对值项。

用法:
>>> from sklearn import linear_model>>> reg = linear_model.Lasso(alpha = 0.1)>>> reg.fit([[0, 0], [1, 1]], [0, 1])Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,   normalize=False, positive=False, precompute=False, random_state=None,   selection='cyclic', tol=0.0001, warm_start=False)>>> reg.predict([[1, 1]])array([ 0.8])

源码分析:
在scikit-learn中,class Lasso 继承自class ElasticNet,ElasticNet继承于LinearModel和RegressorMixin,而 fit 方法实现于ElasticNet下。可以看出在scikit中,lasso和elastic net是共用了代码。
代码实现了如下代价公式:
1 / (2 * n_samples) * ||y - Xw||^2_2
+ alpha * l1_ratio * ||w||_1
+ 0.5 * alpha * (1 - l1_ratio) * ||w||^2_2
如果说是lasso调用时,则l1_ratio=1.
PS:其实让l1_ratio=0就是岭回归,为什么岭回归要单独实现一套。。。
fit方法里面调用了enet_path方法:
def enet_path(X, y, l1_ratio=0.5, eps=1e-3, n_alphas=100, alphas=None,              precompute='auto', Xy=None, copy_X=True, coef_init=None,              verbose=False, return_n_iter=False, positive=False,              check_input=True, **params):......for i, alpha in enumerate(alphas):        l1_reg = alpha * l1_ratio * n_samples        l2_reg = alpha * (1.0 - l1_ratio) * n_samples        if not multi_output and sparse.isspmatrix(X):            model = cd_fast.sparse_enet_coordinate_descent(                coef_, l1_reg, l2_reg, X.data, X.indices,                X.indptr, y, X_sparse_scaling,                max_iter, tol, rng, random, positive)......
可以看出enet_path方法下调用了cd_fast模块下的sparse_enet_coordinate_descent方法。cd_fast是pyx格式,是使用cython写成的,以提高坐标下降的计算速度。