[英]Counting the # of correctly selected models by a feature selection ML algorithm in its output structured as a df or list
[英]How to count the # of correctly selected models by a feature selection method in its output structured as a list or df in R
我已經在 58,000 個(csv 格式)隨機生成的合成數據集(所有相同大小)的同一文件夾上運行了機器/統計學習中的幾種最佳變量/模型選擇方法,以便比較哪種方法正確選擇了真正的底層 model每個數據集的次數最多。 所有腳本和許多數據集都可以在我的GitHub 存儲庫中找到,用於該研究項目。
我已經得到了我需要的輸出/結果,每個文件格式化數據集的名稱都以下列方式格式化:n1-n2-n3-n4 其中 n1 開始於 0 並結束於 1,n2 開始於 3 並結束於15,n3以1開頭,以9結尾,n4以1開頭,以500結尾。帶有結果的數據幀/列表如下所示:
> 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" ...`
> head(BM1_models, n = 4)
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
4 0-3-1-4; X1, X2, X3
> tail(BM1_models, n = 4)
V1
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
如何判斷 ML 變量/因子選擇方法(在本例中為 LASSO)是否適用於任何給定數據集,如果該數據集的 n2 為 3,則選擇的自變量應為 X1、X2、X3,如果它顯示為 4 ,底層結構 model 是 X1、X2、X3、X4 等直到 15(我將在底部的 ps 部分解釋 n1、n3 和 n4 的含義)。 所以,如果 function 里面的所有內容都在一個簡單的 function 中,我需要在復雜的情況下編寫類似計數 function 之類的東西,但我不知道具體怎么做。
ps Part1 數據集和腳本也可以在我的這個GitHub 存儲庫中找到,它應該比我鏈接到的第一個更容易導航。
ps Part2 澄清一下,如果給定數據集的 n2 = 5 並且選擇的 model 是 X1、X2、X4、X5(稱為省略變量 model 或 X1、X2、X3、X4、X5、X8、X9 等。稱為外變量模型),這是不正確的。只應計算包含所有變量 X1 到 Xn2 的 model,而不應計算其他所有結果。
ps Part3 n1 表示真實(基礎)結構回歸方程中因子之間的多重共線性量,n3 表示誤差方差,n4 表示其他 3 個參數的每組所有可能隨機生成的數據集中的 500 個隨機變化中的哪一個它是(這是蒙特卡洛模擬)。
如果我做對了,這個想法是檢查形式為'X1, X2, ..., Xn'
的字符串的第二部分是否等於基於同一字符串的第一部分的預期值。 我認為最簡單的方法是編寫一個sapply
對任何單個字符串進行比較,然后將其應用於字符串向量:
# testing df, only first (good) and last (bad) entry
df = data.frame(V1 = c('0-3-1-1; X1, X2, X3', '1-15-9-500; X2, X4, X6, X7, X8, X10, X11'))
good_model = function (str) {
str = unlist(strsplit(str, '; '))
desc = str[1]
pred = str[2]
n_2 = unlist(strsplit(desc, '-'))[2]
expt = paste0('X', 1:as.integer(n_2), collapse = ', ')
identical(pred, expt)
}
df$good = sapply(df$V1, good_model)
df
# V1 good
# 0-3-1-1; X1, X2, X3 TRUE
# 1-15-9-500; X2, X4, X6, X7, X8, X10, X11 FALSE
注意:我假設了;
之后的字符在原始字符串中是一個空格,如果它是一個<tab>
那么第一次調用strsplit()
應該被更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.