r-通过特征选择ML算法在其结构为df或列表的输出中计算正确选择的模型的数量



这个问题中提到的数据集和R脚本都可以在我的GitHub存储库中找到。

目标是计算R中的LASSO函数在58k个不同csv文件格式的数据集(均在同一文件夹中(上使用弹性网包中的enet函数拟合的回归模型的正确性。所选模型是否正确是通过检查该数据集的拟合模型中包含的变量是否与其真正的基本回归模型(即该数据集(完全匹配来确定的。这些数据集是使用自定义Excel宏生成的,该宏的构建方式使我知道每个数据集的正确底层结构模型(详细信息在p.s.部分中解释(。

我已经将LASSO为每个数据集选择的变量(在"LASSO代码"脚本中运行代码时(导出到名为"IVs_selected_by_LASSO"的csv文件中,然后在正确排序后将它们重新导入名为"量化LASSO的性能"的不同R脚本中(并将它们分配给名为"BM1_models"的对象对象(。

所有拟合的模型都存储在BM1_models对象中,该对象如下所示,其中分号前的n1-n2-n3-n4s表示每个csv文件的名称,其后的显然是在该csv文件中的数据集上运行的LASSO回归所选择的模型:

> BM1_models <- read.csv("IVs_Selected_by_LASSO.csv", header = FALSE)
> head(BM1_models, n = 3)
V1
1 0-3-1-1;  X1, X2, X3
2 0-3-1-2;  X1, X2, X3
3 0-3-1-3;  X1, X2, X3
> tail(BM1_models, n = 3)
V1
57998 1-15-9-498;  X2, X3, X5, X6, X8, X9, X10, X11, X12, X15
57999     1-15-9-499;  X3, X4, X5, X6, X8, X10, X11, X12, X15
58000               1-15-9-500;  X2, X4, X6, X7, X8, X10, X11
> str(BM1_models)
'data.frame':   58000 obs. of  1 variable:
$ V1: chr  "0-3-1-1;  X1, X2, X3" "0-3-1-2;  X1, X2, X3" "0-3-1-3;  X1, X2, X3" "0-3-1-4;  X1, X2, X3" ...

对于记录,每个分号后面有两个空格,而不仅仅是一个。

p.s。如何判断ML变量/因子选择方法(在这种情况下为LASSO(是否适用于任何给定的数据集,如果该数据集的n2为3,则选择的独立变量应为X1、X2、X3;如果它说4,则底层结构模型是X1、X2、X3、X4,依此类推,直到X1、X2,X3、X4、X5、X6、X7、X8、X9、X10、X11、X12、X13、X14、X15,当它说15。如果当n2=3时,选择的型号是X1、X3、X4或X2、X3、X4,或者除了X1、X2、X3之外的任何其他组合,这是错误的,它必须是准确的。

考虑嵌套的strsplit,然后rbind将向量拆分为数据帧:

BM1_models <- read.csv("IVs_Selected_by_LASSO.csv", header = FALSE)
n_df <- do.call(
rbind.data.frame,
lapply(
strsplit(BM1_models$V1, ";"),
function(x) {
s <- strsplit(x, "-")
c(s[[1]], s[[2]])
} 
)
) |> setNames(
c("n1", "n2", "n3", "n4", "IV")
)
head(n_df)
#   n1 n2 n3 n4           IV
# 1  0  3  1  1   X1, X2, X3
# 2  0  3  1  2   X1, X2, X3
# 3  0  3  1  3   X1, X2, X3
# 4  0  3  1  4   X1, X2, X3
# 5  0  3  1  5   X1, X2, X3
# 6  0  3  1  6   X1, X2, X3
tail(n_df)
#       n1 n2 n3  n4                                                IV
# 57995  1 15  9 495   X2, X3, X4, X5, X7, X9, X10, X11, X12, X13, X15
# 57996  1 15  9 496                     X4, X6, X7, X8, X11, X12, X13
# 57997  1 15  9 497                X2, X3, X4, X9, X10, X11, X13, X14
# 57998  1 15  9 498        X2, X3, X5, X6, X8, X9, X10, X11, X12, X15
# 57999  1 15  9 499            X3, X4, X5, X6, X8, X10, X11, X12, X15
# 58000  1 15  9 500                      X2, X4, X6, X7, X8, X10, X11

然后根据需要进行分析或子集返回:

# TABULATE n2 COLUMN
table(n_df$n2)
#   10   11   12   13   14   15    3    4    5    6    7    8    9 
# 4500 4000 4500 4500 4500 4500 4500 4500 4500 4500 4500 4500 4500 
# SUBSET TO NEEDED CRITERIA
sub_n_df <- subset(n_df, n2 == "3")

最新更新