【Python】线性回归:原理、问题看懂这篇就够了
【Python】线性回归:原理、问题看懂这篇就够了
一、线性回归算法简介
(一)基本概念
线性回归:一种在统计学中广泛应用的分析方法,用最小平方函数对一个或多个自变量和因变量之间关系进行建模,表达某一个随机变量的条件均值与一个或多个解释变量的相关取值之间的关系,表达式为(其中误差服从均值为 0 的正态分布)。
按照自变量数量来分,线性回归可分为一元线性回归和多元线性回归。
(二)原理与模型
算法核心:建立描述自变量和因变量线性关系的模型。
通过最小化预测值和真实值的误差来找到最优的回归系数和截距。
为了衡量这个误差大小,常用的误差衡量标准如均方误差(MSE)。通过不断调整回归系数和截距等参数,使得 MSE 尽可能小,模型就能更好地拟合数据,更准确地反映自变量和因变量之间的真实关系。
例如在预测股票价格时,根据历史的交易数据(如成交量、开盘价等自变量)以及对应的股价(因变量),利用上述原理构建线性回归模型,让模型的预测价格和实际股价之间的均方误差达到最小,从而使模型具备一定的预测能力。
(三)模型训练
常用的方法是通过最小化损失函数来估计模型参数,其中比较典型的有正规方程和梯度下降等方法。
正规方程是一种直接求解的方式,对于线性回归模型而言,其参数的求解公式为 (其中, 为输入数据的特征矩阵, 为目标变量的向量)。
正规方程具有以下优点:
不过,正规方程的缺点同样显著:
梯度下降则是一种迭代优化的算法,它的基本原理是沿着损失函数的梯度(导数)反方向不断更新参数,使得损失函数逐步减小,最终找到最小值点(或局部最小值点)。其参数更新公式为 (其中 是学习率, 是损失函数的梯度)。梯度下降又可细分为不同的类型,比如批量梯度下降(每次使用全部训练数据来计算梯度进行参数更新)、随机梯度下降(每次随机选取一个样本计算梯度来更新参数)以及小批量梯度下降(每次选取一小部分样本数据计算梯度更新参数,综合了前两者的优点)。例如在处理大规模的电商交易数据进行销量预测时,使用小批量梯度下降可以在保证一定收敛速度的同时,降低计算资源消耗,让模型逐步学习到数据中的规律,找到合适的回归系数等参数。
(四)优化方法
在模型训练过程中,为了提高模型的性能和效率,常常会采用一些优化方法。
-
特征缩放是一种常用的手段。
- 由于不同的特征可能具有不同的量纲(比如一个特征取值范围是 0 到 1,另一个特征取值范围是 0 到 1000),这可能会导致在进行梯度下降等优化算法时,收敛速度变慢或者难以收敛到最优解。
- 常见的特征缩放方法包括最小 – 最大标准化(将特征值映射到指定的区间,如 0 到 1 之间)和 Z-score 标准化(将特征值转化为均值为 0,标准差为 1 的分布)。例如在分析客户消费数据时,客户的年龄、消费金额等特征量纲不同,通过特征缩放后,能让模型训练更加稳定、高效。
-
正则化也是重要的优化策略之一,它主要是为了防止模型过拟合(即模型在训练数据上表现很好,但在新的测试数据上表现很差的情况)。常见的正则化方式有 L1 正则化(如 Lasso 回归)和 L2 正则化(如 Ridge 回归)。
- L1 正则化会使得模型的一些特征系数变得很小,甚至直接变为 0,从而起到特征选择的作用;
- L2 正则化则是通过在损失函数中添加所有参数的平方和作为惩罚项,缩小回归系数,让模型相对更稳定。比如在预测疾病风险时,面对众多的生理指标等自变量,正则化可以避免模型过于依赖某些噪声特征,提高模型的泛化能力。
(五)性能评估
常用的性能评估指标有均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)以及 R² 指标等。
(六)应用场景
在预测分析方面,常见的如房价预测,通过收集房屋的面积、房龄、周边配套设施等自变量数据,结合历史的房价(因变量)数据构建线性回归模型,就可以对新的房屋价格进行预测,帮助购房者、房产中介以及开发商等做出合理的决策;还有股票价格预测,依据历史的股价走势以及相关的宏观经济指标、公司财务数据等自变量,利用线性回归尝试分析股价的变化趋势,辅助投资者进行投资决策。
在趋势分析领域,在经济方面,可以分析 GDP 与消费、投资、进出口等因素之间的线性关系,从而把握经济发展的趋势和各因素的影响程度;在流行病学领域,通过分析疾病发病率与环境因素、人群生活习惯等自变量之间的关系,来预测疾病的流行趋势,为公共卫生政策制定提供依据。
另外,线性回归还能用于特征选择,根据模型中各个自变量对应的回归系数大小等情况,可以判断哪些自变量对因变量的影响更为显著,从而筛选出重要的特征用于后续进一步的分析或者构建更复杂的模型等。例如在分析客户信用风险时,众多的客户个人信息、消费行为等特征中,通过线性回归模型来确定哪些特征对信用风险的影响较大,重点关注这些关键特征进行风险评估和管理。
二、线性回归常见问题及解决办法
(一)数据相关问题
1. 有效样本量不足
有效样本量不足:指实际用于分析的样本数量低于方法所需要的合理样本量。
一般来说,为了使线性回归模型的结果更具备参考意义,起码要求样本量是变量数的 5 – 10 倍。例如,假设有 5 个自变量,那么样本量最好在 25 – 50 个及以上。当遇到有效样本量不足的情况时,最直接的解决办法就是加大样本量,通过增加数据收集等方式获取更多的样本,让模型能够学习到更丰富的数据特征,从而提升模型对变量关系描述的准确性。
2. 自变量为定类数据
在实际应用线性回归时,有时自变量可能是定类数据,像血型(A、B、AB、O 型)、性别(男、女)等这类分类数据。对于定类数据,如果只是作为控制变量放入模型,通常是可以的,其目的是控制这些可能对模型产生干扰的因素。
但如果想要进一步分析定类自变量对因变量的影响关系,那就需要进行特殊处理,也就是进行虚拟变量(哑变量)设置。例如,对于有四个水平的定类变量(如上文提到的血型),可生成 3 个哑变量(以其中一个水平作为参照,比如 O 型为参照),每个哑变量用 0 – 1 来表示,1 代表属于该分类,0 代表不属于。然后将这些哑变量放入模型中参与分析,这样得到的回归系数才有实际意义,能更好地体现不同类别与因变量之间的关系。
3. 数据存在异常值、缺失值
异常值:指那些明显偏离其他数据点的数据,缺失值则是部分数据的缺失情况。
异常值可能会导致模型过度拟合这些异常的数据点,从而偏离整体数据所反映的真实关系。例如在分析产品销量与价格、广告投入等因素的线性关系时,如果出现个别销量数据因为记录错误等原因异常高或低,就会干扰模型对正常关系的学习。
缺失值一方面会减少样本量,降低模型可利用的信息,影响模型的估计精度;另一方面也可能破坏数据的完整性,使得模型在拟合过程中出现偏差,降低模型的稳健性。
针对这些问题,常用的处理手段有剔除异常值,不过剔除时要谨慎判断,确保不是有意义的特殊数据;对于缺失值,可以采用填补的方法,比如均值插补(用该变量的均值来填补缺失值)、中位数插补、回归插补(利用其他变量与含缺失值变量的关系进行预测填补)、多重插补等常规方法,尽可能恢复数据的完整性,减少对模型的不良影响。
(二)模型相关问题
1. 多重共线性
多重共线性:指在多元线性回归模型中,自变量之间存在高度相关性的现象。比如在分析房价影响因素时,房屋面积和房间数量这两个自变量可能存在较强的相关性,因为通常面积越大房间数量可能越多。
当出现多重共线性时,会对回归系数估计产生负面影响,使得回归系数的估计变得不稳定,其标准误增大,进而影响到对系数显著性的判断,让统计推断的可靠性下降。例如原本某个自变量对因变量是有显著影响的,但由于多重共线性,可能会错误地判断其不显著。
为了检测是否存在多重共线性,可以计算方差膨胀因子(VIF),一般认为 VIF 值大于 10(有的标准是严格大于 5),则存在多重共线性问题。另外,也可以通过相关系数法进行初步判断,若两个自变量之间的相关系数较大且接近 1,也提示可能存在共线性。
解决多重共线性问题的方法有多种,比如手动剔除变量,将那些 VIF 值较大、相关性很强的自变量进行筛选剔除,但要注意避免剔除重要的变量信息;还可以采用逐步回归的方法,逐步引入自变量,通过模型统计意义的检验以及调整后 R 方的变化情况来自动筛选出有影响且不会引起共线性的变量;此外,岭回归、主成分分析也是常用的解决手段,岭回归利用岭估计来代替普通最小二乘估计,以损失部分信息为代价来寻找更稳定的回归系数;主成分分析则是将多个相关自变量转化为少数几个不相关的综合变量来参与建模,从而避免自变量间的共线性问题。
2. 异方差性
异方差性:指在线性回归模型中,误差项的方差随自变量的变化而变化,违反了经典线性回归模型中误差项具有同方差(即相同方差)的假设。例如在研究不同收入水平人群的消费支出情况时,可能高收入人群的消费支出数据波动范围(方差)和低收入人群的就不一样,存在异方差性。
它的存在会使基于普通最小二乘法估计的参数不再是最优的、有效的,会导致 t 检验、F 检验等统计推断的结果不准确,进而影响对模型的评价和预测效果。
检测异方差性可以通过残差图法,以残差为纵坐标,自变量为横坐标画散点图,如果残差的散布呈现出一定的趋势(如随着自变量值增大,残差的绝对值增大或减小等),则可初步判断存在异方差;还可以用等级相关系数法进行更严谨的检验,通过计算相应的统计量并进行假设检验来判断异方差是否存在。
针对异方差性,常用的消除方法采用稳健标准误法,这种方法可以在一定程度上减轻异方差对统计推断的影响;还可以进行 Box – Cox 变换,根据数据的特点选择合适的变换形式,使得变换后的数据满足同方差假设;另外,加权最小二乘法也是一种有效手段,根据误差方差与自变量的关系确定权重,对数据进行加权处理后再进行回归分析,不过有时候它不能完全消除异方差,可能需要和其他方法结合使用。
3. 自相关性
自相关性是指在线性回归模型中,误差项之间存在相关关系的问题,也就是某一时刻的误差与其他时刻的误差并非相互独立。常见于时间序列数据中,比如分析每月的产品销量与时间、促销活动等因素的关系时,可能相邻月份的销量误差存在关联。
自相关性的出现会使普通最小二乘法估计的参数方差低估,导致对回归系数显著性检验的结果不可靠,同时也会影响模型的预测精度。
检测自相关性可通过 DW 检验、LM 检验等方法。DW 检验常用于一阶自相关的初步判断,通过计算 DW 统计量并与相应的临界值比较来确定是否存在自相关;LM 检验则相对更具一般性,能检测多种形式的自相关情况。
解决自相关性常用的手段有广义差分法,通过对数据进行一定的变换来消除误差项之间的相关性;还有迭代法,不断调整模型参数来减小自相关性的影响,使得模型能够更好地拟合数据,提高模型的准确性和可靠性。
4. 模型设定偏误
模型设定偏误包含多种类型,比如遗漏变量,即没有将对因变量有显著影响的自变量纳入模型中,例如在分析学生成绩与学习因素的关系时,遗漏了学生的学习时间这一重要变量;多余变量则是纳入了对因变量实际上没有影响或者影响极小的自变量,增加了模型的复杂性却没有提高解释能力;变量形式错误指的是变量之间实际是非线性关系,却错误地设定为线性关系进行建模;还有测量误差,自变量或因变量的测量数据不准确等情况。
这些模型设定偏误会导致模型不能准确地反映变量之间的真实关系,影响模型的拟合优度和预测效果等。
通常可以通过观察残差图来发现一些端倪,比如残差呈现出某种有规律的模式,可能提示存在模型设定偏误;还可以利用统计检验来判断变量的显著性以及模型的拟合优度,若原本认为重要的变量不显著,或者模型整体拟合优度很低等情况,都需要考虑是否存在设定偏误。解决的办法就是仔细审查变量的选择、关系的设定等,重新调整模型,补充遗漏变量、剔除多余变量、修正变量形式或者改进测量方法等,以构建更合理准确的线性回归模型。
三、Python 示例
(一)广告销售回归关系示例
1. 一元线性回归示例(以广告投入量和产品销售量为例)
Python 的sklearn库实现一元线性回归的完整代码示例,以广告投入量作为自变量,产品销售量作为因变量,来分析它们之间的线性关系,并进行相应的模型训练、检验以及预测等操作。
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import numpy as np
# 数据获取
data = np.array([[29, 77], [28, 62], [34, 93], [31, 84], [25, 59], [29, 64], [32, 80], [31, 75], [24, 58], [33, 91],
[25, 51], [31, 73], [26, 65], [30, 84]])
x = np.reshape(data[:, 0], (-1, 1)) # 第一列为广告投入量
y = np.reshape(data[:, 1], (-1, 1)) # 第二列为产品销售量
# 绘制散点图
plt.scatter(x, y) # 通过散点图,很明显确定两列数据具备线形相关,满足一元线形回归的使用条件
plt.xlabel("Advertising investment")
plt.ylabel("Product sales volume")
# 建一元线性回归模型
lr = LinearRegression()
lr.fit(x, y) # 训练模型
a = round(lr.coef_[0][0], 2) # 查看斜率
b = round(lr.intercept_[0], 2) # 查看截距
print("线性回归模型为:y = {}x + {}. ".format(a, b))
x_test = np.array([[20], [55]])
y_test = lr.predict(x_test)
plt.plot(x_test, y_test, color='r')
# 实例化LinearRegression类创建线性回归模型对象lr,接着调用fit方法,传入自变量x和因变量y的数据,让模型进行训练,通过训练来确定模型的系数(斜率a)和截距(b)。训练完成后,通过访问模型的coef_属性(由于返回的是二维数组形式,所以取[0][0]获取具体的斜率值)和intercept_属性获取截距值,并将其打印出来,展示所得到的线性回归模型的表达式形式。
# 模型检验
lr.score(x, y)
# 调用lr.score方法,传入自变量x和因变量y,这个方法会返回模型的决定系数(R²),用于评估模型对数据的拟合程度,R²的值越接近 1,表示模型拟合效果越好,越能准确地反映自变量和因变量之间的关系。
# 预测
x_pred = [[40], [45], [50]]
y_pred = lr.predict(x_pred)
plt.scatter(x_pred, y_pred, color='g', marker='*')
plt.legend(['mode', 'train', 'pred'])
plt.show()
2. 多元线性回归示例(以广告花费不同维度与销售额为例)
多元线性回归的 Python 代码示例,展示了如何通过多个广告花费维度作为自变量来预测销售额这个因变量,代码涵盖了读入数据集、处理数据、生成模型、预测结果、计算误差以及视图化展示等环节。
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import seaborn as sns
# 写入数据
df_ads = pd.read_csv('advertising.csv')
df_ads.head()
# 导入数据可视化所需要的库
# 对所有的标签和特征两两显示其相关性热力图(heatmap),得到两两相关系数
sns.heatmap(df_ads.corr(), cmap="YlGnBu", annot=True)
plt.show()
# 显示销量和各种广告投放量的散点图
sns.pairplot(df_ads, x_vars=['wechat', 'weibo', 'others'], # x轴
y_vars='sales', # y轴
height=4, aspect=1, kind='scatter')
plt.show()
# 准备训练数据
X = df_ads[['wechat', 'weibo', 'others']]
y = df_ads['sales']
# 创建线性回归模型并拟合训练数据
model = LinearRegression()
model.fit(X, y)
# 预测结果
y_pred = model.predict(X)
# 计算误差(这里以均方误差为例,实际可根据需求选用其他评估指标)
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y, y_pred)
print("均方误差:", mse)
# 数据可视化展示拟合效果(简单示例,用散点图展示真实值和预测值对比)
plt.scatter(y, y_pred)
plt.xlabel("真实销售额")
plt.ylabel("预测销售额")
plt.title("多元线性回归拟合效果对比")
plt.show()
(二)时间产品销量回归关系示例
1. 基于时间序列预测的 ARIMA 模型结合线性回归示例
以下是使用 Python 的相关库(如statsmodels等)实现基于 ARIMA 模型进行时间序列数据处理,并结合线性回归分析时间产品销量关系的代码示例,涵盖了数据可视化、平稳性检验、模型建立及预测等内容。
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller as ADF
import matplotlib.pyplot as plt
# 写入数据
data = pd.read_csv('sales.csv', header=0, index_col=0, parse_dates=True, squeeze=True)
# 时序图绘制,查看数据的时间序列特征
data.plot()
plt.title("时间序列数据")
plt.xlabel("时间")
plt.ylabel("产品销量")
plt.show()
# 自相关图,查看序列自相关性
plot_acf(data).show()
# 平稳性检验,ADF检验
result = ADF(data['销量'])
print("原始序列的ADF检验结果为:", result)
# 假设经过分析等确定了ARIMA模型的参数,这里示例设置为(1, 1, 1),实际需根据具体数据情况确定
model = ARIMA(data, order=(1, 1, 1))
model_fit = model.fit(disp=0)
# 预测未来销量,这里假设预测未来7步(可根据实际需求调整)
forecast = model_fit.forecast(steps=7)[0]
print("预测的未来销量:", forecast)
# 结合线性回归(这里简单示例,假设已有一个简单线性回归模型lr,实际需根据具体数据构建合适的线性回归模型)
# 例如用时间序列的某个特征(如滞后一期的销量等)作为自变量,产品销量作为因变量构建线性回归模型
# 以下是伪代码示意,仅为展示结合思路
# 假设X是构建好的自变量数据(如滞后一期销量数据等),lr是已经训练好的线性回归模型
# y_pred_linear = lr.predict(X)
# 可以进一步对比ARIMA模型预测结果和结合线性回归后的预测结果等进行分析(这里省略具体分析代码,实际根据需求编写)
四、总结
线性回归在实际应用中,具备建模速度快、结果易解释等优点,但也存在如对非线性数据拟合能力有限、对异常值敏感、受多重共线性等问题影响的情况。使用的话需要根据实际情况反复测试、调整,才能达到期望效果。
希望本文有大家有帮助, 如有错误,欢迎指正。
转载请注明原文链接:
https://blog.csdn.net/weixin_41613094/article/details/144587844?sharetype=blogdetail&sharerId=144587844&sharerefer=PC&sharesource=weixin_41613094&spm=1011.2480.3001.8118
作者:看海的四叔