在使用R进行数据挖掘的第5章中,作者展示了一些选择最有用的预测变量的方法。(在生物信息学的背景下,每个样本行都有12,000+列!)
他首先使用了一些基于统计分布的过滤器。例如,如果您有六个预测变量均具有相同的均值和标准差,则只需保留其中一个即可。
然后,他演示了如何使用随机森林来查找最有用的预测变量。这是一个独立的抽象示例。您可以看到我有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=T)
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=T)[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
,并且在一起使用时很有可能变得更好(在金融领域中很有可能),那么这可能是一个好方法。