问题描述
我试图更多地了解 mlr3filters 的 AUC 过滤器。我使用分类任务 (task
) 和以下代码:
filter = flt("auc")
filter$calculate(task)
result<-as.data.table(filter)
从 mlr3measures::auc() 中的文档中,我了解到我需要一个概率向量和一个具有(二进制)因子值以及“true”类的向量。在我的任务中,我有二进制类(作为“目标”)和许多数字特征,但不是介于 0 和 1 之间,所以我不能将它们解释为概率。
那么为什么要计算 AUC?还是有额外的假设?我的问题是我无法从 filter$help()
读取此内容。
作为一个一般性问题:https://mlr3filters.mlr-org.com/reference/index.html 中的函数引用和底层 R 函数之间是否存在额外的“解释层”?例如,我知道 FilterVariance$new() 生成一个过滤器对象,该对象通过仅使用这些特征并应用 stats::var() 来计算单个特征的方差。但是从书中,我也看到我可以指定截止值:
po("filter",mlr3filters::FilterVariance$new(),filter.frac = 0.5)
在哪里可以找到有关此 filter.frac 值的详细信息?我在 filter$help()
和 stats::var()
同样,我理解 FilterCorrelation$new() 生成一个过滤器对象,它采用单个特征和目标来计算特征等级。这可能是不言自明的,但我想知道在哪里可以找到有关此类问题的更多详细信息。
我尝试了在此处找到的答案 (Filtering in mlr3filters - where can I find details about the methods?),但在 filter$help()
预先感谢初学者$help()
解决方法
虽然 AUC 过滤器的文档说明它类似于 mlr3measures::auc
,但它实际上并未使用该函数。相反,它使用它的 own implementation 来计算 Area Under the ("Receiver Operating Characteristic") Curve,它不需要概率值,只需要一个连续值,可以用来划分具有截止值的样本。
据我所知,Filter
主要用于计算过滤器分数(请参阅 documentation of the Filter
base class)。它们与 mlr3pipelines
包中的 PipeOpFilter
结合使用最有用,这也是您引用的 book 示例所做的。 PipeOp
通常用于将过滤步骤(或任何类型的预处理)集成到学习过程中(book chapter on mlr3pipelines
可能是了解这一点的好点)。但是,这些也可用于计算步骤,例如从 Task
中过滤出列:
pof = po("filter",mlr3filters::FilterVariance$new(),filter.frac = 0.5)
task = tsk("iris")
pof_result = pof$train(list(task))
pof_result[[1]]
#> <TaskClassif:iris> (150 x 3)
#> * Target: Species
#> * Properties: multiclass
#> * Features (2):
#> - dbl (2): Petal.Length,Sepal.Length
pof_result[[1]]$data()
#> Species Petal.Length Sepal.Length
#> 1: setosa 1.4 5.1
#> 2: setosa 1.4 4.9
#> 3: setosa 1.3 4.7
#> 4: setosa 1.5 4.6
#> 5: setosa 1.4 5.0
#> ---
#> 146: virginica 5.2 6.7
#> 147: virginica 5.0 6.3
#> 148: virginica 5.2 6.5
#> 149: virginica 5.4 6.2
#> 150: virginica 5.1 5.9
有关 $train()
方法的信息,请参阅 ?PipeOp
(尽管实际上本书章节是一个更好的起点,恕我直言)。 ?PipeOpFilter
记录了 filter.frac
超参数:
Parameters:
[...]
• ‘filter.nfeat’ :: ‘numeric(1)’
Number of features to select. Mutually exclusive with ‘frac’
and ‘cutoff’.
• ‘filter.frac’ :: ‘numeric(1)’
Fraction of features to keep. Mutually exclusive with ‘nfeat’
and ‘cutoff’.
• ‘filter.cutoff’ :: ‘numeric(1)’
Minimum value of filter heuristic for which to keep features.
Mutually exclusive with ‘nfeat’ and ‘frac’.
Note that at least one of ‘filter.nfeat’,‘filter.frac’,or
‘filter.cutoff’ must be given.
所以它所做的是运行 Filter
的 $calculate()
函数并根据结果 $score
选择特征。
回答关于从哪里获得帮助的更一般性的问题:通常对象类(通常可以通过调用 class(object)
找到)是一个很好的开始;通常,这些类继承自更通用的基类,如果它们不熟悉,这些基类也会解释过程的某些部分。在这个例子中,PipeOpFilter
继承自几个类,其中包括 PipeOp
—— 这在帮助文件中有所说明。除此之外,还有你知道的那本书。最后,如果其他一切都失败了,很遗憾,可能需要查看源代码。