mis*_*use 5 r feature-selection mlr
我想通过使用mlr包的虹膜数据集上的包装器方法来执行特征选择,但是我想仅查看与Petal和/或Sepal相关联的特征组.因此,不是以不同的组合查看4个特征,而是包装程序将以不同的组合查看两组特征.
国土资源部文件指出这可以用两个参数来执行bit.names和bit.to.feature:
bit.names [character]编码解决方案的位的名称.还定义了编码中的总位数.默认情况下,这些是任务的功能名称.
bits.to.features [function(x,task)]将整数0-1向量转换为所选要素的字符向量的函数.默认情况下,第i位中的值为1会选择第i个要素作为候选解.
我在mlr教程或其他地方找不到这两个参数的使用示例.
我将使用提供的示例?mlr::selectFeatures.
首先对所有功能进行操作
library(mlr)
rdesc <- makeResampleDesc("Holdout")
ctrl <- makeFeatSelControlSequential(method = "sfs",
maxit = NA)
res <- selectFeatures("classif.rpart",
iris.task,
rdesc,
control = ctrl)
analyzeFeatSelResult(res)
Run Code Online (Sandbox Code Playgroud)
这按预期工作
为了运行一组特征,我设计了一个0/1矩阵来将特征映射到组(我不确定这是否可行,它看似合乎逻辑):
mati <- rbind(
c(0,0,1,1),
c(1,1,0,0))
rownames(mati) <- c("Petal", "Sepal")
colnames(mati) <- getTaskFeatureNames(iris.task)
Run Code Online (Sandbox Code Playgroud)
矩阵看起来像:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Petal 0 0 1 1
Sepal 1 1 0 0
Run Code Online (Sandbox Code Playgroud)
现在我跑:
res <- selectFeatures("classif.rpart",
iris.task,
rdesc,
control = ctrl,
bit.names = c("Petal", "Sepal"),
bits.to.features = function(x = mati, task) mlr:::binaryToFeatures(x, getTaskFeatureNames(task)))
analyzeFeatSelResult(res)
#output
Features : 1
Performance : mmce.test.mean=0.0200000
Sepal
Path to optimum:
- Features: 0 Init : Perf = 0.66 Diff: NA *
- Features: 1 Add : Sepal Perf = 0.02 Diff: 0.64 *
Stopped, because no improving feature was found.
Run Code Online (Sandbox Code Playgroud)
这似乎执行我需要的但我不太确定我bits.to.features正确定义了参数.
但是当我尝试在包装器中使用相同的方法时:
outer <- makeResampleDesc("CV", iters = 2L)
inner <- makeResampleDesc("Holdout")
ctrl <- makeFeatSelControlSequential(method = "sfs",
maxit = NA)
lrn <- makeFeatSelWrapper("classif.rpart",
resampling = inner,
control = ctrl,
bit.names = c("Petal", "Sepal"),
bits.to.features = function(x = mati, task) mlr:::binaryToFeatures(x, getTaskFeatureNames(task)))
r <- resample(lrn, iris.task, outer, extract = getFeatSelResult)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Resampling: cross-validation
Measures: mmce
[FeatSel] Started selecting features for learner 'classif.rpart'
With control class: FeatSelControlSequential
Imputation value: 1
[FeatSel-x] 1: 00 (0 bits)
[FeatSel-y] 1: mmce.test.mean=0.7200000; time: 0.0 min
[FeatSel-x] 2: 10 (1 bits)
[FeatSel-y] 2: mmce.test.mean=0.0800000; time: 0.0 min
[FeatSel-x] 2: 01 (1 bits)
[FeatSel-y] 2: mmce.test.mean=0.0000000; time: 0.0 min
[FeatSel-x] 3: 11 (2 bits)
[FeatSel-y] 3: mmce.test.mean=0.0800000; time: 0.0 min
[FeatSel] Result: Sepal (1 bits)
Error in `[.data.frame`(df, , j, drop = drop) :
undefined columns selected
Run Code Online (Sandbox Code Playgroud)
我做错了什么,正确的用法bit.names和bit.to.feature参数是什么?
谢谢
编辑:我在mlr github上发布了一个问题:https://github.com/mlr-org/mlr/issues/2468
我猜你发现了两个错误。第一个是您的代码甚至可以运行,第二个是这不适用于嵌套重采样。
首先mati没有任何效果,因为它会被 的每个内部调用覆盖bits.to.features。毕竟您刚刚定义了一个默认参数。
您定义的内容bit.names "Petal"基本上"Sepal"只是告诉 mlr 使用两位。因此,特征选择将适用于向量 00、01、10、11。不幸的是,R 现在自动将这些向量回收到长度 4,因此 10 变为 1010:
mlr:::binaryToFeatures(c(1,0), getTaskFeatureNames(iris.task))
# [1] "Sepal.Length" "Petal.Length"
Run Code Online (Sandbox Code Playgroud)
我们有第一个错误,MLR 应该避免这里的向量回收。
为了使代码按预期运行,您可以bits.to.features像这样定义函数:
bitnames = c("Sepal", "Petal")
btf = function(x, task) {
sets = list(
c("Sepal.Length", "Sepal.Width"),
c("Petal.Length", "Petal.Width")
)
res = unlist(sets[as.logical(x)])
if (is.null(res)) {
return(character(0L))
} else {
return(res)
}
}
res <- selectFeatures("classif.rpart", iris.task, rdesc,
control = ctrl, bits.to.features = btf, bit.names = bitnames)
Run Code Online (Sandbox Code Playgroud)
bts引用帮助页面selectFeatures:
[function(x, task)]将整数 0-1 向量转换为所选特征的字符向量的函数。默认情况下,第 i 位中的值为 1 会选择第 i 个特征出现在候选解决方案中。
x包含 0 和 1 的向量也是如此(例如c(0,0,1,0))。如果您不更改该函数,它将返回第三个特征的名称(例如"Petal.Length"虹膜)。该向量x将始终与定义的长度相同bit.names。然而,生成的字符向量可以是任意长度。它只需要返回任务的有效功能名称。
在示例中,我将功能名称硬编码到函数中bts。如果您想将该函数应用于许多不同的任务,这是不好的做法。因此,mlr 使您可以访问该task对象,因此也可以访问功能名称,getTaskFeatureNames(task)以便您可以以编程方式生成功能名称,而不是硬编码。
bit.names必须是功能名称特征选择返回位名作为结果。然后 mlr 尝试在数据集中选择这些位名,但显然它们不存在,因为它们完全不相关(在您的情况下)。
此错误现已在 github 版本的 mlr 中得到解决。