当前位置: 首页 > news >正文

学习笔记(27):线性回归基础与实战:从原理到应用的简易入门

线性回归:通过拟合线性方程(如 \(y = w_1x_1 + w_2x_2 + b\))预测房价、销售额等连续变量,需掌握特征标准化、正则化(L1/L2)防止过拟合。应用场景:金融领域的股价预测、电商用户消费金额预估。

线性回归基础与实战:从原理到应用的简易入门

一、线性回归的核心思想:用直线(或超平面)拟合数据

线性回归是一种监督学习算法,核心目标是通过找到一个线性方程,来描述自变量(特征)与因变量(目标值)之间的关系。通俗来说,就是用一条 “直线”(二维场景)或 “超平面”(多维场景)尽可能准确地拟合数据点,从而实现对连续变量的预测。

二、数学原理:线性方程与拟合目标
  1. 线性方程的数学表达

    • 简单线性回归(单特征):y=w⋅x+b,其中 w 是权重(斜率),b 是偏置(截距)。
  2. 拟合目标:最小化预测误差

    • 如何判断一条直线 “拟合得好不好”?通过计算均方误差(MSE) 其中 \(y_i\)是真实值,\(\hat{y}_i\) 是模型预测值。线性回归的核心就是通过优化算法(如梯度下降)找到一组 w 和 b,使 MSE 最小。
三、关键技术点:特征标准化与正则化
  1. 特征标准化(Feature Standardization)

    • 为什么需要标准化? 当特征的量纲差异很大时(例如房价特征中 “面积” 以平方米为单位,“房龄” 以年为单位),模型会更关注量纲大的特征,导致拟合偏差。
  2. 正则化(Regularization):防止过拟合的 “刹车器”

    • 过拟合问题:当模型在训练数据上拟合得太好,可能会学习到数据中的噪声,导致在新数据上预测效果差。
四、应用场景:金融与电商的实战案例
  1. 金融领域:股价预测

    • 特征设计
      • 技术指标:市盈率(PE)、市净率(PB)、成交量等;
      • 市场因素:大盘指数、行业政策、宏观经济数据(如利率)。
    • 模型作用:通过历史数据拟合股价与特征的线性关系,辅助判断股价趋势(注意:实际金融市场复杂,线性模型需结合其他方法)。
  2. 电商领域:用户消费金额预估

    • 特征设计
      • 用户行为:历史消费频次、客单价、浏览商品数;
      • 商品属性:价格区间、促销力度、品类偏好。
    • 模型价值:用于个性化推荐(如高消费潜力用户推送高端商品)、营销预算分配(针对不同消费层级用户制定策略)。
五、简易实战:用 Python 实现线性回归(以房价预测为例)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
# 配置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1. 生成模拟数据(假设房价与面积、房龄的关系)
np.random.seed(42)
n_samples = 100
# 面积(平方米),房龄(年)
X = np.random.rand(n_samples, 2) * 100
X[:, 0] = X[:, 0]  # 面积范围:0-100
X[:, 1] = X[:, 1]  # 房龄范围:0-100
# 真实房价 = 5000*面积 + 1000*房龄 + 随机噪声(模拟真实场景)
y = 5000 * X[:, 0] + 1000 * X[:, 1] + np.random.randn(n_samples) * 10000# 2. 数据预处理:标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 3. 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# 4. 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)# 5. 模型评估
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差(MSE):{mse:.2f}")
print(f"决定系数(R²):{r2:.2f}")  # R²越接近1,模型拟合越好# 6. 查看模型参数(权重和偏置)
print(f"特征权重:{model.coef_}")  # 对应面积和房龄的权重
print(f"偏置:{model.intercept_}")# 7. 可视化(以单特征为例,假设只看面积与房价的关系)
plt.scatter(X[:, 0], y, color='blue', label='真实数据')
# 用训练好的模型预测仅基于面积的房价(固定房龄为平均值)
X_single_feature = scaler.transform(np.array([[50, 0], [100, 0]]))  # 面积50和100,房龄0(仅示例)
y_single_pred = model.predict(X_single_feature)
# 反标准化面积特征(便于可视化)
X_original = scaler.inverse_transform(X_single_feature)
plt.plot(X_original[:, 0], y_single_pred, color='red', linewidth=2, label='线性回归预测')
plt.xlabel('房屋面积(平方米)')
plt.ylabel('房价(元)')
plt.title('线性回归:房屋面积与房价的关系')
plt.legend()
plt.show()

效果图

线性回归代码逐行解析

下面我将对之前提供的线性回归房价预测代码进行详细解析,帮助你理解每一步的作用和实现原理。

1. 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
  • numpy:用于生成和处理数组数据
  • pandas:用于数据处理和分析(本代码未实际使用,但在实际项目中常用)
  • matplotlib.pyplot:用于数据可视化
  • sklearn:机器学习工具包,包含:
    • LinearRegression:线性回归模型
    • train_test_split:划分训练集和测试集
    • StandardScaler:特征标准化工具
    • mean_squared_errorr2_score:模型评估指标
2. 生成模拟数据
# 1. 生成模拟数据(假设房价与面积、房龄的关系)
np.random.seed(42)  # 设置随机种子,确保结果可复现
n_samples = 100     # 样本数量# 生成特征矩阵X(面积和房龄)
X = np.random.rand(n_samples, 2) * 100  # 生成0-100之间的随机数
X[:, 0] = X[:, 0]  # 面积范围:0-100平方米
X[:, 1] = X[:, 1]  # 房龄范围:0-100年# 生成目标变量y(房价)
# 真实房价 = 5000*面积 + 1000*房龄 + 随机噪声
y = 5000 * X[:, 0] + 1000 * X[:, 1] + np.random.randn(n_samples) * 10000
  • 数据生成逻辑
    • 特征 X 包含两个维度:房屋面积和房龄
    • 房价计算公式:5000*面积 + 1000*房龄 + 随机噪声
    • 添加随机噪声模拟真实场景中的不确定性
  • np.random.seed(42),“42” 的特殊意义:在计算机科学中,“42” 是《银河系漫游指南》中 “生命、宇宙及一切的答案”,常被用作示例代码的默认种子,无实际数学含义。
  • 何时设置:应在生成随机数之前设置种子,通常放在代码开头或随机操作前。
  • 多线程场景:在多线程程序中,仅设置种子可能无法完全保证随机性一致,需结合其他线程安全措施。
  • np.random.seed(42) 是数据科学中保证实验可复现的重要工具,通过固定随机数生成的起点,让随机操作变得 “可控”。这在学术研究、工程开发中都是必不可少的步骤 —— 毕竟,能复现的结果才具有说服力!
3. 特征标准化
# 2. 数据预处理:标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

  • 其中,μ 是均值,σ 是标准差

  • 为什么需要标准化?

    • 消除不同特征量纲差异的影响
    • 加速梯度下降算法的收敛速度
    • 某些模型(如 SVM、KNN)对特征尺度敏感
4. 划分训练集和测试集
# 3. 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42
)
  • 参数说明

    • test_size=0.2:将 20% 的数据作为测试集
    • random_state=42:固定随机种子,确保每次划分结果相同
  • 数据划分目的

    • 训练集:用于模型学习参数
    • 测试集:用于评估模型泛化能力
5. 训练线性回归模型
# 4. 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
  • 线性回归模型数学表达式其中:

    • 是特征权重(对应面积和房龄)
    • b 是偏置项
  • 模型训练过程

    • 最小化均方误差(MSE)损失函数
    • 使用正规方程或梯度下降求解最优参数
6. 模型评估
# 5. 模型评估
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差(MSE):{mse:.2f}")
print(f"决定系数(R²):{r2:.2f}")
  • 评估指标解释
    • 均方误差(MSE)误差越小,模型预测越准确

    • 决定系数(R²)

7. 查看模型参数
# 6. 查看模型参数(权重和偏置)
print(f"特征权重:{model.coef_}")
print(f"偏置:{model.intercept_}")
  • 参数解释

    • model.coef_:特征权重数组,对应面积和房龄的影响系数
    • model.intercept_:偏置项,相当于线性方程的截距
  • 注意

    • 由于特征经过标准化,权重不能直接解释为 “面积每增加 1 平方米,房价增加 5000 元”
    • 需要对标准化后的数据进行反推才能得到原始尺度的解释
8. 可视化结果
# 7. 可视化(以单特征为例,假设只看面积与房价的关系)
plt.scatter(X[:, 0], y, color='blue', label='真实数据')# 用训练好的模型预测仅基于面积的房价(固定房龄为平均值)
X_single_feature = scaler.transform(np.array([[50, 0], [100, 0]]))
y_single_pred = model.predict(X_single_feature)# 反标准化面积特征(便于可视化)
X_original = scaler.inverse_transform(X_single_feature)# 绘制回归线
plt.plot(X_original[:, 0], y_single_pred, color='red', linewidth=2, label='线性回归预测')
plt.xlabel('房屋面积(平方米)')
plt.ylabel('房价(元)')
plt.title('线性回归:房屋面积与房价的关系')
plt.legend()
plt.show()
  • 可视化说明
    • 蓝色散点:原始数据点(面积 vs 房价)
    • 红色直线:线性回归模型预测线
    • 由于我们的模型包含两个特征(面积和房龄),这里固定房龄为 0,仅展示面积对房价的影响

关键概念总结

  1. 特征标准化:消除量纲差异,提高模型稳定性和训练效率
  2. 训练测试集划分:避免过拟合,评估模型泛化能力
  3. 模型评估指标:MSE 衡量预测误差,R² 表示模型解释能力
  4. 模型参数解读:权重反映特征对目标变量的影响程度

这个代码示例展示了线性回归的完整流程,从数据准备到模型训练和评估。在实际应用中,你可以用真实数据集替换模拟数据,并根据需要调整模型复杂度(如添加正则化)。

http://www.dtcms.com/a/264648.html

相关文章:

  • 利器:NPM和YARN及其他
  • 楚存科技SD NAND贴片式T卡—高性能存储解决方案、赋能AI智能硬件
  • 《Jaccard距离》算法:集合差异性度量的核心工具
  • 第三章 计算机网络体系结构
  • 【前端】基础 - HTML基础标签和样式设置
  • 深入理解装饰器模式:动态扩展对象功能的灵活设计模式
  • 前端Base64格式文件上传详解:原理、实现与最佳实践
  • STM32 使用 TinyUSB
  • 03-Linux内核驱动模块加载
  • visual studio Code运行vue项目
  • 4K超高清无缝切换与画面分割矩阵
  • gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究
  • 【AI智能体】基于Coze 制作高质量PPT实战操作详解
  • 打造Docker Swarm集群服务编排部署指南:从入门到精通
  • 降低网络安全中的人为风险:以人为本的路径
  • mr 任务运行及jar
  • FAISS 简介及其与 GPT 的对接(RAG)
  • 人机融合智能 | 人智交互中的人类状态识别
  • WSL2与Windows交换端口命令记录
  • Flink-1.19.0源码详解5-JobGraph生成-前篇
  • 渐变色的进度条控件
  • 探访国际数字影像产业园 短剧制作发行的全新平台
  • 基于FPGA的ds18b20温度采集
  • 123页满分PPT | 华为流程体系建设与运营华为数字化转型流程解决方案及建设案例
  • ECharts 安装使用教程
  • 分布式事务理论基础及常见解决方案
  • glTF /glb文件深度指南:揭示 3D 可视化的核心
  • ESP32-S3开发板LVGL图形界面开发实战教程
  • 【实战指南】Ubuntu源码部署LNMP生产环境|企业级性能调优方案
  • STEP-BACK PROMPTING:退一步:通过抽象在大型语言模型中唤起推理能力