强制模型系数清理 2 列数据框
Coerce model coefficients to clean, 2-column dataframe
我正在使用交叉验证拟合弹性网,我正在查看每个预测变量的系数有多大:
lambda <- cv.glmnet(x = features_training, y = outcomes_training, alpha = 0)
elnet <- lambda$glmnet.fit
coefs <- coef(elnet, s = lambda$lambda.min, digits = 3)
coefs
变量包含一个 dgCMatrix:
1
(Intercept) -1.386936e-16
ret 4.652863e-02
ind30 -2.419878e-03
spyvol 1.570406e-02
有没有一种快速的方法可以将其转换为具有 2 列的数据框(一列用于预测变量名称,另一列用于系数值)? as.data.frame
、as.matrix
或链接两者都不起作用。我特别想根据第二列对行进行排序。
另一种方法,没有通过 attributes()
函数进行破解,而是提取行名和矩阵值。 attributes(class(coefs))
表明 dgCMatrix 是使用 Matrix 包创建的稀疏矩阵。
data.frame( predict_names = rownames(coefs),
coef_vals = matrix(coefs))
# predict_names coef_vals
# 1 (Intercept) 21.117339411
# 2 (Intercept) 0.000000000
# 3 cyl -0.371338786
# 4 disp -0.005254534
# 5 hp -0.011613216
# 6 drat 1.054768651
# 7 wt -1.234201216
# 8 qsec 0.162451314
# 9 vs 0.771959823
# 10 am 1.623812912
# 11 gear 0.544171362
# 12 carb -0.547415029
broom::tidy
有一个很好的方法将 dgCMatrix
对象强制转换为长格式数据帧(有点像 as.data.frame.table
),在这里效果很好:
mod <- glmnet::cv.glmnet(model.matrix(~ ., mtcars[-1]), mtcars$mpg, alpha = 0)
broom::tidy(coef(mod$glmnet.fit, s = mod$lambda.min, digits = 3))
#> row column value
#> 1 (Intercept) 1 21.171285892
#> 2 cyl 1 -0.368057153
#> 3 disp 1 -0.005179902
#> 4 hp 1 -0.011713150
#> 5 drat 1 1.053216800
#> 6 wt 1 -1.264212476
#> 7 qsec 1 0.164975032
#> 8 vs 1 0.756163432
#> 9 am 1 1.655635460
#> 10 gear 1 0.546651086
#> 11 carb 1 -0.559817882
我正在使用交叉验证拟合弹性网,我正在查看每个预测变量的系数有多大:
lambda <- cv.glmnet(x = features_training, y = outcomes_training, alpha = 0)
elnet <- lambda$glmnet.fit
coefs <- coef(elnet, s = lambda$lambda.min, digits = 3)
coefs
变量包含一个 dgCMatrix:
1
(Intercept) -1.386936e-16
ret 4.652863e-02
ind30 -2.419878e-03
spyvol 1.570406e-02
有没有一种快速的方法可以将其转换为具有 2 列的数据框(一列用于预测变量名称,另一列用于系数值)? as.data.frame
、as.matrix
或链接两者都不起作用。我特别想根据第二列对行进行排序。
另一种方法,没有通过 attributes()
函数进行破解,而是提取行名和矩阵值。 attributes(class(coefs))
表明 dgCMatrix 是使用 Matrix 包创建的稀疏矩阵。
data.frame( predict_names = rownames(coefs),
coef_vals = matrix(coefs))
# predict_names coef_vals
# 1 (Intercept) 21.117339411
# 2 (Intercept) 0.000000000
# 3 cyl -0.371338786
# 4 disp -0.005254534
# 5 hp -0.011613216
# 6 drat 1.054768651
# 7 wt -1.234201216
# 8 qsec 0.162451314
# 9 vs 0.771959823
# 10 am 1.623812912
# 11 gear 0.544171362
# 12 carb -0.547415029
broom::tidy
有一个很好的方法将 dgCMatrix
对象强制转换为长格式数据帧(有点像 as.data.frame.table
),在这里效果很好:
mod <- glmnet::cv.glmnet(model.matrix(~ ., mtcars[-1]), mtcars$mpg, alpha = 0)
broom::tidy(coef(mod$glmnet.fit, s = mod$lambda.min, digits = 3))
#> row column value
#> 1 (Intercept) 1 21.171285892
#> 2 cyl 1 -0.368057153
#> 3 disp 1 -0.005179902
#> 4 hp 1 -0.011713150
#> 5 drat 1 1.053216800
#> 6 wt 1 -1.264212476
#> 7 qsec 1 0.164975032
#> 8 vs 1 0.756163432
#> 9 am 1 1.655635460
#> 10 gear 1 0.546651086
#> 11 carb 1 -0.559817882