web-dev-qa-db-ja.com

glmnetの確率の関数エラーを予測しますか?

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'の評価エラー:エラー:Cholmodエラー 'Xおよび/またはYの次元が間違っています'ファイル。 ./MatrixOps/cholmod_sdmult.c、90行目

「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,]

これを修正する方法を知っている人はいますか?

8
Kasia Danilczuk

私は同じ問題を抱えていましたが、それはスパース行列の異なる因子、つまり異なる次元を持つトレーニングとテストのセットが原因であると思います。

私の解決策は、結合されたデータセットのスパース行列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
Ruge

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以降の行では、NAnewAccountの値があります。回帰の前に、欠落している値とトレイン/テストの分割に対処することをお勧めします

2
jimu

私も以前にこのエラーを見たことがあります。私のデータセットの問題は、トレーニングセットとテストセットの因子変数のレベル数が異なることでした。そうでないことを確認してください。

0
ekardes

この質問はまだ検索に表示されるため、回答を投稿しています。以下のコードが実行されます。例を複製しようとすると、いくつかの問題が発生しました。 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)
0
Robert McDonald

私は同じ問題を抱えていて、まったく同じエラーが発生していました。最終的には上記のいずれも機能しませんでしたが、問題は解決しました。エラーが明確に述べているように、"間違った寸法"の問題があります。

私のデータについて

私の場合、36 x895の次元のデータにglmnetフィットをトレーニングし、テストデータは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]
}

これで、predict関数は正常に機能します。

0

トレーニングデータセットとテストデータセットのディメンションが異なるため、同じエラーが発生しました。問題は、因子/カテゴリーデータを含む列が文字列として定義されていたことでした。したがって、トレーニングとテストに分割する前に、これらの列を文字列から因子列に変更しました。

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