机器学习模型—线性回归
文章目录
机器学习模型及其应用——在线性和非参数化方法研究
基于最小二乘法的一元和多变量数据建模
高阶函数在机器学习中的应用探讨
* 总结
机器学习模型—线性回归
线性回归是一种统计方法,在建模因变数与其他一组自变数之间的关系方面具有广泛的应用。
在线性回归中,
基于一个或多个预测变数(自变数),该方法旨在预测连续目标变数。
在应用线性回归时,默认认为响应变数与解释变数之间存在线性的关联。
线性回归模型的假设
在线性关系中自变量与因变量之间的关联应当呈现直线形态

- 低度或无多重共线性 :假设数据中低度或无多重共线性存在。当特征(或自变量)之间彼此不独立时,则会出现多重共线性问题。
- 低度或无自相关 :另一个假设是数据中低度或无自相关现象发生。当残差误差之间存在相互依赖关系时,则会出现自相关问题。
- 无异常值:我们假定数据集中不存在异常值。这些异常值是指那些远离其他数据点的极端数值。由于其显著偏离整体分布趋势,在分析过程中会对结果造成一定影响。
- 同方差性:同方差性描述了误差项在所有自变量取值水平上的方差保持一致的特性。如图所示:
- 图1展示了同方差性的典型情况;
- 图2则反映了异方差性的特征。

线性回归
线性回归有两种主要类型:
- 简单线性回归: 该过程是基于单个自变量来进行因变量的估计。
- 多元线性回归: 该过程是基于多个自变量来进行因变量的估计。
简单线性回归
单变量线性回归主要用于基于单一预测器预测目标变量。它属于机器学习领域中基础且核心的模型类型之一。在简单线性回归分析中,我们假设两个变量之间存在严格的线性相关关系,即因变量y与自变量x之间可以用一个线性的数学模型来近似描述。通过建立一个线性的数学模型来近似地描述自变量与因变量之间的关系,并试图使其预测结果与实际观测值之间的差异最小化。让我们考虑一个数据集D={(x₁,y₁),(x₂,y₂),…,(xn,yn)}:其中每个样本点xi都对应着其响应值yi

为了一般性,我们定义:
x作为特征向量 ,即x = [x_1, x_2, …., x_n],
y 作为响应向量 ,即 y = [y_1, y_2, …., y_n]
对于n 个 观测值(在上面的示例中,n=10)。上述数据集的散点图如下所示:-

为了实现对任何新特征值对应的y值进行预测,在给定上述散点图中找到一条最佳拟合直线(best fit line)。我们称这条直线为最佳拟合直线(best fit line),其方程表示为:

这里,
- h(x_i) 代表第 i个观测值的预测结果。
- b_0 和 b_1 是回归系数,在回归线中分别代表截距项和斜率。
为了构建我们的模型, 我们必须推导出或计算出回归系数b_0和b_1的具体数值. 待我们确定了这些系数后, 就可以利用该模型来预测响应变量. 在本文中, 我们将采用最小二乘法的基本原理.
现在考虑:

在本研究中, 我们关注的是每个观测值i所对应的残差项 e_i. 因此, 在模型构建过程中我们需要减小总的残差量. 我们将其视为平方误差与成本函数J的一个实例.

我们的目标是确定J(b₀, b₁)达到最小值所需的b₀和b₁值!为了节省数学细节,在此呈现结果。

其中 SS xy是 y 和 x 的交叉偏差之和:

SS xx是 x 的偏差平方和:

多元线性回归
多元线性回归旨在通过建立模型来探讨多个自变量 与因变量 之间的关联。显而易见,这实际上是简单线性回归的一种扩展。假设我们有一个包含p个自变量 和一个因变量 的数据集。
我们定义:
X (特征矩阵) = 大小为n X p 的矩阵,其中 x ij表示第 i 个观察的第 j个特征的值。
所以,

y (响应向量) = 大小为n 的向量,其中 y_{i} 表示第 i 个观测值的响应值。

n 个特征的回归线表示为:

其中 h(x_i) 是第 i 个样本点的预测响应变量 ,而 b_0、b_1、…、b_p 则代表回归系数 。此外,在模型中我们可以表示为:

其中 e_i 表示第 i 个观测值的残差 。我们可以通过将特征矩阵X 表示为:

现在,线性模型可以用矩阵表示为:

为了更好地实现参数估计的目标,在本节中我们将采用最小二乘法来计算被命名为b'的参数。如已所述, 该方法旨在通过最小化总残差来确定最优解的具体数值。具体结果将在后文中详细说明。

其中'代表矩阵转置运算符号(Transpose Operator),而-1代表该矩阵对应的逆矩阵(Inverse Matrix)。已知最小二乘估计b'值,则可表示为多元线性回归模型的参数估计结果。

其中 y’ 是预测值
多元线性回归实现
import pandas as pd
import numpy as np
df=pd.read_csv("house.csv")
df.head(10)
AI助手
这里我们使用的是波士顿房价房价数据

构建特征数据集X和标签数据集y
y=df['median_house_value']
X=df.drop('median_house_value',axis=1)
# 将数据分为训练数据集(80%)和测试数据集(20%)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
AI助手
训练线性回归模型
from sklearn.linear_model import LinearRegression
model = LinearRegression() # 确定线性回归算法
model.fit(X_train, y_train)
AI助手
查看模型训练出来的参数
print('Coefficients: ', model.coef_)
AI助手
Coefficients: [-4.33863939e+04 -4.31113378e+04 1.15576940e+03 -9.28217711e+00
23826022e+02 -3.71486621e+01 4.07777661e+01 4.05767360e+04]
AI助手
查看模型的好坏
print("预测评分:", model.score(X_test, y_test))
AI助手
预测评分: 0.6321014171579491
AI助手
可解释方差分数(Explained Variance Score) 常用于评估回归模型的性能。
定义 :
方差分数(R^2)代表回归模型中响应变量的方差中被预测变量所可解释的部分。
该指标的最大值为1,在此情况下所有响应变量的变化均可由预测变量完全解释;而当值接近0时,则表示模型的预测能力较弱。
计算公式为 R^2 = 1 - \frac{\text{Var}(y - \hat{y})}{\text{Var}(y)} ,其中 \text{Var} 表示方差。可以看出,在预测完全准确的情况下,分子将为零;此时该分数的值即达到最大值1。
我们可以绘制一下残差图
# plot for residual error
# setting plot style
plt.style.use('fivethirtyeight')
# plotting residual errors in training data
plt.scatter(reg.predict(X_train),
reg.predict(X_train) - y_train,
color="green", s=10,
label='Train data')
# plotting residual errors in test data
plt.scatter(reg.predict(X_test),
reg.predict(X_test) - y_test,
color="blue", s=10,
label='Test data')
# plotting line for zero residual error
plt.hlines(y=0, xmin=0, xmax=50, linewidth=2)
# plotting legend
plt.legend(loc='upper right')
# plot title
plt.title("Residual errors")
# method call for showing the plot
plt.show()
AI助手

多项式回归
多项式回归属于 线性回归的一种形式,在这种情况下,自变量x与因变量y之间的关系被表示为n次多项式的形态。在分析中,通过建立x值与其相应条件下因变量y的条件均值(即E(y|x))之间的非线性模型来实现这一目标。
选择多项式回归的阶
多项式回归的阶数设置需要在模型复杂度与预测稳定性之间找到平衡。具体而言,在这种权衡中包含了两个关键考量:一方面是指无论实际因变量取何值时模型始终趋向于相同的预测结果;另一方面则是指在不同的训练数据集下对同一个测试样本可能出现不同预测结果的现象。
通过使用高阶多项式来降低偏差的同时,在这种情况下会提升方差进而可能导致模型过拟合;相比之下,在较低次数的情况下能够降低方差但可能会导致偏差增大。
有若干种方法可用于确定多项式回归模型的最佳阶次参数值。其中一种常用的技术手段是通过交叉验证等技术手段进行评估比较;此外还可以参考赤池信息准则 (AIC) 和贝叶斯信息准则 (BIC) 等统计量来进行模型的选择工作;这些指标能够有效帮助我们判断模型是否过于复杂或过于简单从而实现最佳拟合效果。
多项式回归的实现
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv("Position_Salaries.csv")
df.head(10)
AI助手

创建特征和标签
X = df.iloc[:,1:2].values
y = df.iloc[:,2].values
plt.scatter(X,y,color='red')
AI助手

线性回归
很显然这种现象不属于一个线性关系。因此,在这种情况下,我们直接采用线性回归方法的效果同样不佳。
# 训练模型
from sklearn.linear_model import LinearRegression
lin_reg=LinearRegression()
lin_reg.fit(X,y)
# 画图
plt.scatter(X,y,color='red')
plt.plot(X,lin_reg.predict(X),color='green')
plt.title('Simple Linear Regression')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()
AI助手

二阶函数回归
建议我们优先构建多项式模型。值得注意的是,在这里PolynomialFeatures并不是一个独立的预测模型,在此过程中它仅仅是一个用于特征处理的算法。最终采用的仍然是线性回归模型。
from sklearn.preprocessing import PolynomialFeatures
poly_reg2=PolynomialFeatures(degree=2)
X_poly=poly_reg2.fit_transform(X)
lin_reg_2=LinearRegression()
lin_reg_2.fit(X_poly,y)
AI助手
下面我们画图展示一下
plt.style.use('fivethirtyeight')
plt.scatter(X,y,color='red')
plt.plot(X,lin_reg_2.predict(poly_reg2.fit_transform(X)),color='green')
plt.title('Polynomial Linear Regression Degree 2')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()
AI助手

已经实现了预期目标。值得注意的是,在训练模型时所采用的数据集发生了变化。

其实看到这里我们就明白了,我们本来的X 是

也就是我们将特征从原本的x转换为形式的数据,并且在此过程中我们可以考察回归模型输出的参数。
lin_reg_2.coef
array([ 0. , -132871.21212121, 19431.81818182])
AI助手
那我们就知道我们这个函数应该是y = - 132871 X+19431.81818182X^2
三阶函数回归
同理,我们先创建三阶的PolynomialFeatures 对象
poly_reg3=PolynomialFeatures(degree=3)
X_poly3=poly_reg3.fit_transform(X)
lin_reg_3=LinearRegression()
lin_reg_3.fit(X_poly3,y)
AI助手
这里我们我们把二阶和三阶的图都画出来,对比一下
plt.style.use('fivethirtyeight')
plt.scatter(X,y,color='red')
plt.plot(X,lin_reg_2.predict(poly_reg2.fit_transform(X)),color='green')
plt.plot(X,lin_reg_3.predict(poly_reg3.fit_transform(X)),color='yellow')
plt.title('Polynomial Linear Regression Degree 2-3')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()
AI助手

经过观察发现,在使用三阶模型时表现出显著的优势,在样本量过少的情况下, 我们拟合出的曲线不够光滑. 适当采取措施进行优化.
plt.style.use('fivethirtyeight')
X_grid=np.arange(min(X),max(X),0.1) # This will give us a vector.We will have to convert this into a matrix
X_grid=X_grid.reshape((len(X_grid),1))
plt.scatter(X,y,color='red')
plt.plot(X_grid,lin_reg_3.predict(poly_reg3.fit_transform(X_grid)),color='lightgreen')
#plt.plot(X,lin_reg_3.predict(poly_reg3.fit_transform(X)),color='green')
plt.title('Polynomial Linear Regression Degree 3')
plt.xlabel('Position Level')
plt.ylabel('Salary')
plt.show()
AI助手

总结
在本节中,我们将重点讲解简单线性回归模型的基本概念及其应用方法。随后深入探讨多元线性回归模型的特点及其在实际问题中的适用场景。此外我们还会介绍多项式回归模型这种能够处理非线性关系的技术。实际上,在学习完这些回归方法后你会发现多项式回归与我们之前讲授的数据预处理环节中提到的特征转换有着一定的相似之处其核心在于通过对数据结构的深入分析从而发现变量之间可能存在非线性关系并据此构建相应的预测模型这一过程体现了数据分析与建模之间的内在逻辑。
