多元线性回归是回归分析中的一种复杂模型,它考虑了多个输入变量对输出变量的影响。与一元线性回归不同,多元线性回归通过引入多个因素,更全面地建模了系统关系。
在这篇文章中,我们将深入研究多元线性回归的原理,包括模型构建和参数估计方法。与一元线性回归相比,多元线性回归具有更高的预测和解释能力,可以更准确地捕捉各个因素对输出的复杂影响。
我们将讨论如何理解和解释多元线性回归的结果,并介绍在实际应用中如何利用这一模型进行数据分析和预测。通过深入学习多元线性回归,读者将能够更好地利用这一强大的工具,取得更准确和有力的分析结果。
多元线性回归模型的表达式为: f ( x ) = k T x + b f(\mathbf{x})=\mathbf{k^T}\mathbf{x}+b f(x)=kTx+b
其中, x \mathbf{x} x为输入向量,包含多个特征(自变量); f ( x ) f(\mathbf{x}) f(x)为模型的输出或响应(预测的目标变量); k T \mathbf{k^T} kT为特征权重; b b b为是模型的截距或偏置;我们的目标是通过学习 k T \mathbf{k^T} kT和 b b b使得 f ( x ) f(\mathbf{x}) f(x)尽可能的接近真实观测值 y \mathbf{y} y。
为了方便计算和编程,我们可以将 b b b吸收进 x \mathbf{x} x和 k \mathbf{k} k中去,使得 y = k ^ T x ^ y=\mathbf{\hat k^T}\mathbf{\hat x} y=k^Tx^,因为:
y = k T x + b × 1 y=\mathbf{k^T}\mathbf{x}+b\times1 y=kTx+b×1
展开可得:
y = k 1 x 1 + k 2 x 2 + . . . + k d x d + b × 1 y=k_1x_1+k_2x_2+...+k_dx_d+b\times1 y=k1x1+k2x2+...+kdxd+b×1
我们重新令
X = ( x , 1 ) = [ x 1 , x 2 , . . . , x d , 1 ] \mathbf{X}=(\mathbf{x},1)=[x_1,x_2,...,x_d,1] X=(x,1)=[x1,x2,...,xd,1]
k ^ = ( k , b ) = [ k 1 , k 2 , . . . , k d , b ] \mathbf{\hat k}=(\mathbf{k},b)=[k_1,k_2,...,k_d,b] k^=(k,b)=[k1,k2,...,kd,b]
从而得到 y = k ^ T X y=\mathbf{\hat k^T}\mathbf{X} y=k^TX。这样的变形使得模型表达更为简洁,同时不影响其表达能力。
为了衡量模型的性能,我们引入均方误差 J ( k ^ ) : J(\mathbf{\hat k}): J(k^):
J ( k ^ ) = ( y − X k ^ ) T ( y − X k ^ ) J(\mathbf{\hat k})=(\mathbf{y}-\mathbf{X}\mathbf{\hat k})^T(\mathbf{y}-\mathbf{X}\mathbf{\hat k}) J(k^)=(y−Xk^)T(y−Xk^)
我们的优化目标是最小化均方误差,即:
E ( k ^ ⋆ ) = a r g ( k ^ ) m i n ( y − X k ^ ) T ( y − X k ^ ) E(\mathbf{\hat k}^\star)=arg_{(\mathbf{\hat k})}min(\mathbf{y}-\mathbf{X}\mathbf{\hat k})^T(\mathbf{y}-\mathbf{X}\mathbf{\hat k}) E(k^⋆)=arg(k^)min(y−Xk^)T(y−Xk^)
通过最小二乘法,我们对均方误差函数分别对 k ^ \mathbf{\hat k} k^求导数,令其等于零,得到优化的解:
∂ ∂ k ^ E ( k ^ ) = 2 X T ( X k ^ − y ) = 0 \frac{\partial}{\partial \mathbf{\hat k}} E(\mathbf{\hat k})=2\mathbf{X^T(X\hat k-y)}=0 ∂k^∂E(k^)=2XT(Xk^−y)=0
整理并得到:
我们可以把线性模型简写为:
y = k T x + b \mathbf{y}=\mathbf{k^T}\mathbf{x}+b y=kTx+b
若模型假设因变量(或称响应变量)的自然对数与自变量之间存在线性关系。通常,对数线性回归的模型可以写成:
l n y = k T x + b ln\mathbf{y}=\mathbf{k^T}\mathbf{x}+b lny=kTx+b
现在我们算
y = e k T x + b \mathbf{y}=e^{\mathbf{\mathbf{k^T}\mathbf{x}+b}} y=ekTx+b
实际上是通过 e k T x + b e^{\mathbf{\mathbf{k^T}\mathbf{x}+b}} ekTx+b来逼近 y \mathbf{y} y,在形式上 l n y = k T x + b ln\mathbf{y}=\mathbf{k^T}\mathbf{x}+b lny=kTx+b仍然是线性回归。
更一般的考虑任意单调可微函数 g ( ⋅ ) g(\cdot) g(⋅),令
y = g − 1 ( k T x + b ) y=g^{-1}(k^Tx+b) y=g−1(kTx+b)
其中函数 g ( ⋅ ) g(\cdot) g(⋅)称为联系函数, g − 1 ( ⋅ ) g^{-1}(\cdot) g−1(⋅)为 g g g的反函数,显然对数线性回归是一种广义线性模型的特例。
在数学和函数空间理论中,范数是对向量空间中的向量进行度量或测量的一种方法。范数满足一些基本的性质,通常表示为 ∥ v ∥ \|{\mathbf{v}}\| ∥v∥ ,其中 v \mathbf{v} v是向量。
一般来说,一个范数是一个非负的标量函数,对于每个向量 v \mathbf{v} v ,满足以下条件:
岭回归是一种用于处理多重共线性问题的线性回归方法。多重共线性指的是自变量之间存在高度相关性的情况,这可能导致普通最小二乘法估计的不稳定性和过拟合问题。岭回归通过在损失函数中引入正则化项,有效地解决了这些问题。
岭回归的优化目标是最小化以下损失函数:
L ( k ^ ) = ( y − X k ^ ) T ( y − X k ^ ) + α ∥ k ^ ∥ 2 2 L(\hat{\mathbf{k}})=(\mathbf{y}-\mathbf{X} \hat{\mathbf{k}})^T(\mathbf{y}-\mathbf{X} \hat{\mathbf{k}})+\alpha\|\hat{\mathbf{k}}\|_2^2 L(k^)=(y−Xk^)T(y−Xk^)+α∥k^∥22
其中 α \alpha α是岭回归引入的正则化参数,正则化项 α ∥ k ^ ∥ 2 2 \alpha\|\hat{\mathbf{k}}\|_2^2 α∥k^∥22是 L 2 L_2 L2范式的平方,也称为岭回归的平方惩罚。它惩罚回归系数的平方和,使得系数趋向于较小的值,从而减缓过拟合问题。
最小化损失函数的解可以通过对损失函数关于 k ^ \hat{\mathbf{k}} k^的梯度等于零来得到。令梯度为零,得到岭回归的正规方程:
( X T X + α E ) k ^ = X T y \left(\mathbf{X}^T \mathbf{X}+\alpha \mathbf{E}\right) \hat{\mathbf{k}}=\mathbf{X}^T \mathbf{y} (XTX+αE)k^=XTy
岭回归的解可以通过以下方式得到:
k ^ ⋆ = ( X T X + α E ) − 1 X T y \hat{\mathbf{k}}^{\star}=\left(\mathbf{X}^T \mathbf{X}+\alpha \mathbf{E}\right)^{-1} \mathbf{X}^T \mathbf{y} k^⋆=(XTX+αE)−1XTy
其中 ∣ X T X ∣ = 0 |\mathbf{X}^T \mathbf{X}|=0 ∣XTX∣=0,那么 ∣ X T X + α E ∣ ≠ 0 |\mathbf{X}^T \mathbf{X+\alpha E}|\neq0 ∣XTX+αE∣=0,故可知 ( X T X + α E ) (\mathbf{X}^T \mathbf{X+\alpha E}) (XTX+αE)可逆。
最终得到多元线性回归模型:
f ( y ^ i ) = x ^ i ( X T X + α E ) − 1 X T y f(\mathbf{\hat y_i})=\mathbf{\hat x_i}\left(\mathbf{X}^T \mathbf{X}+\alpha \mathbf{E}\right)^{-1} \mathbf{X}^T \mathbf{y} f(y^i)=x^i(XTX+αE)−1XTy
套索回归是一种用于处理线性回归模型的正则化方法,类似于岭回归。套索回归通过在损失函数中引入 L 1 L_1 L1范数正则化项,有助于推动回归系数向零,从而实现特征的稀疏性(某些特征的系数变为零)。
套索回归的优化目标是最小化以下损失函数:
L ( k ^ ) = ( y − X k ^ ) T ( y − X k ^ ) + α ∥ k ^ ∥ 1 L(\hat{\mathbf{k}})=(\mathbf{y}-\mathbf{X} \hat{\mathbf{k}})^T(\mathbf{y}-\mathbf{X} \hat{\mathbf{k}})+\alpha\|\hat{\mathbf{k}}\|_1 L(k^)=(y−Xk^)T(y−Xk^)+α∥k^∥1
其中 α \alpha α是套索回归引入的正则化参数,用于控制正则化项的强度,正则化项 α ∥ k ^ ∥ 1 \alpha\|\hat{\mathbf{k}}\|_1 α∥k^∥1是 L 1 L_1 L1范式,也称为套索回归的绝对值惩罚。它通过对回归系数的绝对值求和来推动系数向零。由于 L 1 L_1 L1范数惩罚的特性,套索回归有助于实现特征的选择,即某些特征的系数变为零,从而达到降维和特征稀疏性的效果。
套索回归的解可以通过最小化损失函数来获得。通过对损失函数关于 k ^ \mathbf{\hat k} k^的梯度等于零,得到套索回归的正规方程:
− 1 n X T ( y − X k ^ ) + α ⋅ sign ( k ^ ) = 0 -\frac{1}{n} \mathbf{X}^T(\mathbf{y}-\mathbf{X} \hat{\mathbf{k}})+\alpha \cdot \operatorname{sign}(\hat{\mathbf{k}})=0 −n1XT(y−Xk^)+α⋅sign(k^)=0
其中 sign ( k ^ ) \operatorname{sign}(\hat{\mathbf{k}}) sign(k^)是回归系数的符号函数。套索回归的解通常需要通过迭代方法(如坐标下降法)求解,因为没有直接的解析解。因为 L 1 L_1 L1范数的非光滑性质,使得套索回归的优化问题不是光滑凸优化问题,梯度下降法并不是直接适用的方法。
Elastic Net是套索回归和岭回归的组合,它同时使用 L 1 L_1 L1和 L 2 L_2 L2正则化项。Elastic Net的损失函数可以写成:
Loss = MSE + α ⋅ ( ρ ⋅ ∑ i = 1 n ∣ w i ∣ + 1 − ρ 2 ⋅ ∑ i = 1 n w i 2 ) \operatorname{Loss}=\operatorname{MSE}+\alpha \cdot\left(\rho \cdot \sum_{i=1}^n\left|w_i\right|+\frac{1-\rho}{2} \cdot \sum_{i=1}^n w_i^2\right) Loss=MSE+α⋅(ρ⋅i=1∑n∣wi∣+21−ρ⋅i=1∑nwi2)
其中:
Elastic Net的优势在于:
综合 L 1 L_1 L1和 L 2 L_2 L2正则化的优点: Elastic Net同时考虑到 L 1 L_1 L1和 L 2 L_2 L2正则化的特点,可以在存在高度相关特征的情况下保持 L 2 L_2 L2正则化的稳定性,并利用 L 1 L_1 L1正则化进行特征选择。
处理多重共线性: 当数据集中存在多个高度相关的特征时,Elastic Net相对于套索回归具有更好的稳定性。
对数几率回归是一种用于解决二分类问题的统计学习方法。尽管名字中包含"回归",但实际上它是一种分类算法,用于估计某个样本属于某个类别的概率。对数几率回归的基本原理是基于线性回归的形式,但通过使用对数几率函数将线性输出映射到概率空间。
对数几率回归的模型表达式如下:
P ( Y = 1 ∣ X ) = 1 1 + e − ( X k ^ + b ) P(Y=1 \mid \mathbf{X})=\frac{1}{1+e^{-(\mathbf{X} \hat{k}+b)}} P(Y=1∣X)=1+e−(Xk^+b)1
其中 P ( Y = 1 ∣ X ) P(Y=1 \mid \mathbf{X}) P(Y=1∣X)是给定输入特征 X \mathbf{X} X条件下样本属于类别1的概率。
对数几率函数 f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+e−z1被称为sigmoid函数,用于将线性组合 X k ^ + b \mathbf{X} \hat{k}+b Xk^+b映射到0到1之间的概率值。
考虑二分类问题,设观测到的数据集为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) } \left\{\left(\mathbf{x}_1, y_1\right),\left(\mathbf{x}_2, y_2\right), \ldots,\left(\mathbf{x}_n, y_n\right)\right\} {(x1,y1),(x2,y2),…,(xn,yn)},其中 x i \mathbf{x_i} xi是输入特征, y i \mathbf{y_i} yi是类别标签(0或1),对应着样本属于类别1的概率。
假设样本是独立同分布的,似然函数可以写成:
L ( k ^ , b ) = ∏ i = 1 n P ( Y = y i ∣ x i ) y i ⋅ ( 1 − P ( Y = y i ∣ x i ) ) 1 − y i L(\hat{\mathbf{k}}, b)=\prod_{i=1}^n P\left(Y=y_i \mid \mathbf{x}_i\right)^{y_i} \cdot\left(1-P\left(Y=y_i \mid \mathbf{x}_i\right)\right)^{1-y_i} L(k^,b)=i=1∏nP(Y=yi∣xi)yi⋅(1−P(Y=yi∣xi))1−yi
其中, P ( Y = y i ∣ x i ) P\left(Y=y_i \mid \mathbf{x}_i\right) P(Y=yi∣xi)是对数几率函数。
为了方便计算,通常对似然函数取对数,得到对数似然函数:
ℓ ( k ^ , b ) = ∑ i = 1 n [ y i log ( P ( Y = 1 ∣ x i ) ) + ( 1 − y i ) log ( 1 − P ( Y = 1 ∣ x i ) ) ] \ell(\hat{\mathbf{k}}, b)=\sum_{i=1}^n\left[y_i \log \left(P\left(Y=1 \mid \mathbf{x}_i\right)\right)+\left(1-y_i\right) \log \left(1-P\left(Y=1 \mid \mathbf{x}_i\right)\right)\right] ℓ(k^,b)=i=1∑n[yilog(P(Y=1∣xi))+(1−yi)log(1−P(Y=1∣xi))]
极大似然估计的目标是最大化对数似然函数。通常使用梯度下降等优化算法来找到能最大化对数似然函数的参数 k ^ \mathbf{\hat k} k^和 b b b。
令 β = ( k ^ , b ) \beta=(\mathbf{\hat k},b) β=(k^,b)对数几率回归的优化问题可以写成:
β ⋆ = a r g ( β ) m i n ℓ ( β ) \beta^\star=arg_{(\beta)}min\ell(\beta) β⋆=arg(β)minℓ(β)
黑塞矩阵是一个包含一个标量函数的二阶偏导数的方块矩阵。对于一个具有多个变量的标量函数,黑塞矩阵包含该函数的所有二阶偏导数信息。在优化算法中,黑塞矩阵通常用于描述目标函数的曲率。
对于一个具有 n n n个变量的标量函数 f ( x ) f(x) f(x),其中 x = [ x 1 , x 2 , . . . , x n ] \mathbf{x}=[x_1,x_2,...,x_n] x=[x1,x2,...,xn]是变量向量,黑塞矩阵 H H H的元素为:
H i j = ∂ 2 f ∂ x i ∂ x j H_{i j}=\frac{\partial^2 f}{\partial x_i \partial x_j} Hij=∂xi∂xj∂2f
黑塞矩阵的维度是 n × n n\times n n×n,其中 n n n是变量的数量。
在数学和优化理论中,黑塞矩阵提供了目标函数的局部二阶导数信息。对于优化算法,特别是牛顿法,黑塞矩阵被用于调整参数的更新步长,以更有效地收敛到函数的局部极小值。
在对数几率回归中,黑塞矩阵描述了对数似然函数的曲率,它的使用通常是为了加速收敛并提高算法的稳定性。然而,计算和存储大型黑塞矩阵可能会带来计算复杂性,因此在实际应用中,可能会使用黑塞矩阵的逆矩阵的近似值,或者采用拟牛顿方法。
本文全面探讨了多元线性回归及其在非满秩矩阵情况下的解决方案。广义线性模型的引入以及岭回归、套索回归的讨论进一步增强了对多元线性回归的理解和应用。对数几率回归作为处理非满秩矩阵的二分类问题的解决方案,为实际应用提供了有效的工具。总体而言,本文为读者提供了深入学习多元线性回归的基础,并为实际数据分析和预测提供了有力支持。
X T X \mathbf{X^TX} XTX满秩情况
以下是工人工作年限、年龄与对应薪水的数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(context="notebook", style="whitegrid", palette="deep")
# 读入数据集
data = pd.read_csv('data/multiple_linear_regression_dataset.csv')
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 提取数据
age = data['age']
experience = data['experience']
income = data['income']
# 绘制三维散点图
ax.scatter(age, experience, income, c='blue', marker='o', label='Data Points')
# 添加标签和标题
ax.set_xlabel('Age')
ax.set_ylabel('Experience')
ax.set_zlabel('Income')
ax.set_title('Three-Dimensional Scatter Plot')
# 显示图形
plt.show()
将 b b b吸收进 x \mathbf{x} x和 k \mathbf{k} k中去,使得 y = k ^ T x ^ y=\mathbf{\hat k^T}\mathbf{\hat x} y=k^Tx^
# 提取 x 向量和 y 向量
X = data[['age', 'experience']]
X['bias'] = 1 # 添加额外的 1 列
Y = data['income']
判断 X T X \mathbf{X^TX} XTX是否满秩。
# 判断X.T * X是否是满秩矩阵
print(np.linalg.matrix_rank(X.T @ X) == min(X.shape[0], X.shape[1]))
输出结果:True,说明 X T X \mathbf{X^TX} XTX满秩,故直接有:
k ^ ⋆ = ( X T X ) − 1 X T y \mathbf{\hat k}^\star=(\mathbf{X^TX})^{-1}\mathbf{X^Ty} k^⋆=(XTX)−1XTy
# 计算参数
k = np.linalg.inv(X.T @ X) @ X.T @ Y
计算得出: k 1 = − 99.195355 k_1=-99.195355 k1=−99.195355, k 2 = 2162.404192 k_2=2162.404192 k2=2162.404192, b = 31261.689854 b=31261.689854 b=31261.689854。
故直线方程为 y = − 99.195355 x 1 + 2162.404192 x 2 + 31261.689854 y=-99.195355x_1+2162.404192x_2+31261.689854 y=−99.195355x1+2162.404192x2+31261.689854。
画出拟合曲线图
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import numpy as np
# 定义直线方程
def linear_equation(age, experience):
return k[0] * age + k[1] * experience + k[2]
# 选择一部分数据进行绘制
sample_size = min(50, len(age)) # 选择样本数量为50或总体数量的最小值
sample_indices = np.random.choice(len(age), size=sample_size, replace=False)
# 创建三维图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制散点图,调整透明度和颜色映射
scatter = ax.scatter(age[sample_indices], experience[sample_indices], income[sample_indices], c=income[sample_indices], cmap='viridis', marker='o', s=80, alpha=0.6, label='Data Points', zorder=2)
# 生成一些数据点用于绘制,调整曲面高度
age_points = np.linspace(20, 60, 200)
experience_points = np.linspace(0, 20, 200)
age_grid, experience_grid = np.meshgrid(age_points, experience_points)
income_pred = linear_equation(age_grid, experience_grid)
# 绘制曲面,调整透明度
ax.plot_trisurf(age_grid.flatten(), experience_grid.flatten(), income_pred.flatten(), cmap='viridis', alpha=0.2, linewidth=0, zorder=1)
# 设置轴标签
ax.set_xlabel('Age')
ax.set_ylabel('Experience')
ax.set_zlabel('Income')
# 调整视角
ax.view_init(elev=40, azim=30)
# 显示图例
ax.legend(handles=[scatter], labels=['Data Points'], loc='upper left')
# 显示图形
plt.show()
X T X \mathbf{X^TX} XTX满秩情况,且是回归问题。
以下数据集是房屋面积、房间数、卧室数量、浴室数量、车库空间、建造年份对应价格的数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(context="notebook", style="whitegrid", palette="deep")
# 读入数据集
data = pd.read_csv('data/predict_room_price.csv')
我们规定前4500条数据是训练集、后500条数据是测试集。
# 划分训练集和测试集
train_data = data.iloc[:4500, :]
test_data = data.iloc[4500:, :]
# 提取训练集的 x 向量和 y 向量
X_train = train_data.iloc[:, :-1]
X_train['bias'] = 1 # 添加额外的 1 列
Y_train = train_data['Price']
# 提取测试集的 x 向量和 y 向量
X_test = test_data.iloc[:, :-1]
X_test['bias'] = 1 # 添加额外的 1 列
Y_test = test_data['Price']
并且判断 X T X \mathbf{X^TX} XTX,输出结果:Is X_train.T * X_train full rank? False
,不满秩!
# 判断 X_train.T * X_train 是否是满秩矩阵
is_full_rank_train = np.linalg.matrix_rank(X_train.T @ X_train) == min(X_train.shape[0], X_train.shape[1])
print("Is X_train.T * X_train full rank?", is_full_rank_train)
# 如果不是满秩,使用岭回归,
alpha = 1.0 # 超参数,需要调整
# 计算岭回归系数
XTX_train = X_train.T @ X_train
XTY_train = X_train.T @ Y_train
identity_matrix_train = np.eye(XTX_train.shape[0])
ridge_coefficients_train = np.linalg.solve(XTX_train + alpha * identity_matrix_train, XTY_train)
得出 k ^ ⋆ = [ 1.84627067 , 2.76940446 , 4.40065163 , 4.13604178 , 0.84099326 , − 0.09549601 , − 7.83477733 ] \hat{\mathbf{k}}^{\star}=[ 1.84627067, 2.76940446, 4.40065163, 4.13604178, 0.84099326, -0.09549601, -7.83477733] k^⋆=[1.84627067,2.76940446,4.40065163,4.13604178,0.84099326,−0.09549601,−7.83477733]
# 在测试集上预测
Y_pred_test = X_test @ ridge_coefficients_train
# 画散点图比较真实值和预测值
plt.figure(figsize=(10, 6))
plt.scatter(Y_test, Y_pred_test, alpha=0.5)
plt.title('Training Set: True Values vs Predicted Values')
plt.xlabel('True Values')
plt.ylabel('Predicted Values')
plt.show()
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 创建套索回归模型
lasso_model = Lasso(alpha=alpha)
# 在训练集上训练套索回归模型
lasso_model.fit(X_train, Y_train)
Y_pred_test_lasso = lasso_model.predict(X_test)
# 画散点图比较真实值和预测值
plt.figure(figsize=(10, 6))
plt.scatter(Y_test, Y_pred_test_lasso, alpha=0.5)
plt.title('Training Set (Lasso Regression): True Values vs Predicted Values')
plt.xlabel('True Values')
plt.ylabel('Predicted Values')
plt.show()
# 计算lasso测试集上的均方误差
mse_test_lasso = np.mean((Y_test - Y_pred_test_lasso)**2)
print(mse_test_lasso)
# 计算brige测试集上的均方误差
brige_test_lasso = np.mean((Y_test - Y_pred_test)**2)
print(brige_test_lasso)
mse_test_lasso=387.3594633205649
brige_test_lasso=387.9778997027562
选择套索回归还是岭回归的因素:
from sklearn.linear_model import ElasticNet
from sklearn.preprocessing import StandardScaler
# 标准化特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 初始化Elastic Net回归模型
alpha_net = 0.01
l1_ratio = 0.5 # l1_ratio 控制 L1 和 L2 的权重,可以根据需求调整
elastic_net = ElasticNet(alpha=alpha_net, l1_ratio=l1_ratio)
# 在训练集上训练模型
elastic_net.fit(X_train_scaled, Y_train)
# 在测试集上预测
Y_pred_test_net = elastic_net.predict(X_test_scaled)
# 计算测试集上的均方误差
mse_test = mean_squared_error(Y_test, Y_pred_test)
print("Mean Squared Error on Test Set (Elastic Net Regression):", mse_test)
elastic_net_lasso=385.770533673404
画出散点图
# 画出测试集真实值与预测值的散点图
plt.scatter(Y_test, Y_pred_test_net, alpha=0.5)
plt.xlabel("True Values")
plt.ylabel("Predictions")
plt.title("Elastic Net:Scatter Plot of True Values vs Predictions")
plt.show()
X T X \mathbf{X^TX} XTX满秩情况,且是分类问题。
以下数据集是学生学习市场对应成绩(过于不过)的数据集。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
# 读取生成的数据集
df = pd.read_csv('data\logistic_regression_dataset.csv')
# 划分特征和目标变量
X = df[['Study Hours']]
y = df['Exam Result']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建对数几率回归模型
logreg_model = LogisticRegression(random_state=42)
# 在训练集上拟合模型
logreg_model.fit(X_train, y_train)
# 预测测试集
y_pred = logreg_model.predict(X_test)
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
print(f'Confusion Matrix:\n{conf_matrix}')
print(f'Classification Report:\n{class_report}')
# 可视化决策边界
sns.scatterplot(x='Study Hours', y='Exam Result', data=df, alpha=0.5)
plt.xlabel('Study Hours')
plt.ylabel('Exam Result (Pass: 1, Fail: 0)')
# 绘制决策边界
x_values = np.linspace(df['Study Hours'].min(), df['Study Hours'].max(), 100)
y_values = logreg_model.predict_proba(x_values.reshape(-1, 1))[:, 1]
plt.plot(x_values, y_values, color='red', linestyle='dashed', linewidth=2, label='Decision Boundary')
plt.legend()
plt.title('Logistic Regression Decision Boundary')
plt.show()
Accuracy: 0.94
Confusion Matrix:
[[ 416 95]
[ 78 2411]]
Classification Report:
precision recall f1-score support
0 0.84 0.81 0.83 511
1 0.96 0.97 0.97 2489
accuracy 0.94 3000
macro avg 0.90 0.89 0.90 3000
weighted avg 0.94 0.94 0.94 3000
总体而言,该模型显示出较高的准确性,对两个类别(0 和 1)的区分能力强。在两个类别上,精确率和召回率都表现良好。加权平均值表明该模型在整个数据集上具有良好的泛化能力。