使用 GLMNET 和 CARET 预测新数据 - newx 中的变量数必须为 X
Prediction on new data with GLMNET and CARET - The number of variables in newx must be X
我有一个数据集,我正在用它进行 k 折交叉验证。
在每一折中,我都将数据拆分为训练数据集和测试数据集。
对于数据集X的训练,我运行下面的代码:
cv_glmnet <- caret::train(x = as.data.frame(X[curtrainfoldi, ]), y = y[curtrainfoldi, ],
method = "glmnet",
preProcess = NULL,
trControl = trainControl(method = "cv", number = 10),
tuneLength = 10)
我检查'cv_glmnet'的class,返回'train'。
然后我想使用这个模型来预测测试数据集中的值,这是一个具有相同数量变量(列)的矩阵
# predicting on test data
yhat <- predict.train(cv_glmnet, newdata = X[curtestfoldi, ])
然而,我一直运行宁到以下错误:
Error in predict.glmnet(modelFit, newdata, s = modelFit$lambdaOpt, type = "response") :
The number of variables in newx must be 210
我在 caret.predict 文档中注意到,它说明如下:
newdata an optional set of data to predict on. If NULL, then the
original training data are used but, if the train model used a recipe,
an error will occur.
我很困惑为什么我 运行 会陷入这个错误。这与我定义新数据的方式有关吗?我的数据有 variables/columns 的正确数量(与火车数据集相同),所以我不知道是什么导致了错误。
您收到错误是因为您的列名在您通过 as.data.frame(X)
时发生了变化。如果您的矩阵没有列名,它会创建列名,并且模型在尝试预测时需要这些。如果它有列名,那么其中一些可以更改:
library(caret)
library(tibble)
X = matrix(runif(50*20),ncol=20)
y = rnorm(50)
cv_glmnet <- caret::train(x = as.data.frame(X), y = y,
method = "glmnet",
preProcess = NULL,
trControl = trainControl(method = "cv", number = 10),
tuneLength = 10)
yhat <- predict.train(cv_glmnet, newdata = X)
Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, :
There were missing values in resampled performance measures.
Error in predict.glmnet(modelFit, newdata, s = modelFit$lambdaOpt) :
The number of variables in newx must be 20
如果你有列名,就可以了
colnames(X) = paste0("column",1:ncol(X))
cv_glmnet <- caret::train(x = as.data.frame(X), y = y,
method = "glmnet",
preProcess = NULL,
trControl = trainControl(method = "cv", number = 10),
tuneLength = 10)
yhat <- predict.train(cv_glmnet, newdata = X)
我有一个数据集,我正在用它进行 k 折交叉验证。
在每一折中,我都将数据拆分为训练数据集和测试数据集。
对于数据集X的训练,我运行下面的代码:
cv_glmnet <- caret::train(x = as.data.frame(X[curtrainfoldi, ]), y = y[curtrainfoldi, ],
method = "glmnet",
preProcess = NULL,
trControl = trainControl(method = "cv", number = 10),
tuneLength = 10)
我检查'cv_glmnet'的class,返回'train'。
然后我想使用这个模型来预测测试数据集中的值,这是一个具有相同数量变量(列)的矩阵
# predicting on test data
yhat <- predict.train(cv_glmnet, newdata = X[curtestfoldi, ])
然而,我一直运行宁到以下错误:
Error in predict.glmnet(modelFit, newdata, s = modelFit$lambdaOpt, type = "response") :
The number of variables in newx must be 210
我在 caret.predict 文档中注意到,它说明如下:
newdata an optional set of data to predict on. If NULL, then the original training data are used but, if the train model used a recipe, an error will occur.
我很困惑为什么我 运行 会陷入这个错误。这与我定义新数据的方式有关吗?我的数据有 variables/columns 的正确数量(与火车数据集相同),所以我不知道是什么导致了错误。
您收到错误是因为您的列名在您通过 as.data.frame(X)
时发生了变化。如果您的矩阵没有列名,它会创建列名,并且模型在尝试预测时需要这些。如果它有列名,那么其中一些可以更改:
library(caret)
library(tibble)
X = matrix(runif(50*20),ncol=20)
y = rnorm(50)
cv_glmnet <- caret::train(x = as.data.frame(X), y = y,
method = "glmnet",
preProcess = NULL,
trControl = trainControl(method = "cv", number = 10),
tuneLength = 10)
yhat <- predict.train(cv_glmnet, newdata = X)
Warning message:
In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, :
There were missing values in resampled performance measures.
Error in predict.glmnet(modelFit, newdata, s = modelFit$lambdaOpt) :
The number of variables in newx must be 20
如果你有列名,就可以了
colnames(X) = paste0("column",1:ncol(X))
cv_glmnet <- caret::train(x = as.data.frame(X), y = y,
method = "glmnet",
preProcess = NULL,
trControl = trainControl(method = "cv", number = 10),
tuneLength = 10)
yhat <- predict.train(cv_glmnet, newdata = X)