机器学习————线性回归
一、概念
线性回归属于监督学习中的回归任务,目标值为连续型数值,如房价、销售额、温度等。
核心内容:输入特征与目标值之间存在线性相关关系,即可以用一条直线或超平面来拟合两者的映射关系。
两种常见形式:
1.单变量线性回归:仅含 1 个输入特征,二维平面中的一条直线拟合公式为拟合。
单变量拟合公式:y=wx+b
2.多变量线性回归:含多个输入特征,属于高维空间中的超平面。
多变量拟合公式:
矩阵形式为 Y=XW+b
目标:找到最优的权重参数w(斜率)和偏置参数b(截距),使得模型预测值与真实值之间的误差最小化。
二、数学原理依据
1.损失函数:线性回归采用均方误差(MSE) 作为损失函数,即所有样本预测值与真实值的误差平方的平均值。公式为:
其中, 是第i个样本的真实值,
是模型对第i个样本的预测值,n是样本总数。
2、参数最优算法:通过最小化均方误差,求解最优参数w和b。常用方法有两种:
- 最小二乘法:直接通过矩阵运算求解参数,适合小样本、少特征场景。
- 梯度下降法:通过迭代更新参数逐步逼近最优解,适合大样本、高维特征场景。
三、python代码实现
整个代码遵循机器学习标准流程:导入工具库、准备数据、划分数据集、模型构建、模型训练、模型预测、结果分析、可视化展示,所有代码均基于 Python,依赖numpy、scikit-learn、matplotlib三个库。
模块一:
# 1. 导入所需库
import numpy as np#导入Python数值计算核心库
from sklearn.linear_model import LinearRegression#导入线性回归模型
from sklearn.model_selection import train_test_split#导入数据集划分函数
from sklearn.metrics import mean_squared_error, r2_score#导入两个回归任务专用评估指标
import matplotlib.pyplot as plt#数据可视化核心库
模块二:
生成一个一维NumPy数组,包含 100 个在[0, 10]区间内均匀分布的数值。
reshape(a,b)用于调整数组形状,-1表示「自动计算该维度的大小」,1表示第二个维度大小为 1。注:sklearn不接受一维特征数组。
np.random.normal(0,1,size=x.shape),作用:生成高斯噪声(正态分布噪声),模拟真实数据的随机波动。注:噪声的标准差设置为1,意味着噪声波动较小,模型容易拟合;若改为5,噪声波动增大,模型拟合效果会变差
# 2. 生成模拟线性数据集(单变量,方便可视化)
# 生成输入特征x:100个均匀分布的样本,转换为sklearn要求的2维数组格式
x = np.linspace(0, 10, 100).reshape(-1, 1)
np.random.seed(42) # 设置随机种子,保证结果可复现
y = 2 * x + 5 + np.random.normal(0, 1, size=x.shape) #y=2x+5+少量高斯噪声
模块三:
使用留出法划分数据集。(大家可以具体看一下这个教程,学一下原理,应用挺普遍的)
# 3. 划分训练集和测试集(7:3比例)
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size=0.3, random_state=42
)
模块四:
lr_model = LinearRegression(),此时lr_model是一个 “空模型”,还未学习任何参数,权重w和偏置b尚未确定,仅初始化了模型的默认配置。LinearRegression()默认参数:采用最小二乘法求解最优参数。
lr_model.fit(x_train, y_train),让lr_model从训练集(x_train, y_train)中学习最优的权重w和偏置b。方法解读:fit()是scikit-learn所有模型的统一训练方法。
# 4. 构建并训练线性回归模型
# 实例化线性回归模型
lr_model = LinearRegression()
# 训练模型:传入训练集特征和训练集目标值,模型自动学习最优w和b
lr_model.fit(x_train, y_train)
模块五:
使用训练完成的模型lr_model,对测试集特征x_test进行预测,得到预测目标值y_pred。方法解读:predict()是scikit-learn所有预测模型的统一预测方法
# 5. 模型预测:用训练好的模型对测试集进行预测
y_pred = lr_model.predict(x_test)
模块六:
# 6. 模型评估:用回归任务常用指标评估模型性能
mse = mean_squared_error(y_test, y_pred) # 均方误差(越小越好)
r2 = r2_score(y_test, y_pred) # 决定系数(越接近1,模型拟合效果越好,最大值为1)
print(f"测试集均方误差(MSE):{mse:.4f}")
print(f"测试集决定系数(R²):{r2:.4f}")
print("=" * 50)
模块七:
绘制训练集的散点图时,使用浅蓝色;绘制测试集数据的散点图,用橙色区分训练集数据。
plt.plot(x, lr_model.predict(x), color="red", linewidth=2, label=f"拟合直线:y={w_learned:.4f}x+{b_learned:.4f}"):(x是直线的 x 坐标,lr_model.predict(x)是由x坐标计算出y值,color="red"直线颜色为红色,设置直线宽度为 2 像素,label=f"拟合直线:y{w_learned:.4f}x+{b_learned:.4f}"展示拟合公式。)
plt.grid(True, alpha=0.3):True显示网格线,alpha=0.3设置网格线透明度为 0.3,避免网格线过浓遮挡数据。
# 7. 结果可视化:直观展示模型拟合效果
plt.rcParams["font.sans-serif"] = ["SimHei"] # 解决中文显示问题
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
# 绘制散点图:真实数据(训练集+测试集)
plt.scatter(x_train, y_train, color="lightblue", label="训练集数据", alpha=0.7)
plt.scatter(x_test, y_test, color="orange", label="测试集数据", alpha=0.7)
# 绘制拟合直线:模型学习到的线性关系
plt.plot(x, lr_model.predict(x), color="red", linewidth=2, label=f"拟合直线:y={w_learned:.4f}x+{b_learned:.4f}")
# 设置图表标签和图例
plt.xlabel("输入特征x")
plt.ylabel("目标值y")
plt.title("线性回归模型拟合效果展示")
plt.legend()
plt.grid(True, alpha=0.3)
# 显示图表
plt.show()
结语
我写的比较基础,大家可以选择性的阅读自己需要的,如果有不足之处大家可以提出。之后我也会更新其它的机器学习方法。谢谢大家的阅读!
更多推荐



所有评论(0)