在使用 R 进行数据挖掘的第 5 章中,作者展示了一些选择最有用的预测变量的方法。(在生物信息学的背景下,每个样本行有 12,000 多列!)
他首先使用了一些基于统计分布的过滤器。例如,如果您有六个具有相似均值和 sd 的预测变量,那么您可以只保留其中一个即可。
然后,他展示了如何使用随机森林来查找哪些是最有用的预测变量。这是一个自包含的抽象示例。你可以看到我有 5 个好的预测器,5 个坏的预测器。该代码显示了如何只保留最好的 3。
set.seed(99)
d=data.frame(
y=c(1:20),
x1=log(c(1:20)),
x2=sample(1:100, 20),
x3=c(1:20)*c(11:30),
x4=runif(20),
x5=-c(1:20),
x6=rnorm(20),
x7=c(1:20),
x8=rnorm(20,mean=100, sd=20),
x9=jitter(c(1:20)),
x10=jitter(rep(3.14, 20))
)
library(randomForest)
rf=randomForest(y ~ ., d, importance=TRUE)
print(importance(rf))
# %IncMSE IncNodePurity
# x1 12.19922383 130.094641
# x2 -1.90923082 6.455262
# ...
i=importance(rf)
best3=rownames(i)[order(i[, "%IncMSE"], decreasing=TRUE)[1:3]]
print(best3)
#[1] "x1" "x5" "x9"
reduced_dataset=d[, c(best3, 'y')]
作者的最后一种方法是使用层次聚类算法将相似的预测变量聚类到 30 个组中。如果您想要 30 个不同的预测变量,那么您可以从这 30 个组中的每个组中随机选择一个。
下面是一些代码,使用与上面相同的示例数据,从 10 列中选择 3 列:
library(Hmisc)
d_without_answer=d[,names(d)!='y']
vc=varclus(as.matrix(d_without_answer))
print(cutree(vc$hclust,3))
# x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
# 1 2 1 3 1 1 1 2 1 3
我的样本数据根本不适合这种方法,因为我有 5 个很好的预测器和 5 个只是噪声。如果所有 10 个预测变量都与 略有相关y,并且在一起使用时很有可能变得更好(这在金融领域很有可能),那么这可能是一个好方法。