岭回归/套索回归中的h(simpleError(msg, call))出现错误。

4

我正在尝试使用glmnetonehot软件包运行岭回归/套索回归,并且遇到了错误。

library(glmnet)
library(onehot)
set.seed(123)

Sample <- HouseData[1:1460, ]  
smp_size <- floor(0.5 * nrow(Sample))
train_ind <- sample(seq_len(nrow(Sample)), size = smp_size)
train <- Sample[train_ind, ]
test <- Sample[-train_ind, ]

############Ridge & Lasso Regressions ################

# Define the response for the training + test set
y_train <- train$SalePrice
y_test <- test$SalePrice

# Define the x training and test
x_train <- train[,!names(train)=="SalePrice"]
x_test <- test[,!names(train)=="SalePrice"]
str(y_train)

## encoding information for training set 
x_train_encoded_data_info <- onehot(x_train,stringsAsFactors = TRUE, max_levels = 50)
x_train_matrix <- (predict(x_train_encoded_data_info,x_train)) 
x_train_matrix <- as.matrix(x_train_matrix)

# create encoding information for x test
x_test_encoded_data_info <- onehot(x_test,stringsAsFactors = TRUE, max_levels = 50)
x_test_matrix <- (predict(x_test_encoded_data_info,x_test)) 
str(x_train_matrix)

###Calculate best lambda 
cv.out <- cv.glmnet(x_train_matrix, y_train,
                    alpha = 0, nlambda = 100,
                    lambda.min.ratio = 0.0001)

best.lambda <- cv.out$lambda.min
best.lambda
model <- glmnet(x_train_matrix, y_train, alpha = 0, lambda = best.lambda)
results_ridge <- predict(model,newx=x_test_matrix)

我知道我的数据很干净,矩阵大小也相同,但是当我尝试运行预测时,仍然会出现这个错误。

错误信息:在选择函数“as.matrix”的方法时评估参数“x”时发生错误: Cholmod错误“X和/或Y的维度错误”,文件../MatrixOps/cholmod_sdmult.c,行90

我的教授还告诉我在拆分数据之前要进行独热编码,但这对我来说毫无意义。


欢迎来到 Stack Overflow。如果您还没有,请查看 如何提问 页面,并尝试提供一个 最小可复现示例 - Kim
1个回答

2

由于代码中的onehot函数并不是基于Rglmnet软件包,因此很难调试特定的错误。

尽管如此,我建议您使用内置的旧函数model.matrix(或其稀疏版本sparse.model.matrix,如果您有更大的数据集)来创建传递给glmnetx参数。 model.matrix会自动为您的分类或因子变量进行独热编码。它需要一个模型公式作为输入,您可以从下面的数据集中创建。

# create the model formula
y_variable <- "SalePrice"
model_formula <- as.formula(paste(y_variable, "~",
                                  paste(names(train)[names(train) != y_variable], collapse = "+"))) 
# test & train matrices
x_train_matrix <- model.matrix(model_formula, data = train)[, -1]
x_test_matrix <- model.matrix(model_formula, data = test)[, -1]

###Calculate best lambda 
cv.out <- cv.glmnet(x_train_matrix, y_train,
                    alpha = 0, nlambda = 100,
                    lambda.min.ratio = 0.0001)

第二种较新的选择是使用内置的glmnet函数makeX(),它可以基于测试/训练数据框构建矩阵。只需将其作为x参数输入到cv.glmnet中即可,如下所示。

## option 2: use glmnet built in function to create x matrices
x_matrices <- glmnet::makeX(train = train[, !names(train) == "SalePrice"],
                            test = test[, !names(test) == "SalePrice"])

###Calculate best lambda 
cv.out <- cv.glmnet(x_matrices$x, y_train,
                    alpha = 0, nlambda = 100,
                    lambda.min.ratio = 0.0001)

抱歉,我忘记添加那个库了,它的名称是onehot。 - Lontiac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接