我想对一组360个观测值进行约150个固定效果变量和7个随机效果变量之间的模型选择。我决定将glassoLasso与Lasso过程一起用于混合模型。我没有进行大量研究,无法找到可比模型的一些例子,但没有成功。这是我的数据样本:
> str(RHI_12)
'data.frame': 350 obs. of 164 variables:
$ RHI_counts_12 : int 0 14 1 3 2 2 2 0 0 1 ...
$ Site : Factor w/ 6 levels "14_metzerlen",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Location : Factor w/ 30 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Dist_roost : num 0.985 0.88 0.908 0.888 0.89 ...
$ Natural_light : num -0.194 -0.194 -0.194 -0.194 …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用 LASSO 进行无监督特征选择(通过删除类列)。数据集包括分类(因子)和连续(数字)变量。链接在这里。我构建了一个设计矩阵,使用model.matrix()它为每个级别的分类变量创建虚拟变量。
dataset <- read.xlsx("./hepatitis.data.xlsx", sheet = "hepatitis", na.strings = "")
names_df <- names(dataset)
formula_LASSO <- as.formula(paste("~ 0 +", paste(names_df, collapse = " + ")))
LASSO_df <- model.matrix(object = formula_LASSO, data = dataset, contrasts.arg = lapply(dataset[ ,sapply(dataset, is.factor)], contrasts, contrasts = FALSE ))
### Group LASSO using gglasso package
gglasso_group <- c(1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, …Run Code Online (Sandbox Code Playgroud) 我想对 LASSO 算法执行惩罚选择并使用 预测结果tidymodels。我将使用波士顿住房数据集来说明这个问题。
library(tidymodels)
library(tidyverse)
library(mlbench)
data("BostonHousing")
dt <- BostonHousing
Run Code Online (Sandbox Code Playgroud)
我首先将数据集分成训练/测试子集。
dt_split <- initial_split(dt)
dt_train <- training(dt_split)
dt_test <- testing(dt_split)
Run Code Online (Sandbox Code Playgroud)
使用recipe包定义预处理。
rec <- recipe(medv ~ ., data = dt_train) %>%
step_center(all_predictors(), -all_nominal()) %>%
step_dummy(all_nominal()) %>%
prep()
Run Code Online (Sandbox Code Playgroud)
模型和工作流程的初始化。我用的是glmnet发动机。mixture = 1意味着我选择 LASSO 惩罚,并且penalty = tune()意味着我稍后将使用交叉验证来选择最佳惩罚参数lambda。
lasso_mod <- linear_reg(mode = "regression",
penalty = tune(),
mixture = 1) %>%
set_engine("glmnet")
wf <- workflow() %>%
add_model(lasso_mod) %>%
add_recipe(rec)
Run Code Online (Sandbox Code Playgroud)
准备分层5折交叉验证和惩罚网格:
folds <- rsample::vfold_cv(dt_train, …Run Code Online (Sandbox Code Playgroud) 我是该glmnet软件包的新手R,并希望lambda根据已发布的研究论文中的建议指定一个glmnet.cv函数.文档表明我们可以提供lambdas作为参数的递减序列.但是,在文档中没有如何执行此操作的示例.
如果有人可以建议如何去做,那将是非常感激的.我是否将100奇数值(默认值nlambda)的向量传递给函数?如果有的话,这个向量的最小值和最大值应该有什么限制?此外,是他们的事情要记住有关nvars,nobs等等,同时指定载体?
提前致谢.
如何glmnet在R包"glmnet"处理NA值?
或者它不能容忍NA值?
我正在使用 scikit-learn 的LassoCV函数。在交叉验证期间,默认使用什么评分指标?
我希望交叉验证基于“均方误差回归损失”。可以将这一指标与 LassoCV 一起使用吗?人们可以为LogisticRegressionCV指定一个评分指标,所以 LassoCV 也可以吗?
我只是第一次收到警告。这是正常的吗?
>>> cv=LassoCV(cv=10).fit(x,y)
C:\Python27\lib\site-packages\scikit_learn-0.14.1-py2.7-win32.egg\sklearn\linear_model\coordinate_descent.py:418: UserWarning: Objective did not converge. You might want to increase the number of iterations
' to increase the number of iterations')
>>> cv=LassoCV(cv=10).fit(x,y)
>>>
Run Code Online (Sandbox Code Playgroud) 在函数的文档中cv.glmnet(),给出了:
lambda.1se:
lambda的最大值,以使误差在最小值的1个标准误差内。
这意味着lambda.1se给出lambda,从而给出一个误差(cvm),该误差与最小误差相差一个标准误差。
因此,在尝试检查这一事实时:库中
存在一个数据集。我使用套索执行了交叉验证:BostonMASS
x = model.matrix(crim~.-1,data=Boston)#-1 for removing the intercept column
y = Boston$crim
cv.lasso = cv.glmnet(x,y,type.measure = "mse",alpha=1)
Run Code Online (Sandbox Code Playgroud)
而出来的价值cv.lasso$lambda.min是:
> cv.lasso$lambda.min
[1] 0.05630926
Run Code Online (Sandbox Code Playgroud)
并且,值cv.lasso$lambda.1se是:
> cv.lasso$lambda.1se
[1] 3.375651
Run Code Online (Sandbox Code Playgroud)
现在,看看这个:
> std(cv.lasso$cvm)
[1] 0.7177808
Run Code Online (Sandbox Code Playgroud)
std函数是哪里,它返回插入其中的值的标准错误。1
的最小值cvm可以找到:
> cv.lasso$cvm[cv.lasso$lambda==cv.lasso$lambda.min]
[1] 42.95009
Run Code Online (Sandbox Code Playgroud)
因此,我们将标准误差添加到的值,cvm 得到:
> 42.95009+0.7177808
[1] 43.66787
Run Code Online (Sandbox Code Playgroud)
即使没有lambda与此值对应的cvm值,我们也可以根据现有数据得出一个想法:

这意味着lambda.1se应该在0.4784899和0.4359821之间。但这绝对不是。因此,有种直觉表明我在这里犯了一个错误。你能帮我指出这一点吗?
1:定义std: …
我想在Rcpp代码中使用“glasso”包,cpp代码如下:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
List sec(arma::mat x,double lam){
Environment gla("package:glasso");
Function gl=gla["glasso"];
double thr=1e-2;bool approx=0;
bool diag=1; bool nu=0;
List bc(5);
bc=gl(x,lam,nu,thr,thr,approx,approx,nu,nu,diag);
return(bc);}
Run Code Online (Sandbox Code Playgroud)
但是,当我在 R 中获取代码时,出现以下错误。
set.seed(100)
x<-matrix(rnorm(50*10),ncol=10)
s<- var(x)
library(glasso)
a<-sec(s, 0.01)
"Error in sec(s, 0.01) : Evaluation error: subscript out of bounds."
Run Code Online (Sandbox Code Playgroud)
我检查了“glasso”包的文档,结果列表包含 5 个值,所以我很困惑问题出在哪里。
尝试运行我的第一个 LASSO 模型并遇到了一些问题。我有一个医学数据集,试图从大约 60 个预测变量中预测二分结果(疾病)。在出现错误“为该步骤选择的所有列都应该是数字”之前,我已经调整了网格,尽管在配方阶段已经将它们全部转换为虚拟变量。我减少了预测变量的数量,看看这是否会改变任何东西,但似乎并没有解决它。这种结果并不常见,大约有 3% 的病例出现,所以我不知道这是否会影响任何事情。代码如下
分为测试和训练数据并按疾病分层
set.seed(123)
df_split <- initial_split(df, strata = disease)
df_train <- training(df_split)
df_test <- testing(df_split)
Run Code Online (Sandbox Code Playgroud)
创建验证集
set.seed(234)
validation_set <- validation_split(df_train,
strata = dfPyVAN,
prop = 0.8)
Run Code Online (Sandbox Code Playgroud)
构建模型
df_model <-
logistic_reg(penalty = tune(), mixture = 1) %>%
set_engine("glmnet")
Run Code Online (Sandbox Code Playgroud)
创建食谱
df_recipe <-
recipe(dfPyVAN ~ ., data = df_train) %>%
step_medianimpute(all_predictors()) %>%
step_dummy(all_nominal(), -all_outcomes()) %>%
step_zv(all_predictors()) %>%
step_normalize(all_predictors())
Run Code Online (Sandbox Code Playgroud)
创建工作流程
df_workflow <-
workflow() %>%
add_model(df_model) %>%
add_recipe(df_recipe)
Run Code Online (Sandbox Code Playgroud)
要调整的惩罚值网格
df_reg_grid <- tibble(penalty = 10^seq(-4, -1, length.out = 30))
Run Code Online (Sandbox Code Playgroud)
训练和调整模型 …
lasso-regression ×10
r ×7
glmnet ×2
python ×2
scikit-learn ×2
tidymodels ×2
c++ ×1
effects ×1
na ×1
parameters ×1
random ×1
rcpp ×1