- Scikit Learn 教程
- Scikit Learn - 首页
- Scikit Learn - 简介
- Scikit Learn - 建模过程
- Scikit Learn - 数据表示
- Scikit Learn - 估计器 API
- Scikit Learn - 约定
- Scikit Learn - 线性建模
- Scikit Learn - 扩展线性建模
- 随机梯度下降
- Scikit Learn - 支持向量机
- Scikit Learn - 异常检测
- Scikit Learn - K 近邻
- Scikit Learn - KNN 学习
- 朴素贝叶斯分类
- Scikit Learn - 决策树
- 随机决策树
- Scikit Learn - 集成方法
- Scikit Learn - 聚类方法
- 聚类性能评估
- 使用 PCA 的降维
- Scikit Learn 有用资源
- Scikit Learn - 快速指南
- Scikit Learn - 有用资源
- Scikit Learn - 讨论
Scikit Learn - 弹性网络
弹性网络是一种正则化回归方法,它线性组合了 Lasso 和 Ridge 回归方法的两种惩罚项,即 L1 和 L2。当存在多个相关特征时,它非常有用。Lasso 和弹性网络之间的区别在于,Lasso 可能会随机选择这些特征中的一个,而弹性网络则更有可能同时选择两者。
Sklearn 提供了一个名为 **ElasticNet** 的线性模型,它使用 L1 和 L2 范数进行系数正则化。这种组合的优势在于,它允许学习一个稀疏模型(其中一些权重非零,类似于 Lasso 正则化方法),同时仍然保持 Ridge 正则化方法的正则化特性。
以下是需要最小化的目标函数:
$$\displaystyle\min\limits_{w}\frac{1}{2n_{samples}}\lVert X_{w}-Y\rVert_2^2+\alpha\rho\lVert W\rVert_1+\frac{\alpha\lgroup 1-\rho\rgroup}{2}\ \lVert W\rVert_2^2$$参数
下表列出了 **ElasticNet** 模块使用的参数:
序号 | 参数及描述 |
---|---|
1 |
alpha − float,可选,默认值 = 1.0 Alpha,乘以 L1/L2 项的常数,是决定我们想要对模型进行多少惩罚的调整参数。默认值为 1.0。 |
2 |
l1_ratio − float 这称为弹性网络混合参数。其范围为 0 < = l1_ratio < = 1。如果 l1_ratio = 1,则惩罚项为 L1 惩罚。如果 l1_ratio = 0,则惩罚项为 L2 惩罚。如果 l1 ratio 的值介于 0 和 1 之间,则惩罚项为 L1 和 L2 的组合。 |
3 |
fit_intercept − 布尔值,可选。默认值 = True 此参数指定是否应将常数(偏差或截距)添加到决策函数中。如果设置为 False,则不会在计算中使用截距。 |
4 |
tol − float,可选 此参数表示优化的容差。将比较 tol 值和更新,如果发现更新小于 tol,则优化检查对偶间隙以确定最优性,并继续直到它小于 tol。 |
5 |
normalise − 布尔值,可选,默认值 = False 如果此参数设置为 True,则在回归之前将对回归量 X 进行标准化。标准化将通过减去均值并除以 L2 范数来完成。如果 fit_intercept = False,则此参数将被忽略。 |
6 |
precompute − True|False|类数组,默认值 = 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** 模块使用的属性:
序号 | 属性及描述 |
---|---|
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) #Predicting new values ENreg.predict([[1,0]]) Output array([0.90909216]) #weight vectors ENreg.coef_ Output array([0.09091128, 0.09090784]) #Calculating intercept ENreg.intercept_ Output 0.818180878658411 #Calculating number of iterations ENreg.n_iter_ Output 10
从上面的示例中,我们可以看到输出的差异。