R 中的数据挖掘算法/降维/特征选择
在数据挖掘中,特征选择是通过分析和理解数据集特征对模型的影响来降低数据集维度的任务。例如,考虑一个预测模型C1A1 + C2A2 + C3A3 = S,其中Ci 是常数,Ai 是特征,S 是预测器输出。了解使用的特征(A1,A2 和A3)的重要性以及它们与模型的相关性及其与S 的相关性很有意思。这种分析使我们能够选择原始特征的一个子集,从而降低数据挖掘过程未来步骤的维度和复杂性。在子集选择过程中,我们尝试识别并尽可能多地删除不相关和冗余的信息。
特征选择技术可以分为两种方法:特征排序和子集选择。在第一种方法中,特征按某种标准进行排序,然后选择高于定义阈值的特征。在第二种方法中,人们在特征子集空间中搜索最佳子集。此外,第二种方法可以分为三个部分
- 过滤器方法:您首先选择特征,然后使用此子集执行分类算法;
- 嵌入式方法特征选择作为分类算法的一部分进行;
- 包装方法为了识别最佳特征,将分类算法应用于数据集。
R 的 FSelector 包提供了用于过滤属性(例如 cfs、卡方、信息增益、线性相关性)的算法,以及用于包装分类器和搜索属性子集空间的算法(例如最佳优先搜索、后向搜索、前向搜索、爬山搜索)。该包还使得能够通过执行不同的截止方式,根据属性权重选择特征子集。
FSelector 包由 Piotr Romanski 创建,本文基于 2009 年 4 月 11 日发布的 0.16 版本。
正如我们解释的那样,在排序方法中,特征按某种标准进行排序,然后选择那些高于定义阈值的特征。对于这种方法,可以考虑一个通用算法,您只需要决定要使用哪种最佳排序标准。在 F-Selector 包中,这种标准由一组函数表示,这些函数根据模型为您的特征计算权重。所有这些元素将在本文中进行解释。
特征排序方法的通用算法是
for each feature F_i
wf_i = getFeatureWeight(F_i)
add wf_i to weight_list
sort weight_list
choose top-k features
我们可以通过以下命令将这种算法思想转换为 R 语言
#load a dataset and use it as the main source of data
library(mlbench)
data(HouseVotes84)
#calculate weights for each attribute using some function
weights <- '''SOME_FUNCTION'''(Class~., HouseVotes84)
print(weights)
#select a subset of 5 features with the lowest weight
subset <- cutoff.k(weights, 5)
#print the results
f <- as.simple.formula(subset, "Class")
print(f)
在上面的代码的第一部分,我们使用函数library 加载包mlbench,它包含一系列人工和现实世界的机器学习基准问题,包括,例如,来自 UCI 存储库的几个数据集。(https://cran.r-project.org.cn/web/packages/mlbench/index.html)。之后,我们使用mlbench 数据集HouseVotes84(1984 年美国众议院投票记录)作为后续步骤的工作数据源。您也可以定义自己的数据集并将其提供为算法的输入,而不是使用HouseVotes84。
HouseVotes84 数据集包括美国众议院议员在 CQA 识别的 16 个关键投票中对每个投票的投票。CQA 包含 16 个变量,并考虑了由三种类别表示的九种不同类型的投票:同意(投票赞成、配对赞成、宣布赞成)、反对(投票反对、配对反对、宣布反对)和未知(投票出席、投票出席以避免利益冲突、未投票或未表明立场)。
在上面的代码的第二部分,我们使用某个函数计算每个属性的权重。该函数必须由用户选择,这些函数将在本文后面列出。这些函数的输出将是一个包含特征及其权重的列表,这些权重是根据所选技术确定的,并将保存在weights 数组中。您可以像使用命令print 一样打印权重。
在上面的代码的第三部分,我们定义了weights 数组中前 5 个特征的截止值。通过使用函数cutoff.k,我们告知数组名称和k 值,在本例中为 5。结果将存储在另一个名为subset 的数组中,该数组包含排名前 5 的特征及其权重。
在上面的代码的第四部分,您可以将最终模型打印为一个简单的公式,该公式由subset 数组中存在的特征子集和可预测的特征名称Class 组成。
以下列出的所有技术都可以用来生成特征的排名权重。第一个参数formula 是模型的符号描述(例如 Class~。对于所有特征都被用来预测特征Class 的模型)。第二个参数data 是模型要考虑的目标数据。
用法
chi.squared(formula, data)
皮尔逊相关性的用法
linear.correlation(formula, data)
斯皮尔曼相关性的用法
rank.correlation(formula, data)
信息增益的用法
information.gain(formula, data)
增益比的用法
gain.ratio(formula, data)
对称不确定性的用法
symmetrical.uncertainty(formula, data)
用法
oneR(formula, data)
用法
random.forest.importance(formula, data, importance.type = 1)
其中importance.type参数指定重要性度量的类型 (1=平均准确率下降,2=平均节点纯度下降)。
在特征子集选择方法中,人们会搜索特征子集空间以找到最优子集。这种方法存在于 FSelector 包中,通过包装技术 (例如,最佳优先搜索、后退搜索、前进搜索、爬山搜索) 来实现。这些技术通过告知一个函数来工作,该函数接收一个子集并为该子集生成一个评估值。在子集空间中执行搜索,直到找到最佳解决方案。
特征子集选择方法的通用算法是
S = all subsets
for each subset s in S
evaluate(s)
return (the best subset)
我们可以通过使用以下命令将算法思想翻译成 R 代码
#load a dataset and use it as the main source of data
library(mlbench)
data(HouseVotes84)
#define the evaluation function
evaluator <- function(subset) {
#here you must define a function that returns a double value to evaluate the given subset
#consider high values for good evaluation and low values for bad evaluation.
return(something)
}
#perform the best subset search
subset <- MY_FUNCTION(data, evaluator)
#prints the result
f <- as.simple.formula(subset, "Class")
print(f)
与本文第一个示例一样,我们再次使用 mlbench 库中的 HouseVotes84 数据集。我们必须定义一个评估函数,该函数将在给定子集上进行一些计算,并为好的子集返回一个高值。之后,您只需要选择一种搜索策略,并且还可以打印选择结果。
FSelector 包提供了一些函数来搜索最佳子集选择。在大多数情况下,attributes 参数是一个包含所有要搜索的属性的字符向量 (在搜索过程中将被划分为子集的特征集),而eval.fun 参数是一个函数,它将包含所有属性的字符向量作为第一个参数,并返回一个数值,指示给定子集的重要性。CFS 和一致性技术通过使用最佳优先方法封装了此过程,因此您只需要像在排名方法中一样告知符号模型和数据。
用法
best.first.search(attributes, eval.fun)
用法
exhaustive.search(attributes, eval.fun)
前向贪婪搜索用法
forward.search(attributes, eval.fun)
后向贪婪搜索用法
backward.search(attributes, eval.fun)
用法
hill.climbing.search(attributes, eval.fun)
用法
cfs(formula, data)
用法
consistency(formula, data)