Scikit Learn - Elastic-Net
Elastic-Net 是一种正则化回归方法,它线性组合了 Lasso 和 Ridge 回归方法中的惩罚项 L1 和 L2。当存在多个相关特征时,它非常有用。Lasso 和 Elastic-Net 之间的区别在于,Lasso 可能会随机选择其中一个特征,而 Elastic-Net 可能会同时选择两个特征。
Sklearn 提供了一个名为 ElasticNet 的线性模型,该模型使用 L1 和 L2 范数进行训练,以对系数进行正则化。这种组合的优势在于,它允许学习稀疏模型,其中很少有权重非零,就像 Lasso 正则化方法一样,同时仍然保持 Ridge 正则化方法的正则化特性。
以下是最小化的目标函数 −
$$\displaystyle\min\limits_{w}\frac{1}{2n_{samples}}\lVert X_{w}-Y Vert_2^2+\alpha ho\lVert W Vert_1+\frac{\alpha\lgroup 1- ho group}{2}\ \lVert W Vert_2^2$$参数
下表列出了 ElasticNet 模块 − 使用的参数。
| 序号 | 参数及说明 |
|---|---|
| 1 |
alpha − 浮点型,可选,默认值 = 1.0 Alpha 是与 L1/L2 项相乘的常数,它是一个调整参数,决定了我们对模型的惩罚程度。默认值为 1.0。 |
| 2 |
l1_ratio − 浮点型 这称为 ElasticNet 混合参数。其范围为 0 <= l1_ratio <= 1。如果 l1_ratio = 1,则惩罚为 L1 惩罚。如果 l1_ratio = 0,则惩罚为 L2 惩罚。如果 l1 比率的值介于 0 和 1 之间,则惩罚为 L1 和 L2 的组合。 |
| 3 |
fit_intercept − 布尔值,可选。默认值:True 此参数指定应向决策函数添加一个常数(偏差或截距)。如果设置为 false,则计算中将不使用截距。 |
| 4 |
tol − 浮点型,可选 此参数表示优化的容差。将比较 tol 值和更新值,如果发现更新值小于 tol,则优化将检查对偶间隙的最优性,并持续进行,直到更新值小于 tol。 |
| 5 |
normalise − 布尔值,可选,默认值 = False 如果此参数设置为 True,则回归量 X 将在回归之前进行归一化。归一化过程将通过减去均值再除以 L2 范数来完成。如果 fit_intercept = False,则此参数将被忽略。 |
| 6 |
precompute − True|False|array-like,默认值=False 通过此参数,我们可以决定是否使用预先计算的Gram矩阵来加快计算速度。为了保持稀疏性,对于稀疏输入,此参数始终为True。 |
| 7 |
copy_X − 布尔值,可选,默认值=True 默认情况下,此参数为True,表示将复制X。但如果设置为 false,X 可能会被覆盖。 |
| 8 |
max_iter − int,可选 顾名思义,它表示共轭梯度求解器的最大迭代次数。 |
| 9 |
warm_start − bool,可选,默认值 = false 将此参数设置为 True,我们可以重用上一次调用 fit 的解作为初始化。如果我们选择默认值,即 false,它将清除先前的解决方案。 |
| 10 |
random_state − int,RandomState 实例或 None,可选,默认值 = none 此参数表示生成的伪随机数的种子,用于对数据进行混洗。以下是选项 −
|
| 11 |
selection − str,默认值为'cyclic'
|
属性
下表包含 ElasticNet 模块 − 使用的属性。
| Sr.No | 属性 &说明 |
|---|---|
| 1 |
coef_ − 数组,形状 (n_tasks, n_features) 此属性提供权重向量。 |
| 2 |
Intercept_ − 数组,形状 (n_tasks) 它表示决策函数中的独立项。 |
| 3 |
n_iter_ − int 它给出了坐标下降求解器为达到指定容差而运行的迭代次数。 |
实现示例
以下 Python 脚本使用 ElasticNet 线性模型,该模型进一步使用坐标下降作为拟合系数 − 的算法。
from sklearn import linear_model ENreg = linear_model.ElasticNet(alpha = 0.5,random_state = 0) ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])
输出
ElasticNet(alpha = 0.5, copy_X = True, fit_intercept = True, l1_ratio = 0.5, max_iter = 1000, normalize = False, positive = False, precompute=False, random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)
示例
现在,一旦拟合完成,模型可以预测新的值,如下所示 −
ENregReg.predict([[0,1]])
输出
array([0.73686077])
示例
对于上述示例,我们可以借助以下 Python 脚本 −
获取权重向量ENreg.coef_
输出
array([0.26318357, 0.26313923])
示例
类似地,我们可以通过以下 Python 脚本获取截距值 −
ENreg.intercept_
输出
0.47367720941913904
示例
我们可以通过以下 Python 脚本获取达到指定容差所需的迭代次数 −
ENreg.n_iter_
输出
15
我们可以更改这些值alpha(趋近于 1)以获得更好的模型结果。
示例
让我们看一个 alpha = 1 的相同示例。
from sklearn import linear_model ENreg = linear_model.ElasticNet(alpha = 1,random_state = 0) ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2]) Output ElasticNet(alpha = 1, copy_X = True, fit_intercept = True, l1_ratio = 0.5, max_iter = 1000, normalize = False, positive = False, precompute = False, random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False) #预测新值 ENreg.predict([[1,0]]) 输出 array([0.90909216]) #权重向量 ENreg.coef_ 输出 array([0.09091128, 0.09090784]) #计算截距 ENreg.intercept_ 输出 0.818180878658411 #计算迭代次数 ENreg.n_iter_ Output 10
从以上示例,我们可以看出输出的差异。

