R glmnet模型与boosting算法的性能比较

R glmnet模型与boosting算法的性能比较,r,machine-learning,glmnet,R,Machine Learning,Glmnet,为了帮助学习机器学习,我编写了一些示例,并不是为了说明一种方法优于另一种方法,而是为了说明如何使用各种函数以及需要调整的参数。我首先比较了BooST和xgboost,然后成功地将gbm添加到示例中。现在我尝试添加glmnet,但是返回的alwyas模型对这两个系数都(接近)为零。要么我做错了什么,要么glmnet不是这个数据的正确算法。我想弄清楚它是哪一个。以下是我的可复制示例: # Uncomment the following 2 lines if you need to install B

为了帮助学习机器学习,我编写了一些示例,并不是为了说明一种方法优于另一种方法,而是为了说明如何使用各种函数以及需要调整的参数。我首先比较了BooST和xgboost,然后成功地将gbm添加到示例中。现在我尝试添加glmnet,但是返回的alwyas模型对这两个系数都(接近)为零。要么我做错了什么,要么glmnet不是这个数据的正确算法。我想弄清楚它是哪一个。以下是我的可复制示例:

# Uncomment the following 2 lines if you need to install BooST (requires devtools)
#library(devtools)
#install_github("gabrielrvsc/BooST")

library(BooST)
library(xgboost)
library(gbm)
library(glmnet)

# Data generating process
dgp = function(N, r2){
  X = matrix(rnorm(N*2,0,1),N,2)
  X[,ncol(X)] = base::sample(c(0,1),N,replace=TRUE)
  aux = X
  yaux = cos(pi*(rowSums(X)))
  vyaux = var(yaux)
  ve = vyaux*(1-r2)/r2
  e = rnorm(N,0,sqrt(ve))
  y = yaux+e
  return(list(y = y, X = X))
}

# Real data
x1r = rep(seq(-4,4,length.out = 1000), 2)
x2r = c(rep(0,1000), rep(1,1000))
yr = cos(pi*(x1r+x2r))
real_function = data.frame(x1 = x1r, x2 = as.factor(x2r), y = yr)

# Train data (noisy)
set.seed(1)
data = dgp(N = 1000, r2 = 0.5)
y = data$y
x = data$X

# Test data (noisy)
set.seed(2)
dataout=dgp(N = 1000, r2 = 0.5)
yout = dataout$y
xout = dataout$X

# Set seed and train all 4 models
set.seed(1)
BooST_Model = BooST(x, y, v = 0.18, M = 300 , display = TRUE)
xgboost_Model = xgboost(x, label = y, nrounds = 300, params = list(eta = 0.14, max_depth = 2))
gbm_Model = gbm.fit(x, y, distribution = "gaussian", n.trees = 10000, shrinkage = .001, interaction.depth=5)
glmnet_Model = cv.glmnet(x, y, family = "gaussian", alpha=0)
coef(glmnet_Model)
coef(glmnet_模型)

“dgCMatrix”类的3 x 1稀疏矩阵 一,

(截距)0.07807215463259706278427066617354284971952438

V1-0.000000000000000000000000000000003033534

V2-0.000000000000000000000000000000000000044661342

要么我做错了什么

至少在编程方面,你不是

或者glmnet不是该数据的正确算法

这并不是说glmnet是“不正确的”(尽管它应该主要用于有很多预测因子的问题,而不仅仅是一对预测因子);这是因为你的比较从根本上说是“不公平”的,不恰当的:你使用的所有其他3种算法都是集成算法——例如,你的
gbm
,由一万(10000)棵单独的决策树组成。。。!尝试将其与单一回归器(如glmnet)进行比较,这几乎就像将苹果与橙子进行比较一样

然而,这应该是一个很好的练习&提醒大家,从编程的角度来看,所有这些工具似乎都是“等价的”(“嗯,我只是使用
library()
来加载它们中的每一个,对吗?那么,为什么它们不应该是等价的和可比较的?”)这一事实隐藏了很多。。。这就是为什么至少对统计学习的原理有一个初步的了解总是一个好主意(我强烈建议免费提供,对于初学者来说,也包括R代码片段)


特别是的集成方法(这是您在这里使用的所有其他3种算法背后的统一元素),不是开玩笑的!当它问世时(大约比深度学习时代早10年),它是一个真正的游戏规则改变者,在
xgboost
实现中,它仍然是大多数涉及“传统”结构化数据(即没有文本或图像)的Kaggle竞赛中的赢家选择。

请记住,glmnet符合线性模型,这意味着响应可以写成预测值的线性组合:

 y = b0 + b1*x1 + b2*x2 + ...
在数据集中,您可以将响应定义为


在这两种情况下,这显然不是预测值的线性组合。

因为,正如您所说,您的问题在于系数,请更新您的问题以明确包含它们,并可能解释您认为这些值有问题的原因……此外,作为一般原则,此处不应包含注释掉的代码行(它们没有任何用处,只会产生噪音-编辑并删除)。这些注释是为了帮助某人安装BooST软件包,因为它不在CRAN上,使其他人更容易运行该示例。零系数是一个问题,因为它在复制余弦函数方面做得很糟糕,而其他三种方法在复制余弦函数方面做得很好。我想让我的代码示例保持简短,但如果你想看一看,下面是所有四种方法的图。您将看到glmnet绘图与其他绘图有很大不同。问题是,glmnet模型可以改进吗?好的,我运行您的代码-您没有做错任何事情,除了您试图将glmnet与一些更强大的算法进行比较之外。。。
 y = b0 + b1*x1 + b2*x2 + ...
yaux = cos(pi*(rowSums(X)))

yr = cos(pi*(x1r+x2r))