首页 > 编程语言 >Python 机器学习 线性回归和岭回归

Python 机器学习 线性回归和岭回归

时间:2024-02-12 11:22:27浏览次数:24  
标签:Python 回归 np test 线性 默认值 模型

 

Python 机器学习中,机器学习领域的线性回归和岭回归是两种常用的回归分析方法,用于预测一个或多个自变量(或称为特征)和因变量(或称为目标变量)之间的关系。这两种方法都试图找到最佳的线性组合来预测目标变量,但它们在处理数据的方法上有所不同。线性回归和岭回归都是常用的线性回归模型。线性回归简单易理解,但容易过拟合。岭回归可以解决过拟合问题,但会增加模型偏差。在选择模型时,需要根据实际情况进行权衡。

参考文档:Python 机器学习 线性回归和岭回归-CJavaPy

1、线性回归

线性回归是最基本的回归方法,它假设特征和目标变量之间存在线性关系,并试图找到一个线性方程来最好地描述这种关系。线性回归通过最小化误差的平方和(即最小二乘法)来估计模型参数。公式代码如下,

import numpy as np

# 生成数据
X = np.random.rand(100, 2)
y = 2 * X[:, 0] + 3 * X[:, 1] + 1 + np.random.randn(100, 1)

# 添加偏置项
X = np.hstack((np.ones((100, 1)), X))

# 计算系数
w = np.linalg.inv(X.T @ X) @ X.T @ y

# 预测
y_pred = X @ w

# 评估性能
mse = np.mean((y_pred - y)**2)

print("MSE:", mse)

Python的scikit-learn库中,LinearRegression类是用于进行线性回归的一个非常流行的工具。这个类实现了一个使用最小二乘法的线性模型,可以用来预测目标值。常用参数如下,

参数

描述

fit_intercept

布尔值,指定是否需要计算截距项。

如果设置为False,则认为数据已经居中,

不会计算截距项。默认值为True。

normalize

布尔值,指定在拟合模型之前是否需要对数据进行归一化。从 0.24 版本开始,

这个参数被弃用。建议使用

sklearn.preprocessing.StandardScaler

进行预处理。

copy_X

布尔值,指定是否复制X值。

如果为True,则会复制X;

否则,可能会被覆盖。默认值为True。

n_jobs

整数或者None,指定计算时使用的CPU核心数。None意味着使用1个核心,

而-1意味着使用所有可用的核心。默认值为None。

使用代码:

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
import numpy as np

# 加载糖尿病数据集
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

# 划分数据为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# (可选)使用StandardScaler进行数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 初始化LinearRegression模型
# 注意:由于已经手动进行了数据标准化,这里的normalize参数将保持为False(它的默认值)
lr = LinearRegression(fit_intercept=True, copy_X=True, n_jobs=None, positive=False)

# 使用训练集训练模型
lr.fit(X_train_scaled, y_train)

# 使用测试集进行预测
y_pred = lr.predict(X_test_scaled)

# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"模型的均方误差(MSE): {mse:.2f}")
print(f"模型的R^2分数: {r2:.2f}")

参考文档:Python 机器学习 线性回归算法

2、岭回归

岭回归(Ridge Regression)是线性回归的一种改进,主要用于处理特征之间存在多重共线性的情况。多重共线性意味着输入特征之间高度相关,这可能会导致线性回归模型的参数估计非常不稳定,使模型过于敏感于训练数据中的随机误差。公式代码如下,

import numpy as np
from numpy.linalg import inv

def ridge_regression(X, y, lambda_):
    """
    岭回归实现
    :param X: 特征矩阵,shape (n_samples, n_features)
    :param y: 目标变量,shape (n_samples,)
    :param lambda_: 正则化系数
    :return: 岭回归系数
    """
    # 增加一个维度以便能够计算截距项
    X = np.hstack([np.ones((X.shape[0], 1)), X])
    
    # 计算系数 (w):(X^T X + λI)^(-1) X^T y
    I = np.eye(X.shape[1])  # 单位矩阵
    w = inv(X.T.dot(X) + lambda_ * I).dot(X.T).dot(y)
    
    return w

# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6]])
y = np.array([1, 2, 3])
lambda_ = 1  # 正则化系数

# 岭回归计算
coefficients = ridge_regression(X, y, lambda_)
print("岭回归系数:", coefficients)

Python的机器学习库scikit-learn中,岭回归是通过Ridge类实现的。岭回归(Ridge Regression)是一种用于多元回归的技术,尤其适用于当数据点比变量少或存在多重共线性(即输入变量高度相关)的情况。通过引入正则化项(L2惩罚项)来限制参数的大小,从而避免过拟合,提高模型的泛化能力。常用参数如下,

参数描述
alpha 正则化强度;必须是正数,默认值为1.0
较大的值表示更强的正则化。
fit_intercept 是否计算截距项。如果设置为False
预计数据已居中。默认值为True
normalize 在拟合之前是否应该标准化输入变量。
从0.24版本开始,
建议使用StandardScaler进行标准化。
默认值为False
copy_X 是否应该复制X值,或直接在原始数据上操作。
如果设置为False,原始数据可能会被覆盖。
默认值为True
max_iter 求解器的最大迭代次数。对于sag求解器,
这表示求解器运行的最大迭代次数。
默认值依求解器而异。
tol 求解器的收敛标准。
如果在一次迭代中估计的自变量的变化小于此值,
则认为已经收敛。
solver 用于计算的求解器,
包括'auto''svd''cholesky'
'lsqr''sparse_cg''sag'
'saga'。默认为'auto'
random_state solversagsaga时,
用于随机数生成器的种子。

使用示例:Python 机器学习 线性回归和岭回归-CJavaPy

3、线性回归和岭回归对比

线性回归和岭回归都是用于数据分析和预测的回归方法,主要区别在于处理多重共线性和正则化的方式,线性回归适用于变量之间不存在或较少共线性的情况。岭回归适用于变量之间存在高度共线性或者当你需要通过正则化来防止过拟合的情况。当数据集较小,变量之间相对独立时,可以优先考虑使用线性回归。当面对高维数据(特征多)或特征之间存在多重共线性时,岭回归是一个更好的选择,因为它可以提高模型的稳定性和泛化能力。通过引入正则化项,岭回归不仅解决了多重共线性问题,而且还有助于提高模型在未知数据上的预测能力,是处理复杂数据集的有力工具。

方面

线性回归

岭回归

优点

简单易理解

可以解决过拟合问题

缺点

容易过拟合

会导致模型偏差增加

应用场景

数据量小、特征数少

数据量大、特征数多

标签:Python,回归,np,test,线性,默认值,模型
From: https://www.cnblogs.com/tinyblog/p/18013743

相关文章

  • python3.9 + django4.1 + vue3 ,报错,无法访问配置的路由地址,Using the URLconf defined
    python3.9+django4.1+vue3,报错,无法访问配置的路由地址,UsingtheURLconfdefinedinStudentMgrBE.urls,DjangotriedtheseURLpatterns,inthisorder:-------------------------------------------------------------------------------无法访问 地址,报错如下: Us......
  • Python 机器学习 线性回归 梯度下降法优化损失函数
    ​ Python机器学习中,梯度下降法是一种用于优化线性回归模型(以及其他机器学习算法)的损失函数的通用算法。目的是通过迭代地调整模型的参数(权重和截距),以最小化损失函数,例如均方误差(MSE)。梯度下降的基本思想是计算损失函数相对于每个参数的梯度(即偏导数),然后朝着减少损失的方向调......
  • 匀加速运动模拟python,(matplotlib)
    importnumpyasnpimportmatplotlibmatplotlib.use("TKAgg")importmatplotlib.pyplotaspltg=9.8s=100ds=0.00001#单位米v0=0.001#m/sv=[v0]t=[ds/v0]t_sum=0ds_num=int(s/ds)x=[]y=[]foriinrange(ds_num+1):ifi==0:continue......
  • Python通过Lxml库解析网络爬虫抓取到的html
    ​Lxml是基于libxml2解析库的Python封装。libxml2是使用C语言编写的,解析速度很好,不过安装起来稍微有点复杂。安装说明可以参考(http://Lxml.de/installation.html),在CentOS7上中文安装说明(http://www.cjavapy.com/article/64/),使用lxml库来解析网络爬虫抓取到的HTML是一种非常......
  • python基础学习4
    异常处理try-excepttry-except-excepttry-except-except-elsetry-except-except-else-finally:raise关键字raiseException('自定义异常')异常类型ZeroDivisionError除数为零IndexError索引超出范围KeyError字典取值时key不存在NameError使用未声明变量Sy......
  • 八、Python开发环境管理
    AnacondaAnaconda介绍、安装及使用教程-知乎(zhihu.com)如果你已经安装了Anaconda,那么就不再需要再安装Python了。Anaconda是一个集成了Python和大量常用Python库的发行版,它内置了Python环境和多种常用的Python库,可以直接使用。安装Anaconda后,你就可以在命令......
  • 第一章 矩阵与线性方程组
    §1.1域§1.2矩阵的基本运算§1.3\(\text{Gauß}\)消元与矩阵的相抵标准型第一节域定义:一个群是指一个集合\(G(|G|\ge2)\)与二元运算\(*\),满足:封闭性:\(\foralla,b\inG,a*b\inG;\)结合律:\(\foralla,b,c\inG,(a*b)*c=a*(b*c);\)存在恒元:\(\existse\inG.......
  • 第一章 矩阵与线性方程组
    §1.1域§1.2矩阵的基本运算§1.3\(\text{Gauß}\)消元与矩阵的相抵标准型第一节域定义:一个群是指一个集合\(G(|G|\ge2)\)与二元运算\(*\),满足:封闭性:\(\foralla,b\inG,a*b\inG;\)结合律:\(\foralla,b,c\inG,(a*b)*c=a*(b*c);\)存在恒元:\(\existse\inG.\fo......
  • Python--变量和简单数据类型
    Python--变量和简单数据类型变量的命名和使用1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message。1_message="helloworld"#错误写法message_1="helloworld"#正确写法2.变量名不能......
  • 第 7章 Python 爬虫框架 Scrapy(上)
    第7章Python爬虫框架Scrapy(上)编写爬虫可以看成行军打仗,基本的角色有两个:士兵和将军,士兵冲锋陷阵,而将军更多地是调兵遣将。框架就像一个将军,里面包含了爬虫的全部流程、异常处理和任务调度等。除了可以让我们少写一些烦琐的代码,学习框架还可以学到编程思想和提升编程能力。Pyt......