Scikit-learn Python机器学习 - 回归分析算法 - 弹性网络 (Elastic-Net)

锋哥原创的Scikit-learn Python机器学习视频教程:

https://www.bilibili.com/video/BV11reUzEEPH

课程介绍

本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。

Scikit-learn Python机器学习 - 回归分析算法 - 弹性网络 (Elastic-Net)

弹性网络(Elastic Net)是一种结合了L1(Lasso)和L2(Ridge)正则化的线性回归方法。它通过同时使用L1和L2正则化项,克服了Lasso和Ridge回归各自的一些局限性,特别适用于特征数量远大于样本数量(p >> n)或者特征高度相关的情况。

基本数学原理

弹性网络回归的目标函数如下:

  1. 最小二乘误差(Residual Sum of Squares, RSS)

这是弹性网络回归中的误差项,和普通最小二乘回归相同,表示模型的拟合误差。

  1. L1正则化项(Lasso)

这是L1正则化项,作用是通过惩罚回归系数的绝对值,使得一些回归系数趋向于零,从而实现特征选择。它使得模型具备稀疏性(即部分特征的系数为零),特别适合特征数量较多的情况。

  1. L2正则化项(Ridge)

这是L2正则化项,作用是通过惩罚回归系数的平方,使得回归系数趋向于较小的数值,防止模型过拟合。与L1正则化不同,L2正则化不会将回归系数压缩为零,而是将它们的绝对值缩小。

  1. 弹性网络的组合

弹性网络回归通过同时引入 L1 正则化和 L2 正则化,综合了 Lasso 和 Ridge 的优点:

  • Lasso(L1正则化)能够通过将一些回归系数推向零来实现特征选择,特别适合高维数据集。

  • Ridge(L2正则化)可以处理多重共线性(特征之间高度相关)问题,能够将回归系数压缩至较小的值,而不是将其置零。

API介绍

ElasticNet 是结合了 L1(Lasso)和 L2(Ridge)正则化的线性回归模型,适用于处理特征选择和多共线性问题。

复制代码
ElasticNet(alpha=1.0, l1_ratio=0.5, fit_intercept=True, 
          max_iter=1000, tol=1e-4, random_state=None)

核心参数:

1. alpha - 正则化强度

  • 作用: 控制整体正则化的强度

  • 默认值: 1.0

  • 范围: 正浮点数,值越大正则化越强

2. l1_ratio - L1/L2 混合比例

  • 作用: 控制L1和L2正则化的混合比例

  • 默认值: 0.5

  • 范围: 0.0 到 1.0

    • 0.0 = 纯Ridge回归

    • 1.0 = 纯Lasso回归

    • 0.5 = 均等混合

3. fit_intercept - 截距计算

  • 作用: 是否计算模型的截距项

  • 默认值: True

  • 建议: 通常保持为True

4. max_iter - 最大迭代次数

  • 作用: 优化算法的最大迭代次数

  • 默认值: 1000

  • 调整: 复杂问题需要增加此值

5. tol - 收敛精度

  • 作用: 优化的停止准则

  • 默认值: 1e-4

  • 调整: 更小的值=更高精度但更慢

具体示例-加州房价预测

复制代码
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import SGDRegressor, Ridge, ElasticNet
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
​
# 1,加载数据
california = fetch_california_housing()
print(california.data, california.data.shape)
print(california.target)
print(california.feature_names)
​
# 2,数据预处理
X_train, X_test, y_train, y_test = train_test_split(california.data, california.target, test_size=0.2, random_state=20)
scaler = StandardScaler()  # 数据标准化:消除不同特征量纲的影响
X_train_scaled = scaler.fit_transform(X_train)  # fit计算生成模型,transform通过模型转换数据
X_test_scaled = scaler.transform(X_test)  # # 使用训练集的参数转换测试集
​
# 3,创建和训练模型
en_model = ElasticNet()  # 创建分类器实例
en_model.fit(X_train_scaled, y_train)  # 训练模型
print('权重系数:', en_model.coef_)
print('偏置值:', en_model.intercept_)
​
# 4,模型评估
y_predict = en_model.predict(X_test_scaled)
print('预测值:', y_predict)
mse = mean_squared_error(y_test, y_predict)
print('梯度下降方程-均方误差:', mse)

运行结果:

复制代码
[[   8.3252       41.            6.98412698 ...    2.55555556
    37.88       -122.23      ]
 [   8.3014       21.            6.23813708 ...    2.10984183
    37.86       -122.22      ]
 [   7.2574       52.            8.28813559 ...    2.80225989
    37.85       -122.24      ]
 ...
 [   1.7          17.            5.20554273 ...    2.3256351
    39.43       -121.22      ]
 [   1.8672       18.            5.32951289 ...    2.12320917
    39.43       -121.32      ]
 [   2.3886       16.            5.25471698 ...    2.61698113
    39.37       -121.24      ]] (20640, 8)
[4.526 3.585 3.521 ... 0.923 0.847 0.894]
['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
权重系数: [ 0.19036127  0.          0.         -0.         -0.         -0.
 -0.         -0.        ]
偏置值: 2.0678235537790717
预测值: [1.94658326 2.30453906 1.88139745 ... 2.09554362 2.24239959 1.89894401]
梯度下降方程-均方误差: 1.115958465902034
相关推荐
kcoo2 小时前
Jupyter Lab 汉化
linux·开发语言·python
hn小菜鸡3 小时前
LeetCode 2570.合并两个二维数组-求和法
数据结构·算法·leetcode
hn小菜鸡3 小时前
LeetCode 524.通过删除字母匹配到字典里最长单词
算法·leetcode·职场和发展
Greedy Alg3 小时前
LeetCode 226. 翻转二叉树
算法
我要成为c嘎嘎大王3 小时前
【C++】模版专题
c++·算法
jndingxin3 小时前
算法面试(5)------NMS(非极大值抑制)原理 Soft-NMS、DIoU-NMS 是什么?
人工智能·算法·目标跟踪
cfc12435706313 小时前
bazel编译
人工智能·机器学习
苏纪云3 小时前
算法<java>——排序(冒泡、插入、选择、归并、快速、计数、堆、桶、基数)
java·开发语言·算法
滋滋不吱吱4 小时前
栈的进阶篇
数据结构·算法·leetcode