分位数回归 Quantile Regression && 期望回

2024-04-10  本文已影响0人  臻甄

分位数回归 Quantile Regression

为什么会有分位回归Quantile Regression
分位数回归QuantileRegression的Loss函数

一个简单的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)
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)

期望回归 Expectile Regression

期望回归的损失函数
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)数据分布:中位数对数据的上半部分和下半部分给予相同的关注,但不考虑数据的分布形状。期望回归通过加权绝对残差,可以在一定程度上模拟数据分布的形状,从而提供更多关于数据整体特征的信息。
(2)异常值:期望回归处理异常值更文件。因为中位数回归完全忽略位于选定分位数之外的数据点,而期望回归对残差加权,异常值大的会让loss权重变小,可以减少异常值的影响,同时不像均值回归那样受到异常值的支配。
(3)灵活:期望回归通过调整权重,可以灵活的在中位数(q=0.5的时候)和均值之间进行权衡。比如,如果数据分布是对称的,期望回归的结果更接近中位数;如果数据是偏斜的,期望回归可能更接近均值。可以在不同的数据分布里捕捉数据本质。

参考一张图
from https://medium.com/@joachimiak.krzysztof/expectile-regression-an-alternative-for-quantile-regression-48298fb6eaa0
上一篇下一篇

猜你喜欢

热点阅读