分位数回归 Quantile Regression
- 先说一下线性回归 & 多项式回归:假定一个函数 f(x) ,让函数尽可能拟合训练数据,确定函数的未知参数。一般通过最小化MSE来进行: MSE
- 线性回归&多项式回归 得到的y本质上就是一个期望。f(x)本质上是一个条件期望函数,在x等于某个值的条件下,根据数据,求y的期望值。
为什么会有分位回归Quantile Regression
- 不希望仅仅研究y的期望,而是希望能探索y的完整分布状况。(一般通过了解y的某个分位数来了解分布)。假如我们有一个如图分布的数据,先做普通的回归分析拟合f(x)曲线 线性回归
- 从拟合的曲线可以看到问题,我们只拟合了均值,但随着x增大,实际值y的分布范围越来越大。即便y的分布变宽了,拟合的f(x)也还是按照蓝线那样以同样的斜率稳定上升。如果我们是按照0.9分位数回归,重新得出新函数f(x)图像: 0.9分位数回归
- 上图可以看出,比起普通的回归分析,能进一步显示出来y的变化幅度增大了。所谓0.9分位数回归,是希望回归曲线之下能够包含90%的数据点(y),这也是分位数的概念,分位数回归Quantile Regression知识把分位数的概念融入到了普通的线性回归而已。我们进一步的可以看看0.1到0.9的不同分位数回归曲线是长什么样子 0.1 0.2 0.3.. 0.8 0.9分位数回归的曲线
- 通过看不同的分位数回归曲线,可以完整的反应出来,随着x的增大,y的不同范围的数据是不同程度的变化的,而这个结论通过之前的线性回归&多项式回归都无法得到,这就是分位数回归的作用。
分位数回归QuantileRegression的Loss函数
- 本质上是一个加权最小二乘法(虽然形式有一点点不一样)。y是观测值,y尖尖是模型的预测值f(x)=b0+b1*x,q是分位数(取值0到1),I是指示函数(当括号内的条件成立时为1,否则为0)。这个损失函数会根据不同的q,对不同的数据点做不同的加权,如果y在q的左侧,损失函数给1-q的权重,如果y在q的右侧,损失函数给q的权重。
对于第q个分位值,求分位数回归曲线(也就是求曲线f(x)的内在参数比如a0+a1*x的b0和b1)
一个简单的python实现可以用加权最小二乘法确定第q分位数的线性模型
import numpy as np
from scipy.optimize import minimize
def quantile_loss(q, y, y_pred):
residual = y - y_pred
return np.sum((1 - q) * residual[residual >= 0]) + np.sum(q * residual[residual < 0])
def linear_quantile_regression(q, x, y):
# 定义目标函数
def objective(beta):
y_pred = beta[0] + beta[1] * x
return quantile_loss(q, y, y_pred)
# 初始猜测值
initial_guess = np.array([0.0, 0.0])
# 最小化目标函数
result = minimize(objective, initial_guess, method='SLSQP')
# 返回最优参数
return result.x
# 生成一些示例数据
np.random.seed(0)
x = np.random.rand(100)
y = 2 * x + 1 + np.random.randn(100)
# 计算第 0.5 分位数的线性模型参数
q = 0.5
beta = linear_quantile_regression(q, x, y)
print("第", q, "分位数的线性模型参数:", beta)
- 对比之前求求期望的最小二乘法,就编程我们熟悉的加权最小二乘法了,本质上他们都一样,而且最小化这个函数同样可以求出分位点。 用二次方的加权最小二乘法,也可以求解同样的问题
- 代码实现只需要把 quantile_loss 改成 quantile_ols_loss 即可
def quantile_ols_loss(q, y, y_pred):
residual = y - y_pred
return np.sum((q * residual[residual >= 0])**2) + np.sum(((1 - q) * residual[residual < 0])**2)
- 不管是上面两种哪种形式,比如我们使用p=0.8,name我们最小化Loss求f(x)的参数,得到回归曲线f,应该有80%的数据点在曲线的下方。
- 【结论】分位数回归QuantileRegression,不能说是一种回归模型,而是一类回归模型,或者说是一种改进思想,我们可以把它应用到线性回归、多项式回归、核回归等等。
- 【本质】和线性回归最本质的区别就是把损失函数从最小二乘法改成加权最小二乘法,从而通过不同分位数得到不同的结果,在根据结果进行分析。
期望回归 Expectile Regression
- 期望回归只在估计给定概率水平下的条件期望,而不是估计给定分位数下的条件中位数。
- Expectile Regression也是统计中一种常用的估计随机变量的统计量方法。
期望回归的损失函数
- y是观测值,y尖尖是模型的预测值,q是期望的概率水平(通常是0~1),F(y|y尖尖)是给定y尖尖的累积分布函数。 期望回归Loss
-
计算累积分布函数:需要做估计,可以通过标准化残差来实现。残差就是观测值减去预测值, 是残差的标准差
标准化残差 -
这样的话期望回归的损失函数就可以重写,其中是指数函数,当括号内条件成立时为1,否则为0
重写期望回归的Loss -
之前是把残差大于0的loss加权(1-q),现在是残差大于0的值normalize之后mean,作为q权重的惩罚项,也就是如果异常值很大,loss的权重就越小
-
代码实现只需要把 quantile_loss 改成expectile_ols_loss即可,q的物理含义从分位数变成期望水平。
def expectile_ols_loss(q, y, y_pred):
residual = y - y_pred
epsilon = residual / np.std(residual)
return np.sum((residual)**2 * (q - np.mean(epsilon[epsilon >= 0])))
QuantileRegression和ExpectileRegression的区别
- 定义
(1)分位数回归通过最小化选定分位数处的因变量和模型预测之间的绝对误差来估计回归系数。例如,如果我们关注中位数,那么分位数q=0.5,分位数回归就会尝试找到一条线,使得50%的数据点位于这条线的上方,50%位于下方,同时最小化这些点到线的垂直距离之和。
(2)期望回归是一种相对较新的统计建模方法,它介于分位数回归和均值回归之间。它的目标是估计条件期望的“中心”或“典型”值,这个值在某种程度上介于中位数和均值之间。通过最小化加权的绝对残差之和来计算回归系数。权重是根据残差的绝对值来确定的,使得较小的残差获得更大的权重。这种方法的结果是:模型倾向于关注数据的中心部分,而不是极端值。 - 用途
(1)分位数回归特别适用于分析具有异方差性或非正态分布(不同分位值没有很均匀)的数据,以及在处理异常值的时候,比传统最小二乘法更为稳健。它可以用于预测不同分位数的值,从而得到关于因变量y更全面的分布信息。
(2)期望回归适用于哪些对异常值敏感但又希望保持对数据整体分布的关注的情况。它可以提供比中位数回归更丰富的信息,因为它不仅关注中间部分的数据,还考虑到了数据的其他部分。
之所以期望回归可以提供更丰富的信息,是因为在建模过程中对数据的不同部分给予了不同的关注,而不仅仅集中在中间部分(中位数)。
(1)数据分布:中位数对数据的上半部分和下半部分给予相同的关注,但不考虑数据的分布形状。期望回归通过加权绝对残差,可以在一定程度上模拟数据分布的形状,从而提供更多关于数据整体特征的信息。
(2)异常值:期望回归处理异常值更文件。因为中位数回归完全忽略位于选定分位数之外的数据点,而期望回归对残差加权,异常值大的会让loss权重变小,可以减少异常值的影响,同时不像均值回归那样受到异常值的支配。
(3)灵活:期望回归通过调整权重,可以灵活的在中位数(q=0.5的时候)和均值之间进行权衡。比如,如果数据分布是对称的,期望回归的结果更接近中位数;如果数据是偏斜的,期望回归可能更接近均值。可以在不同的数据分布里捕捉数据本质。
-
例子
(1)分位数回归:例如,在收入数据中,Quantile Regression 可以帮助你估计特定分位数下的收入水平,如第 25%、第 50%(中位数)和第 75% 分位数的收入。
(2)期望回归:例如,在房屋价格数据中,Expectile Regression 可以帮助你估计给定预期房价的条件平均水平,而不仅仅是单一的分位数。 -
总结
(1)分位数回归关注与数据的不同部分
(2)期望回归试图找到一个平衡点,既不是完全集中在中位数,也不是完全集中在均值。
(3)这两种方法都可以提供比传统最小二乘回归更稳健的估计,特别是在数据分布不均匀或者存在异常值的情况下。
from https://medium.com/@joachimiak.krzysztof/expectile-regression-an-alternative-for-quantile-regression-48298fb6eaa0
网友评论