- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 caret
包来调整 glmnet 逻辑回归模型。虽然最佳调整的 lambda
值是我在 tuneGrid
中指定的值之一,但最终模型的 lambda
值完全不同:
require(caret)
set.seed(1)
x <- matrix(runif(1000), nrow = 100)
y <- factor(rbinom(100, 1, 0.5))
lambda.seq <- exp(seq(log(1e-5), log(1e0), length.out = 20))
model <- train(x, y,
method ="glmnet",
family = "binomial",
tuneGrid = expand.grid(alpha = 1,
lambda = lambda.seq))
model$bestTune
# alpha lambda
# 13 1 0.0143845
model$finalModel$lambdaOpt
# [1] 0.0143845
model$finalModel$lambda
# [1] 0.1236344527 0.1126511087 0.1026434947 0.0935249295 0.0852164325 0.0776460395
# [7] 0.0707481794 0.0644631061 0.0587363814 0.0535184032 0.0487639757 0.0444319185
# [13] 0.0404847094 0.0368881594 0.0336111170 0.0306251980 0.0279045398 0.0254255774
# [19] 0.0231668392 0.0211087610 0.0192335169 0.0175248642 0.0159680036 0.0145494502
# [25] 0.0132569171 0.0120792091 0.0110061255 0.0100283716 0.0091374787 0.0083257303
# [31] 0.0075860954 0.0069121676 0.0062981097 0.0057386030 0.0052288013 0.0047642890
# [37] 0.0043410427 0.0039553964 0.0036040099 0.0032838396 0.0029921123 0.0027263013
# [43] 0.0024841042 0.0022634233 0.0020623470 0.0018791337 0.0017121967 0.0015600899
# [49] 0.0014214958 0.0012952140 0.0011801508 0.0010753094 0.0009797819 0.0008927408
model$finalModel$lambdaOpt %in% lambda.seq
# [1] TRUE
最终模型的最佳 lambda
值也不在同一模型假定使用的 lambda
列表中:
model$finalModel$lambdaOpt %in% model$finalModel$lambda
# [1] FALSE
如何解释 lambda
中的这些差异?
最佳答案
最终模型基本上是在使用重采样技术优化 alpha
和 lambda
后对整个数据集进行的 retrofit 。
如果你打印 model$finalModel$call
你会看到正在进行的调用(为了简洁省略了 x, y 结构):
Call: glmnet(x, y, family = "binomial", alpha = 1)
这里,设置了alpha
(如果您设置了一个序列,它将是找到的最佳alpha
),但是没有设置指定的lambda来训练,因此根据您的数据生成自动序列并拟合模型。然后,它使用 lambdaOpt 的相同训练集(以及您给出的序列的其余部分)进行预测。看看glmnet vignette以及如何在训练后指定不同的 lambda
。
如果您输入:
> names(model$modelInfo)
[1] "label" "library" "type" "parameters" "grid" "loop"
[7] "fit" "predict" "prob" "predictors" "varImp" "levels"
[13] "tags" "sort" "trim"
然后浏览每个部分,您可以看看 train
正在做什么。您可以在 model$modelInfo$predict
中查看它如何预测 lambdaOpt
以及序列的其余部分。
当您打印 model$results
时,您实际上会获得 lambda
列表以及每个训练集在整个训练集上的性能:
alpha lambda Accuracy Kappa AccuracySD KappaSD
1 1 1.000000e-05 0.5698940 0.15166891 0.09061320 0.17133524
2 1 1.832981e-05 0.5698940 0.15166891 0.09061320 0.17133524
3 1 3.359818e-05 0.5698940 0.15166891 0.09061320 0.17133524
4 1 6.158482e-05 0.5698940 0.15166891 0.09061320 0.17133524
5 1 1.128838e-04 0.5698940 0.15166891 0.09061320 0.17133524
6 1 2.069138e-04 0.5698940 0.15166891 0.09061320 0.17133524
7 1 3.792690e-04 0.5698940 0.15166891 0.09061320 0.17133524
8 1 6.951928e-04 0.5698940 0.15166891 0.09061320 0.17133524
9 1 1.274275e-03 0.5675708 0.14690433 0.09071728 0.17085665
10 1 2.335721e-03 0.5643334 0.14059590 0.09153010 0.17204036
11 1 4.281332e-03 0.5629588 0.13822063 0.09403553 0.17715441
12 1 7.847600e-03 0.5694974 0.15221600 0.08791315 0.16433922
13 1 1.438450e-02 0.5700431 0.15448347 0.08864353 0.16509332
14 1 2.636651e-02 0.5695053 0.15189752 0.08113581 0.15184619
15 1 4.832930e-02 0.5635977 0.14112303 0.05833646 0.11617226
16 1 8.858668e-02 0.5305835 0.08983718 0.08116759 0.14752307
17 1 1.623777e-01 0.4800871 0.01124082 0.05827521 0.05715298
18 1 2.976351e-01 0.4725241 0.00000000 0.04488500 0.00000000
19 1 5.455595e-01 0.4725241 0.00000000 0.04488500 0.00000000
20 1 1.000000e+00 0.4725241 0.00000000 0.04488500 0.00000000
总结一下 caret+glmnet 中发生的事情:
使用重采样技术优化您提供的tuneGrid中的alpha
和lambda
;
现在在整个训练集上使用最优alpha
重新拟合模型;
使用 1 中找到的 lambdaOpt
以及uneGrid 中其余的 lambda 序列来预测整个训练集。
关于R插入符火车glmnet最终模型lambda值不符合指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897941/
即使我使用相同的 lambda,cv.glmnet() 生成的系数似乎与 glmnet() 生成的系数不同。为什么是这样?它们不应该相同吗? library(glmnet) # Data dimens
有人知道 cv.glmnet (在 R 的 glmnet 中)或 LassoCV (scikit-learn)如何选择在交叉验证中使用的正则化常量(lambda)序列吗?非常感谢! 最佳答案 根据 F
当通过 glmnet 包估计套索模型时,我想知道是否更好:(a)直接从从 cv.glmnet 采购的 cv.fit 对象拉系数/预测/偏差,或 (b) 使用来自 cv.glmnet 的最小 lambd
我正在开展一个项目,该项目将显示一组事件对结果的潜在影响。我正在使用 glmnet() 包,特别是使用泊松功能。这是我的代码: # de <- data imported from sql conne
我运行了 20 倍 cv.glmnet 套索模型以获得 lambda 的“最佳”值。但是,当我尝试重现 glmnet() 的结果时,我收到一条错误消息: Warning messages: 1: fr
正如我们所见,caret::train(..., method = "glmnet") 与交叉验证或 cv.glmnet() 实现都可以找到最小化交叉验证错误的 lambda.min。最终的最佳拟合模
我在 R 中使用 glmnet 运行以下(截断的)代码 # do a lot of things to create the design matrix called x.design > glmne
我有一个函数可以返回 cv.glmnet 模型的 auc 值,虽然不是大多数时候,但它经常在执行 cv.glmnet 函数时返回以下错误: 丢弃错误(y %% rep(1, nc)): 在为函数“dr
在我的训练数据集上使用最小二乘法拟合线性回归模型效果很好。 library(Matrix) library(tm) library(glmnet) library(e1071) library(Spa
在 glmnet 包中使用“mse”和“class”有什么区别? log_x <- model.matrix(response~.,train) log_y <- ifelse(train$respo
我读过 glmnet 可以在没有正则化的情况下使用,即它可以用作常规 glm。我正在写一篇论文并试图避免使用许多不同的包,因此使用 glmnet 进行常规的 glm 逻辑回归拟合会很方便。谁能帮我?
我有一个非常大的矩阵,所以我使用 glmnet 进行回归。 我有一个条件,带有 p 的名称必须具有正系数,带有 n 的名称必须具有负系数。 我怎样才能在 glmnet 中强制这种情况? 下面是一个小例
我有一个有效的 glm 模型。因为我想添加(脊)正则化我想我会切换到 glmnet。出于某种原因,我无法让 glmnet 工作。它似乎总是预测第一类,而不是第二类,这导致精度低且 kappa = 0。
我正在使用glmnet软件包执行LASSO回归。有没有办法让所选的各个变量变得重要?我考虑过对通过coef(...)命令获得的系数进行排名(即距零的距离越大,变量将越重要)。那是一个有效的方法吗? 谢
我尝试使用 glmnet 进行预测,并收到一条非常神秘的错误消息。我之前在使用glmnet时没有遇到过这种情况,并且通过谷歌搜索该错误并没有取得成果。当最后一行未注释时会发生错误。 library(I
我一直在研究一个数据集并使用 glmnet用于线性 LASSO/Ridge 回归。 为了简单起见,我们假设我使用的模型如下: cv.glmnet(train.features, train.respo
在我的数据集中,我有许多连续变量和虚拟变量。对于使用 glmnet 进行分析,我希望对连续变量进行标准化,而不是虚拟变量。 我目前手动执行此操作,方法是首先定义仅具有 [0,1] 值的列的虚拟向量,然
我拟合多项逻辑回归模型,我想获得混淆矩阵以获得准确度 library("glmnet") x=data.matrix(train[-1]) y= data.matrix(train[1]) x_tes
我正在学习使用glmnet和 brnn包。考虑以下代码: library(RODBC) library(brnn) library(glmnet) memory.limit(size = 4000)
我的理解是 glmnet 采用矩阵,其中每一列都是一个解释变量。 我有一个包含约 10 个解释变量的数据框(其中一些是因子) 我怎样才能使用诸如 y~(x1*x2*x3)+(x4*x5)+x6 之类的
我是一名优秀的程序员,十分优秀!