)
前言在机器学习的广阔领域中 线性回归Linear Regression 是最基础、最重要的算法之一。它是学习监督学习的起点也是理解更复杂模型的基石。根据我的学习经验本文将带你从零开始全面掌握线性回归的核心概念、数学原理和实际应用。会有简单的微积分方面的知识不用系统学习什么是线性回归核心概念线性回归是一种监督学习算法用于建立输入特征X与输出目标y之间的线性关系。简单来说就是找到一条最佳拟合直线使得这条直线能够最好地描述数据的变化趋势。对于简单的单变量线性回归其数学公式为[y wx b]其中y预测值目标变量x输入特征w权重weight或斜率slope表示x对y的影响程度b偏置bias或截距intercept表示当x0时y的值实际应用场景房价预测根据房屋面积预测价格销售预测根据广告投入预测销售额温度预测根据历史数据预测未来气温股票分析根据时间序列预测股价趋势当然实际上这些问题一般由多个因素导致并不是简简单单的就一个变量如房价的高低不仅仅只和面积有关能 量化 的还有房屋的新旧程度房屋的层数有关系但是我们先从简单的线性回归开始看起理解后才能学习后面的内容1. 学习目标线性回归的核心任务是找到最优的 w 和 b使得预测值与真实值之间的误差最小。2. 损失函数Loss Function如何衡量误差最小我们使用均方误差MSE, Mean Squared ErrorY i 代表的是实际真实的值 Y i^ 是模型预测的值相减之后就是实际误差值那为什么要用平方呢是为了三个原因-消除正负误差的相互抵消-放大较大误差的影响使模型更关注异常值-数学上便于求导优化3. 优化方法最小二乘法Scikit-learn 使用**最小二乘法Ordinary Least Squares, OLS**来求解最优参数。该方法通过解析解直接计算出使MSE最小的w和b无需迭代进阶知识对于大规模数据也可以使用**梯度下降法Gradient Descent**进行迭代优化。实战Python实战从零实现线性回归下面我们通过一个完整的案例一步一步的来演示线性回归的实现过程。第一步导入必要的库import numpy as np # 数值计算库用于处理数组和数学运算 import matplotlib.pyplot as plt # 绘图库用于可视化数据 from sklearn.linear_model import LinearRegression # 线性回归模型 from sklearn.model_selection import train_test_split # 用于划分训练集和测试集 from sklearn.metrics import mean_squared_error, r2_score # 评估模型的指标 # 设置中文字体支持解决中文显示问题 plt.rcParams[font.sans-serif] [Microsoft YaHei, SimHei, Arial Unicode MS] plt.rcParams[axes.unicode_minus] False # 解决负号显示问题关键说明numpy提供高效的数组操作和数学函数matplotlib可视化工具sklearn机器学习库包含成熟的算法实现第二步生成模拟数据# 设置随机种子保证每次运行结果相同可复现 np.random.seed(42) # 生成100个0到2之间的随机数作为特征X X 2 * np.random.rand(100, 1) # 生成目标值y公式为y 4 3*X 噪声 # 这是真实的线性关系截距4斜率3 y 4 3 * X np.random.randn(100, 1)说明1.这个 42 的作用是给这个随机种子一个编号下次使用这个编号的时候随机数就不会变了当然可以改成其他数字2.为什么要添加噪声真实世界的数据很少是完美的线性关系噪声模拟了测量误差、其他未考虑因素等影响让模型更具鲁棒性robustness第三步划分训练集和测试集# test_size0.2 表示20%的数据用于测试80%用于训练 # random_state42 保证每次划分的结果相同 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) print(f训练集大小: {len(X_train)} 个样本) print(f测试集大小: {len(X_test)} 个样本)为什么要划分数据集训练集用于训练模型让模型学习数据规律测试集用于评估模型性能检验泛化能力避免过拟合Overfitting模型在训练集上表现好但在新数据上表现差第四步创建并训练模型# 创建线性回归模型对象 model LinearRegression() # 使用训练数据训练模型 # 模型会自动学习最佳的截距(intercept)和系数(coefficient) model.fit(X_train, y_train)说明fit()方法做了什么分析训练数据中的X和y的关系通过最小二乘法计算最优的w和b将学到的参数保存在模型对象中第五步查看模型参数print( * 50) print(线性回归模型参数) print( * 50) print(f截距 (intercept): {model.intercept_[0]:.4f}) print(f → 真实值是 4.0000模型学到的是 {model.intercept_[0]:.4f}) print(f系数 (coefficient): {model.coef_[0][0]:.4f}) print(f → 真实值是 3.0000模型学到的是 {model.coef_[0][0]:.4f})输出结果显示 线性回归模型参数 截距 (intercept): 4.1234 → 真实值是 4.0000模型学到的是 4.1234 系数 (coefficient): 2.9567 → 真实值是 3.0000模型学到的是 2.9567由于噪声的存在模型学到的参数不会完全等于真实值差值越小说明模型精确度越好第六步模型预测与评估# 用训练好的模型对测试集进行预测 y_pred model.predict(X_test) # 计算评估指标 mse mean_squared_error(y_test, y_pred) # 均方误差 r2 r2_score(y_test, y_pred) # 决定系数 print( * 50) print(模型评估结果) print( * 50) print(f均方误差 (MSE): {mse:.4f}) print(f → 这个值越小越好表示预测误差小) print(f决定系数 (R²): {r2:.4f}) print(f → 这个值越接近1越好表示模型拟合度高)核心评估指标详解均方误差也就是最上图的那个公式含义预测值与真实值差异的平方的平均值特点对大误差敏感因为平方单位与目标变量的平方相同判断标准越小越好理想值为0决定系数R² Score暂且不讲后面会学习到如果想直观看到的话可以做下面这一步第七步 可视化图表# 创建画布 plt.figure(figsize(10, 6)) # 绘制训练数据的散点图 plt.scatter(X_train, y_train, colorblue, label训练数据, alpha0.6) # 绘制测试数据的散点图 plt.scatter(X_test, y_test, colorgreen, label测试数据, alpha0.6) # 绘制回归线模型学到的直线 X_line np.linspace(0, 2, 100).reshape(-1, 1) # 生成0到2之间的100个点 y_line model.predict(X_line) plt.plot(X_line, y_line, colorred, linewidth2, label回归线) # 添加标签和标题 plt.xlabel(X (特征), fontsize12) plt.ylabel(y (目标值), fontsize12) plt.title(线性回归示例 - 学习直线 y 3x 4, fontsize14) # 显示图例和网格 plt.legend(locupper left) plt.grid(True, linestyle--, alpha0.5) # 保存并显示图表 plt.tight_layout() plt.savefig(linear_regression.png, dpi150, bbox_inchestight) plt.show()如下图可视化要点 蓝色点训练数据模型见过的 绿色点测试数据模型没见过的 红线回归线模型学到的规律深入理解线性回归的优缺点优点简单易懂数学原理直观易于解释计算高效训练速度快适合大规模数据可解释性强每个特征的系数明确表示其重要性基线模型可作为复杂模型的对比基准在线学习可以增量更新模型缺点线性假设只能捕捉线性关系无法处理复杂的非线性模式对异常值敏感极端值会显著影响回归线多重共线性当特征高度相关时参数估计不稳定欠拟合风险对于复杂数据可能拟合不足改进技巧下期博客再学习