【问题标题】:Predict function error for probabilities in glmnet?预测glmnet中概率的函数错误?
【发布时间】:2015-05-14 22:25:46
【问题描述】:

我正在尝试使用 glmnet 预测数据集中的概率。我的代码如下:

bank <- read.table("http://www.stat.columbia.edu/~madigan/W2025/data/BankSortedMissing.TXT",header=TRUE)
bank$rich<-sample(c(0:1), 233, replace=TRUE)
    train=bank[1:200,];
    test=bank[201:233,]
    x=model.matrix(rich~., bank)[,-1]
    cv.out=cv.glmnet(x, train$rich, alpha=0, family="binomial")
ridge.mod=glmnet(x, train$rich, alpha=0, family="binomial")
    bank$rich <- NULL
newx = data.matrix(test$rich)
ridge.pred=predict(ridge.mod,newx=newx)

train = data[1:2500,];
test = data[2501:5088,];
x=model.matrix(Y~x1+x2+x3+x4+x5+x6, data)[,-1]
cv.out=cv.glmnet(x, data$Y, alpha=0, family="binomial")
    bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, data$Y, alpha=0, family="binomial")
    test$Y <- NULL
newx = data.matrix(test)
ridge.pred = predict(ridge.mod,newx=newx, type="response")

我在使用 predict 时不断收到此错误消息:

as.matrix(cbind2(1, newx) %*% nbeta) 中的错误: 在为函数“as.matrix”选择方法时评估参数“x”时出错:t(.Call(Csparse_dense_crossprod, y, t(x))) 中的错误: 在为函数“t”选择方法时评估参数“x”时出错:错误:文件 ../MatrixOps/cholmod_sdmult.c 第 90 行中的 Cholmod 错误“X 和/或 Y 尺寸错误”

我已经在“Hitters”数据集上进行了尝试,效果非常好。

library(ISLR);
library(glmnet)
Hitters=na.omit(Hitters)

Hitters$Rich<-ifelse(Hitters$Salary>500,1,0)
Hitters.train = Hitters[1:200,]
Hitters.test = Hitters[201:dim(Hitters)[1],]
x=model.matrix(Rich~.,Hitters)[,-1]
cv.out=cv.glmnet(x, Hitters$Rich, alpha=0, family="binomial")
    bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, Hitters$Rich, alpha=0,lambda=bestlam, family="binomial")
    Hitters.test$Rich <- NULL
newx = data.matrix(Hitters.test)
ridge.pred=predict(ridge.mod,newx=newx, type="response")
head(ridge.pred)
ridge.pred[1:10,]

有人知道我该如何解决这个问题吗?

【问题讨论】:

  • 我投票结束这个问题,因为它是关于如何在没有可重现示例的情况下使用 R。
  • 我在上面添加了一个可重现的部分
  • 谢谢!我们现在看看是否可以为您迁移。
  • 感谢您的帮助.. 这已经困扰了我好几个小时了。
  • 只是为了标记对这个答案的响应,因为它是这个特定错误的第一个谷歌结果。除了将这个函数与model.matrix 一起使用引起的null 问题外,当您的测试x 没有在火车x 中找到相同的变量时,也会出现此错误。

标签: r probability prediction glmnet


【解决方案1】:

我得到了同样的错误,因为训练和测试数据集由于不同的因素而具有不同的维度。问题是具有因子/分类数据的列被定义为字符列。因此,我将这些列从字符列更改为因子列,然后将其拆分为训练和测试,并且成功了!

data$factor_column_a <- as.factor(data$factor_column_a)

【讨论】:

    【解决方案2】:
    ridge.mod_P@x  
    coef(ridge.mod,s=cv.out$lambda.min)# coeffcience of lambda.min  
    ridge.mod_P<-coef(ridge.mod,s=cv.out$lambda.min)  
    ridge.mod_P  
    matrix(ridge.mod_P@x)  
    coe<-matrix(ridge.mod_P@x)  
    coe2<-coe[-1,]#1  
    newx16<-newx[,-17]  
    newx16
    newx16%*% matrix(coe2)# NA, This is reason of outputNA.
    newx16<-newx[,-c(1,17)]  
    coe2<-coe[-(1:2),]#16  
    newx16%*% matrix(coe2)#yHat : coefficient and variable.
    

    【讨论】:

      【解决方案3】:

      我发布答案是因为这个问题仍然出现在搜索中。下面的代码运行。我在尝试复制该示例时遇到了几个问题。 bank中缺少数据;我删除了这些意见。此外,生成的预测是常数 (0.4875),因为岭回归将除常数项之外的所有变量设置为(几乎)为零(模拟值 rich 并不奇怪)。

      library(caret) ## 6.0-81
      library(glmnet) ## 2.0-16
      url <- "http://www.stat.columbia.edu/~madigan/W2025/data/BankSortedMissing.TXT"
      bank <- read.table(url, header=TRUE)
      set.seed(1)
      bank$rich <- sample(c(0:1), nrow(bank), replace=TRUE)
      bank <- na.omit(bank)
      trainbank <- bank[1:160, ]
      testbank <- bank[161:200, ]
      x <- model.matrix(rich~., trainbank)[,-1]
      y <- trainbank$rich
      cv.out <- cv.glmnet(x, y, alpha=0, family="binomial")
      x.test <- model.matrix(rich ~ ., testbank)[,-1]
      pred <- predict(cv.out, type='response', newx=x.test)
      

      【讨论】:

        【解决方案4】:

        我有同样的问题,我认为这是由于训练和测试集具有不同的因素,因此稀疏矩阵的维度不同。

        我的解决方案是为组合数据集创建稀疏矩阵 X

        traintest=rbind(training,testing)

        X = sparse.model.matrix(as.formula(paste("y ~", paste(colnames(training[,-1]), sep = "", collapse=" +"))), data = traintest)
        model = cv.glmnet(X[1:nrow(training),], training[,1], family = "binomial",type.measure = "auc",nfolds = 10)
        plot(model)
        model$lambda.min
        #predict on test set
        pred = predict(model, s='lambda.min', newx=X[-(1:nrow(training)),], type="response")
        

        这只是为了确保测试集具有相同的维度。

        【讨论】:

        • 谢谢!这对我有用,我花了好几个小时来解决这个问题。
        【解决方案5】:

        我以前也看到过这个错误。我的数据集中的问题是我的训练和测试集中的因子变量具有不同的级别数。确保不是这种情况。

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,我得到了同样的错误,最后上面没有对我有用,但我解决了这个问题!正如错误所明确指出的,存在“尺寸错误” 问题。

          关于我的数据

          在我的例子中,我训练了我的glmnet fit 在尺寸为 36 x 895 的数据上,我的测试数据是 6 x 6。我的测试数据集中只有 6 列的原因是套索选择了这 6 个特征当s="lambda.min".

          我的解决方案

          我使用了 Matrix 包中的稀疏矩阵来创建一个矩阵(你甚至可以使用普通矩阵):

          sparsed_test_data <- Matrix(data=0,
                                      nrow=nrow(test_data),
                                      ncol=ncol(training_data),
                                      dimnames=list(rownames(test_data),
                                                    colnames(training_data)),
                                      sparse = T)
          

          然后我替换正确列中的值:

          for(i in colnames(test_data)){
              sparsed_test_data[, i] <- test_data[, i]
          }
          

          现在预测功能可以正常工作了。

          【讨论】:

            【解决方案7】:

            看起来你只是把错误的东西分配给了 newx。而不是:

            bank$rich <- NULL newx = data.matrix(test$rich)

            您想清空 test$rich 中的值,然后将 test 输入 data.matrix。所以像: test$rich <- NULL newx = data.matrix(test) ridge.pred=predict(ridge.mod,newx=newx) 为我工作

            此外,您的原始数据框似乎有一些基于行的模式:200 之后的行在newAccount 中具有NA 值。您可能希望在回归之前解决缺失值和训练/测试拆分问题

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-11-18
              • 2016-05-23
              • 2019-09-16
              • 1970-01-01
              • 1970-01-01
              • 2010-10-13
              • 1970-01-01
              相关资源
              最近更新 更多