标签: quantile-regression

scikit-garden的分位数随机森林做出预测的速度非常慢

我已经开始使用该scikit-garden软件包中的分位数随机森林(QRF)。以前,我是使用RandomForestRegresserfrom 创建常规随机森林的sklearn.ensemble

看起来,QRF的速度与具有较小数据集大小的常规RF相当,但是随着数据大小的增加,QRF的预测速度要比RF慢得多。

这是预期的吗?如果是这样,有人可以解释一下为什么要花这么长时间才能做出这些预测和/或就如何更及时地获得分位数预测给出任何建议。

请参见下面的玩具示例,在该示例中,我测试了各种数据集大小的训练时间和预测时间。

import matplotlib as mpl
mpl.use('Agg')
from sklearn.ensemble import RandomForestRegressor
from skgarden import RandomForestQuantileRegressor
from sklearn.model_selection import train_test_split
import numpy as np
import time
import matplotlib.pyplot as plt

log_ns = np.arange(0.5, 5, 0.5) # number of observations (log10)
ns = (10 ** (log_ns)).astype(int)
print(ns)
m = 14 # number of covariates
train_rf = []
train_qrf = []
pred_rf = []
pred_qrf = []

for n in ns:
    # create dataset …
Run Code Online (Sandbox Code Playgroud)

python random-forest scikit-learn quantile-regression

6
推荐指数
1
解决办法
752
查看次数

R中的快速非负分位数和Huber回归

我正在寻找一种在R中进行非负分位数和Huber回归的快速方法(即约束所有系数都> 0).我尝试使用CVXR包进行分位数和Huber回归以及quantreg用于分位数回归的包,但是当我使用非负性约束时,CVXR它非常慢并且quantreg看起来很麻烦.有人知道R中的一个好的和快速的解决方案,例如使用Rcplex包或R gurobi API,从而使用更快的CPLEX或gurobi优化器?

请注意,我需要运行一个大小低于80 000次的问题大小,我只需要y在每次迭代中更新向量,但仍然使用相同的预测矩阵X.从这个意义上讲,我认为CVXR现在我必须obj <- sum(quant_loss(y - X %*% beta, tau=0.01)); prob <- Problem(Minimize(obj), constraints = list(beta >= 0))在每次迭代中做到这一点是低效的,当问题实际上保持不变并且我想要更新的时候y.有没有想过要做得更好/更快?

最小的例子:

## Generate problem data
n <- 7 # n predictor vars
m <- 518 # n cases 
set.seed(1289)
beta_true <- 5 * matrix(stats::rnorm(n), nrow = n)+20
X <- matrix(stats::rnorm(m * n), nrow = m, ncol = …
Run Code Online (Sandbox Code Playgroud)

r cplex cvx quantile-regression cvxr

5
推荐指数
1
解决办法
318
查看次数

R 中 rqPen 和 quantreg 包之间的区别

我正在为 R 中的波士顿住房数据构建分位数回归模型 + LASSO 惩罚。我发现了 2 个可以构建此类模型的包:rqPen 和 quantreg。rqPen 实现了一个交叉验证过程来调整 LASSO 参数 lambda,所以我决定使用这个。我考虑了算法自动选择的 100 个不同的 lambda 值和 10 倍:

library(rqPen)
library(mlbench)
data("BostonHousing")
help(BostonHousing)
x_boston <- data.matrix(BostonHousing[,-14])
y_boston <- BostonHousing[,14]
cv_m1_boston <- cv.rq.pen(x_boston,y_boston, penalty="LASSO", nlambda=100, nfolds=10, tau=.5, cvFunc="AE")
Run Code Online (Sandbox Code Playgroud)

CV 的结果是,当 lambda 值为 0.46 时,最小绝对误差为 4.2。该模型仅考虑预测变量“zn、”tax”、“b”和“lstat”,并将与其余预测变量相关的系数发送为零。

m1_boston <- rq.lasso.fit(x_boston[i_train,], y_boston[i_train], tau=0.5, lambda=0.46)

Coefficients:
intercept         crim           zn        indus         chas          nox           rm          age          dis          rad 
27.175724364  0.000000000  0.025560221  0.000000000  0.000000000  0.000000000  0.000000000  0.000000000  0.000000000  0.000000000 
        tax      ptratio            b        lstat 
-0.008151729  0.000000000  0.007577458 -0.495927958 …
Run Code Online (Sandbox Code Playgroud)

r package lasso-regression quantile-regression

5
推荐指数
0
解决办法
809
查看次数

QuantileRegression ValueError:操作数无法与形状一起广播

我正在尝试使用 Python 中的分位数回归来预测我的目标变量。

我考虑用于训练和验证的数据来自2015年10月至2017年12月31日期间。

现在模型已经开发出来,我正在尝试预测 2018 年 1 月的值,这会引发以下错误:

ValueError:操作数无法与形状 (34,) (33,) 一起广播

mod = smf.quantreg('ASBCU_SUM~Month+Year+WeekofMonth+DayNum+isHoliday+PCOP_CS+PCOP_LS+PCOP_IFS+PCOP_LSS+PCOP_FSS+PCOP_FS+DayOfWeek_6+DayOfWeek_5+DayOfWeek_2+DayOfWeek_7+DayOfWeek_3+DayOfWeek_4',dfTrainingData)

res = mod.fit(q=0.8)
Run Code Online (Sandbox Code Playgroud)

如果我检查,错误来自 statmodels 内的分位数回归.py 文件。

diff = np.max(np.abs(beta - beta0))
Run Code Online (Sandbox Code Playgroud)

我已经浏览过有关堆栈溢出的类似帖子,建议检查目标变量的数据类型是否为数字。这是变量的数据类型:

ASBCU_SUM:int64

月份:类别

年份:类别

每月一周:类别

是假期:int64

DayNum:int32

PCOP_SUM:int64

PCOP_CS:int64

PCOP_LS:int64

PCOP_IFS:int64

PCOP_LSS:int64

PCOP_FS:int64

PCOP_FSS:int64

DayOfWeek_3:float64

DayOfWeek_2:float64

DayOfWeek_5:float64

DayOfWeek_7:float64

DayOfWeek_4:float64

DayOfWeek_6:float64

使用 2015-2017 年数据开发模型时数据类型相同。

我真的很感谢任何帮助..

python pandas statsmodels quantile-regression

5
推荐指数
1
解决办法
2360
查看次数

分位数回归生成非单调分位数预测,例如Q49> Q50

我希望分位数回归可以预测单调的分位数,即

在此输入图像描述

但是,R中的quantreg包会生成完全没有意义的预测,请参见图:

在此输入图像描述

这有什么理由吗?

以下示例.

library(quantreg)
library(ggplot2)
data(engel)

taus <- seq(0.01,0.99,0.01)
model_qr <- quantreg::rq(foodexp~income,tau=taus,data = engel)

test <- data.frame(income = 200,  foodexp=  300)
result <- data.frame(
            Forecast = as.numeric(predict(model_qr, test)),
            Quantile = taus *100 
            )

ggplot(result, aes(x = Quantile, y = Forecast)) +
    geom_point() 
Run Code Online (Sandbox Code Playgroud)

r quantile-regression

5
推荐指数
0
解决办法
67
查看次数

是否允许/可能在 Rcpp 中的 pragma openmp 并行 for 循环中调用 R 函数或 fortran 代码?

在 Rcpp 项目中,我希望能够调用 R 函数(包中的cobs函数cobs进行凹样条拟合)或调用它所依赖的fortran 代码cobs(该函数使用quantregrq.fit.sfnc函数来拟合约束样条模型,该模型又依赖于包中的 fortran 编码的srqfnc函数)在编译指示 openmp 并行 for 循环中(我的代码的其余部分主要需要一些简单的线性代数,所以这不会有问题,但是遗憾的是,每个内部循环迭代还需要我进行凹样条拟合)。我想知道这是否被允许或可能,因为我认为此类调用不是线程安全的?是否有一个简单的解决方案,比如用 包围这些调用?有人有这方面的例子吗?或者在这种情况下唯一的方法是首先使用线程安全的犰狳类来完成&函数的完整移植?quantreg#pragma omp criticalRcppcobsrq.fit.sfnc

r openmp spline rcpp quantile-regression

4
推荐指数
1
解决办法
267
查看次数