- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个有效的 glm 模型。因为我想添加(脊)正则化我想我会切换到 glmnet。出于某种原因,我无法让 glmnet 工作。它似乎总是预测第一类,而不是第二类,这导致精度低且 kappa = 0。
下面是一些重现问题的代码。我做错了什么?
它生成的测试数据如下所示:
由于数据不能线性分离,所以添加了两个多项式 A^2 和 B^2。
glm 模型可以正确预测数据(准确度 = 1 且 kappa = 1)。这是它的预测边界:
虽然 glmnet 模型始终具有 kappa = 0,但无论它尝试什么 lambda:
lambda Accuracy Kappa Accuracy SD Kappa SD
0 0.746 0 0.0295 0
1e-04 0.746 0 0.0295 0
0.01 0.746 0 0.0295 0
0.1 0.746 0 0.0295 0
1 0.746 0 0.0295 0
10 0.746 0 0.0295 0
重现问题的代码:
library(caret)
# generate test data
set.seed(42)
n <- 500; m <- 100
data <- data.frame(A=runif(n, 98, 102), B=runif(n, 98, 102), Type="foo")
data <- subset(data, sqrt((A-100)^2 + (B-100)^2) > 1.5)
data <- rbind(data, data.frame(A=rnorm(m, 100, 0.25), B=rnorm(m, 100, 0.25), Type="bar"))
# add a few polynomial features to match ellipses
polymap <- function(data) cbind(data, A2=data$A^2, B2=data$B^2)
data <- polymap(data)
plot(x=data$A, y=data$B, pch=21, bg=data$Type, xlab="A", ylab="B")
# train a binomial glm model
model.glm <- train(Type ~ ., data=data, method="glm", family="binomial",
preProcess=c("center", "scale"))
# train a binomial glmnet model with ridge regularization (alpha = 0)
model.glmnet <- train(Type ~ ., data=data, method="glmnet", family="binomial",
preProcess=c("center", "scale"),
tuneGrid=expand.grid(alpha=0, lambda=c(0, 0.0001, 0.01, 0.1, 1, 10)))
print(model.glm) # <- Accuracy = 1, Kappa = 1 - good!
print(model.glmnet) # <- Accuracy = low, Kappa = 0 - bad!
直接调用 glmnet(没有插入符号)会导致同样的问题:
x <- as.matrix(subset(data, select=-c(Type)))
y <- data$Type
model.glmnet2 <- cv.glmnet(x=x, y=y, family="binomial", type.measure="class")
preds <- predict(model.glmnet2, x, type="class", s="lambda.min")
# all predictions are class 1...
编辑:缩放数据图和 glm 找到的决策边界:
型号:-37 + 6317*A + 6059*B - 6316*A2 - 6059*B2
最佳答案
在制作预测变量的多项式版本之前,您应该对数据进行居中和缩放。从数字上讲,事情以这种方式工作得更好:
set.seed(42)
n <- 500; m <- 100
data <- data.frame(A=runif(n, 98, 102), B=runif(n, 98, 102), Type="foo")
data <- subset(data, sqrt((A-100)^2 + (B-100)^2) > 1.5)
data <- rbind(data, data.frame(A=rnorm(m, 100, 0.25), B=rnorm(m, 100, 0.25), Type="bar"))
data2 <- data
data2$A <- scale(data2$A, scale = TRUE)
data2$B <- scale(data2$B, scale = TRUE)
data2$A2 <- data2$A^2
data2$B2 <- data2$B^2
# train a binomial glm model
model.glm2 <- train(Type ~ ., data=data2, method="glm")
# train a binomial glmnet model with ridge regularization (alpha = 0)
model.glmnet2 <- train(Type ~ ., data=data2, method="glmnet",
tuneGrid=expand.grid(alpha=0,
lambda=c(0, 0.0001, 0.01, 0.1, 1, 10)))
来自这些:
> getTrainPerf(model.glm2)
TrainAccuracy TrainKappa method
1 1 1 glm
> getTrainPerf(model.glmnet2)
TrainAccuracy TrainKappa method
1 1 1 glmnet
最大
关于r - glmnet 拒绝预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146552/
即使我使用相同的 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 之类的
我是一名优秀的程序员,十分优秀!