主要参考:
回归分析
在数学和统计学中,回归(Regression) 是一种用于分析变量之间关系的方法,核心目标是通过一个或多个自变量(解释变量) 来预测因变量(响应变量) 的连续数值。它不仅是机器学习中的基础任务(如前文所述),更是统计学的重要分支,其数学本质和应用逻辑可从以下维度深入解析:
数学上的回归是一种通过数据拟合函数关系来预测连续值的方法论,其核心在于用统计或机器学习手段建立自变量到因变量的映射,并通过误差最小化确保模型有效性。从简单的线性回归到复杂的非线性模型,回归分析始终是理解变量关系、解决预测问题的基础工具,其思想贯穿统计学、机器学习及各应用学科。
回归的分类
我们这里主要关注线性回归
线性回归
如果在回归分析中,自变量与因变量是线性关系(一次方),那么这种回归分析,我们称之为线性回归。
比如住宅面积和房价的关系:
线性回归通常仅用于连续型数值预测,比如预测房价(面积与价格呈直线关系)
显然,如果投资150万,远远大于预测出来的房价,那么就不值得投资。
线性回归优缺点
优点:简单、计算高效、可解释性强。
缺点:对非线性关系效果差、易受异常值和多重共线性影响。
线性回归是机器学习和统计建模的基础工具,适合初步探索变量关系,但通常需结合数据特性选择合适的变体或更复杂模型。
线性回归分析的目标
还是以房价问题为例
这里,我们是想找到房屋面积和房价之间的线性关系,其中,房屋面积就是一个特征,我们现在要找到这个特征跟房价之间的关系,也就是要寻找到合理的a和b,使得预测结果是相对准确的,因为不同的a和b对结果的影响肯定是不一样的。
那么,怎么就能找到最适合的a和b呢?
如果我们已经知道一些现有的数据,也就是知道一些面积和房价之间的确切对应关系,之后,对于某个模型,使得模型的输出结果和实际值之间的差距最小,也就能确定对应的a和b的值了。
由此,我们引出损失函数这一概念
所谓的损失函数,就是模型输出结果和实际结果之间的差距的函数,当差距最小时,也就是损失函数值最小时,我们的目标就达到了。
所以,上面说的线性回归的目标是什么呢?
答案是:不断迭代数据特征的系数,然后找到损失函数的极小值,从而确定对应的特征系数。
举例说明:
下面有两组假设的拟合所预测出来的结果,我们看看对应的损失函数值各是多少
J1小于J2,看起来J1更合适。
上面只是假设已经有了系数,然后求解下损失函数,但是这个损失函数并不一定就是最小的,那么,我们实际中如何求解呢?
我们先了解两种基础的方法:最小二乘法和梯度下降法,其他更多方法以后有需要再学习。
最小二乘法
最小二乘法(Least Squares Method)是一种经典的数学优化方法,主要用于线性回归问题,通过最小化预测值与真实值之间的残差平方和来求解模型参数。它是统计学和机器学习中最基础的参数估计方法之一。
应用场景
线性回归(房价预测、销量分析等)。
曲线拟合(如多项式回归)。
信号处理(滤波器设计)。
经济学(计量模型参数估计)。
总结
最小二乘法是线性回归的经典解法,适用于小规模数据且特征数较少的情况。
解析解高效但受限于矩阵求逆,大数据时改用梯度下降或随机梯度下降。
改进方法(如岭回归、Lasso)可以解决过拟合和不可逆问题。
非线性问题需使用更复杂的优化方法(如Levenberg-Marquardt)。
最终选择:
数据量小且特征少 → 最小二乘法(解析解)。
数据量大或特征多 → 梯度下降/SGD。
需要特征选择 → Lasso 回归。
非线性回归 → 非线性最小二乘法。
梯度下降法
上面提到,最小二乘法是线性回归的经典解法,适用于小规模数据且特征数较少的情况,解析解高效但受限于矩阵求逆,大数据时改用梯度下降或随机梯度下降。
梯度下降法(Gradient Descent,GD)是一种迭代优化算法,用于寻找可微函数的局部最小值(或最大值)。它是机器学习和深度学习的核心优化方法之一,尤其适用于大规模数据和高维参数空间的优化问题。
示意如下:
对于y=ax+b
总结
梯度下降法是机器学习和深度学习的核心优化算法,通过迭代更新参数最小化损失函数。
主要变体:BGD(稳定但慢)、SGD(快但震荡)、Mini-batch GD(平衡)。
改进算法:Momentum、Adam等可加速收敛并提高稳定性。
适用场景:
大规模数据 → Mini-batch GD 或 Adam。
非凸优化(如神经网络)→ Adam/RMSprop。
线性模型 → 可对比最小二乘法(小数据时更高效)。
关键建议:
数据标准化(加速收敛)。
调试学习率(可从0.01开始尝试)。
监控损失曲线(判断是否收敛或震荡)。
使用sklearn求解线性回归过程
我们举个简单的例子看看步骤
那么,我们如何进一步确定拟合出来的效果好不好呢?
代码示例如下:
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 1. 直接在程序中定义上面示例的10组数据,我们假设X是房屋面积,y是房价 # 格式:X和y的顺序一一对应 X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]) y = np.array([7, 9, 11, 13, 15, 17, 19, 21, 23, 25]) # 2. 创建线性回归模型并训练 model = LinearRegression() model.fit(X, y) # 传入特征和目标变量进行训练 # 3. 模型预测(使用训练数据进行预测,查看拟合效果) y_pred = model.predict(X) # 4. 计算评估指标 mse = mean_squared_error(y, y_pred) # 均方误差 r2 = r2_score(y, y_pred) # R²决定系数(越接近1越好) # 5. 输出模型结果 print("=== 线性回归模型结果 ===") print(f"回归方程:房价 = {model.coef_[0]:.4f} × 房间面积 + {model.intercept_:.4f}") print(f"均方误差(MSE):{mse:.4f}") print(f"R²决定系数:{r2:.4f}") # 6. 示例:预测新的房间面积对应的房价 new_area = 150 # 假设新房间面积为150平方米 predicted_price = model.predict([[new_area]])[0] print(f"\n预测面积为{new_area}平方米的房价:{predicted_price:.2f}万元")
结果:
结果跟预期是一致的,可见训练是有效的。
当然,这只是机器学习最最基础的一种场景了,我们后续由浅入深慢慢深入了解。
实战:波士顿房价预测
使用的是波士顿房屋数据
上面的13行是输入数据的特征,最后一行是房屋价格,也就是机器学习中说的标签。
我们开始测试
线性回归模型假设多个影响房价的因素和房价之间是线性关系,属于多元线性回归,我们可以用线性方程来表示:
线性回归模型训练的目的就是找到一组参数使得模型预测的误差最小,这里面用到了损失函数,最小二乘法,正则化等理论,这里不-一证明了,我们直接看模型训练和预测的效果。注意:因为波士顿房价数据下架了,所以用加州房价来替代,差不多的。
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 加载加州房价数据集 california = fetch_california_housing() X = california.data # 特征数据 y = california.target # 目标数据(房价中位数) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42) # 创建线性回归模型 model = LinearRegression() # 训练模型 model.fit(X_train, y_train) # 在测试集上进行预测 y_pred = model.predict(X_test) # 计算评估指标 mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) r2 = r2_score(y_test, y_pred) # 输出结果 print("线性回归模型评估结果:") print(f"MSE: {mse:.4f}") print(f"RMSE: {rmse:.4f}") print(f"R² Score: {r2:.4f}") # 可视化预测结果 plt.figure(figsize=(10, 6)) plt.scatter(y_test, y_pred, alpha=0.6) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--') plt.xlabel('实际房价 (10万美元)') plt.ylabel('预测房价 (10万美元)') plt.title('线性回归模型预测结果') plt.grid(True) plt.tight_layout() plt.savefig('prediction_results.png') # 显示特征系数(重要性) print("\n特征系数(重要性):") for i, feature in enumerate(california.feature_names): print(f"{feature}: {model.coef_[i]:.4f}") print("\n模型训练和评估已完成,预测结果图已保存为 prediction_results.png")
结果如下:
更多待补充。