机器学习入门:从零实现线性回归分析

📅 2026/8/4 2:29:02
机器学习入门:从零实现线性回归分析
1. 从零开始理解回归分析第一次接触机器学习时很多人都会选择从回归分析开始。这就像学习编程时先写Hello World一样自然。回归分析作为监督学习的基石既能帮助我们理解数据间的关系又能为更复杂的模型打下基础。我清楚地记得自己写第一个回归代码时的场景面对Jupyter Notebook空白的单元格既兴奋又忐忑。兴奋的是终于要动手实践机器学习忐忑的是担心自己能否正确实现这个看似简单实则内涵丰富的算法。2. 回归分析的核心原理2.1 什么是回归分析回归分析是一种预测性的建模技术研究因变量目标和自变量预测器之间的关系。简单来说就是找到一个函数能够最好地描述输入特征和输出值之间的关系。最常见的线性回归假设这种关系是线性的可以用一个直线方程表示 y wx b 其中w是权重b是偏置项。2.2 损失函数与优化为了让模型预测得更准确我们需要定义一个衡量预测值与真实值差异的标准 - 这就是损失函数。对于回归问题最常用的是均方误差(MSE)MSE (1/n) * Σ(y_pred - y_true)²我们的目标就是找到使MSE最小的w和b。这个过程称为优化最常用的方法是梯度下降法。3. 第一个回归模型的实现3.1 环境准备首先需要安装必要的Python库pip install numpy matplotlib scikit-learn3.2 生成模拟数据为了专注于回归本身我们先从简单的模拟数据开始import numpy as np # 设置随机种子保证可重复性 np.random.seed(42) # 生成100个在0到1之间的随机数作为特征 X np.random.rand(100, 1) # 定义真实关系y 3x 2 噪声 y 3 * X 2 np.random.randn(100, 1) * 0.13.3 模型训练使用scikit-learn实现线性回归非常简单from sklearn.linear_model import LinearRegression # 创建模型实例 model LinearRegression() # 训练模型 model.fit(X, y) # 查看学到的参数 print(f斜率: {model.coef_[0][0]:.2f}) print(f截距: {model.intercept_[0]:.2f})3.4 结果可视化让我们看看模型拟合的效果import matplotlib.pyplot as plt # 绘制原始数据点 plt.scatter(X, y, colorblue, label原始数据) # 绘制回归线 plt.plot(X, model.predict(X), colorred, label回归线) plt.xlabel(X) plt.ylabel(y) plt.legend() plt.show()4. 深入理解模型表现4.1 评估指标除了可视化我们还需要量化指标来评估模型from sklearn.metrics import mean_squared_error, r2_score y_pred model.predict(X) print(fMSE: {mean_squared_error(y, y_pred):.4f}) print(fR²: {r2_score(y, y_pred):.4f})4.2 模型诊断一个好的回归模型应该满足以下假设线性关系自变量和因变量确实存在线性关系独立性观测值之间相互独立同方差性残差的方差应该相同正态性残差应该近似正态分布可以通过残差图来检查这些假设residuals y - y_pred plt.scatter(y_pred, residuals) plt.axhline(y0, colorred, linestyle--) plt.xlabel(预测值) plt.ylabel(残差) plt.title(残差图) plt.show()5. 常见问题与解决方案5.1 过拟合问题当模型在训练集上表现很好但在测试集上表现差时就出现了过拟合。解决方法包括增加训练数据量使用正则化L1/L2尝试更简单的模型5.2 特征工程的重要性在实际项目中原始特征往往不能直接使用。常见的特征工程包括标准化/归一化处理缺失值创建新特征特征选择5.3 非线性关系的处理当数据呈现非线性关系时可以考虑多项式回归其他回归模型决策树、SVM等对变量进行变换如对数变换6. 项目扩展与进阶掌握了基础线性回归后可以尝试以下扩展多元线性回归处理多个特征的情况正则化回归岭回归和Lasso回归逻辑回归虽然名字叫回归实际上是分类算法使用深度学习框架实现回归# 示例使用TensorFlow实现线性回归 import tensorflow as tf # 定义模型 model tf.keras.Sequential([ tf.keras.layers.Dense(1, input_shape(1,)) ]) # 编译模型 model.compile(optimizersgd, lossmse) # 训练模型 history model.fit(X, y, epochs100, verbose0) # 查看学到的参数 weights model.get_weights() print(f斜率: {weights[0][0][0]:.2f}) print(f截距: {weights[1][0]:.2f})写第一个回归代码时最重要的是理解背后的数学原理而不是简单地调用库函数。通过这个项目我深刻体会到机器学习中理论和实践的紧密联系。建议初学者在掌握基本实现后尝试自己用NumPy从头实现线性回归这会大大加深对算法的理解。