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

0s0u357o  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(64)

这个问题中提到的数据集和R脚本都可以在我的GitHub Repository中找到。
目标是在58 k个不同的csv文件格式的数据集上,使用elasticnet包中的enet函数,计算R中的LASSO函数拟合的回归模型数量(均位于同一文件夹中)是否正确。通过检查所选模型中该数据集的拟合模型中包含的变量是否与该数据集的真实基础回归模型完全匹配来确定该模型是否正确(它是那个数据集)。这些数据集是使用自定义Excel宏生成的,它的构建方式使我知道每个数据集的正确底层结构模型(细节在Pidoss.部分解释)。
我已经将LASSO为每个数据集选择的变量(在“LASSO代码”脚本中运行代码时)导出到名为“IVs_Selected_by_LASSO”的csv文件中,然后在正确排序后将其重新导入名为“量化LASSO的性能”的不同R脚本中(并将其分配给名为“BM1_models”的对象)。
所有拟合模型均存储在BM1_models对象中,如下所示,其中分号前的n1-n2-n3-n4代表每个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,以此类推,直到当其为15时为X1、X2、X3、X4、X5、X6、X7、X8、X9、X10、X11、X12、X13、X14、X15。如果当n2 = 3时所选模型为X1、X3、X4或X2、X3、X4,或除X1、X2、X3之外的任何其它组合,这是错误的,它必须是精确的。

k97glaaz

k97glaaz1#

考虑嵌套strsplit,然后将rbind分割向量到 Dataframe 中:

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")

相关问题