Python机器学习--回归算法--线性回归算法

线性回归算法

线性回归算法类型:

线性回归算法属于有监督学习的回归算法,可以处理标签为连续数据类型的数据。

线性回归算法原理:

通过寻找特征标签之间的关系,生成一个线性方程,通过线性方程预测未知标签。
算法的结果是一个线性方程。
如果特征有一个,对应的结果就是一个一元线性方程。
如果特征存在多个,则结果为N元线性方程。

线性回归算法的特点

1.结果具有可解释性(根据线性方程可以明确的得出结果是如何计算出来的)
2.是逻辑回归算法的基础
3.特征与标签之间具有线性关系

多元线性方程

因为一元线性方程为:y=kx+b,k与b的值比较好求,且实际过程中一元线性关系较少,我们再次不做讨论。
由一元线性方程可得出多元线性方程为:
在这里插入图片描述
则假设,具有n个特征的样本的标签和特征存在一种线性关系,则可定义出多元线性回归:
在这里插入图片描述

线性回归方程系数求解

1.使用正规方程法求解

利用均方误差损失函数进行求导,可以获取回归系数。
均方误差损失函数:
在这里插入图片描述
令均方误差损失函数的导数为0,求取回归系数。
在这里插入图片描述
对该函数求导,可得到
在这里插入图片描述
举例:比如元数据集中共有n个特征,那么求导数的结果会变成一个n+1个特征,1列的数组,分别对象多元线性回归方程中的b值和k值。

该方法的局限性(缺点)
  • 当X的T(即为矩阵X的逆矩阵)不存在时,无法计算。
  • 如果数据集的样本数量较多,或样本特征较多时,计算的复杂度会很大。
  • 适用于数据量小的数据集。

正规方程法基于sklearn实现

from sklearn.linear_model import LinearRegression
# 实例化
alg = LinearRegression()
# 拟合
alg.fit(X_train, y_train)

# 查看回归系数
print('回归系数:', alg.coef_)  # 返回的是一个数组
# 查看截距
print('截距:', alg.intercept_)

# 查看预测结果
y_pred = alg.predict(X_test)
print('预测结果:', y_pred)

# 查看R2
score = alg.score(X_test, y_test)
print('R2:', score)

2.随机梯度法求解

在使用随机梯度下降法时,需要提前对数据进行标准化。
随机梯度下降法,不仅使用了倒数,还使用了偏导数。所谓偏导即为,将要求偏导的项的x作为未知数,其余项全视作常数项,然后进行求导。
和正规方程解类似的,随机梯度下降也在寻找倒数等于0的情况。因此,随机梯度下降法也需要使用均方误差损失函数Loss.
在这里插入图片描述
预测值为:
在这里插入图片描述
随机梯度下降的步骤为:
1.在开始之前会随机出来一组 【w1,w2,w3,w4…wn】
2.根据初始化出来的w和特征值,计算出预测值y
3.利用损失值函数,计算出真实值与预测值的误差和Loss
4.计算误差关于w的偏导(图中的θ即为w)
在这里插入图片描述

5.沿着梯度的负方向更新 w的值
在这里插入图片描述
lr表示学习率,lr是一个小于零的数字,当求出偏导太大时,减去一个很大的值,容易跳过倒数等于0的点,因此需要使用学习率lr来控制w的梯度下降的幅度。
6.多次重复 2-5的步骤,直到达到一定的迭代次数,或者损失值小于某个值为止。

随机梯度下降法基于sklearn实现

from sklearn.linear_model import SGDRegerssor
# 实例化
alg = SGDRegerssor()
# 参数:random_state=1
# 拟合
alg.fit(X_train, y_train)

# 查看回归系数
print('回归系数:', alg.coef_)  # 返回的是一个数组
# 通过观察回归系数的大小可以观察出哪个系数对应的特征对标签影响最大或最小
# 查看截距
print('截距:', alg.intercept_)

# 查看预测结果
y_pred = alg.predict(X_test)
print('预测结果:', y_pred)

# 查看R2
score = alg.score(X_test, y_test)
print('R2:', score)

'''
随机梯度下降可以将样本分为多个分批次操作,避免数据量太大造成影响
'''

线性回归算法缺点:

使用线性回归可能会出现 过拟合问题 和 欠拟合问题
泛化能力:是指模型在未知数聚集上的表现能力。
算法目的:建立一个泛化能力较强的模型(即算法模型不仅在测试集表现好,更在其他未知数据集表现也好)。

欠拟合问题: 在训练集上拟合的不够,在训练集上的效果很差,在测试集上的效果也很差,在未知数据上也很差。
出现的原因:

  • 模型过于简单(可以增加模型的复杂度)
  • 数据集中数据太少
  • 数据集特征数量太少(增加特征或通过特征多项式处理)
特征多项式处理

将原始数据增加至少两列,一列为x的0次方,一列为x的平方。
这样可以将原始的线性方程转为非线性的方程。
举例子:
在特征多项式处理前
在这里插入图片描述
在这里插入图片描述
经过特征多项式处理后:
在这里插入图片描述
在这里插入图片描述
处理后的函数如图:
在这里插入图片描述
处理之后的线变成了曲线,就能处理欠拟合的情况了

特征多项式处理基于sklearn实现:

from sklearn.preprocession import PolynomialFeatures
# 实例化
pf = PolynomialFeatures(degree=2)   # 最大特征大2次方
# 拟合并转化fit_transform
X_new = pf.fit_transform(X)
print('处理后:', X_new)
# 接下来就使用转化后的X_new来进行算法处理

过拟合问题:过拟合:在训练集上过分拟合,在训练集上效果很好,但是在测试集上效果很差,为止数据集效果差
出现原因:

  • 模型过于复杂
  • 特征过多(将冗余的特征,使用正则化处理)
  • 数据的丰富性不够

特征正则化处理:

L1正则化(套索回归):会将部分特征的系数变为0,用来减少特征数量。
L2正则化(岭回归):会将部分特征的系数据趋近于0,用来减少冗余特征与标签的相关性。

L1正则化基于Sklearn实现

from sklearn.linear_model import Lasso
# 实例化
alg = Lasso()
# 参数:alpha:空值正则化力度,等于1就等同于普通线性回归,alpha越大变化的值越多
# 拟合
alg.fit(X_train, y_train)

# 查看回归系数
print('回归系数:', alg.coef_)
# 查看截距
print('截距:', alg.intercept_)

# 查看R2
score = alg.predict(X_test, y_test)
print('R2:', score)

L2正则化基于sklearn实现:

from sklearn.linear_model import Ridge
# 实例化
alg = Ridge()
# 参数:alpha:空值正则化力度,等于1就等同于普通线性回归,alpha越大变化的值越多
# 拟合
alg.fit(X_train, y_train)

# 查看回归系数
print('回归系数:', alg.coef_)
# 查看截距
print('截距:', alg.intercept_)

# 查看R2
score = alg.predict(X_test, y_test)
print('R2:', score)

猜你喜欢

转载自blog.csdn.net/qq_43944517/article/details/119970826
今日推荐