在机器学习领域,经常面临一个误解:模型的特征越多,其准确性就越高。然而,事实并非如此。并非所有特征都同等重要,有些特征可能会对模型的准确性产生负面影响。特征数量与模型性能之间的关系并非线性,超过一定阈值后,增加特征维度反而会降低模型的准确性,这种现象被称为“维度的诅咒”。
添加不必要的特征维度会带来诸多问题,例如训练时间增加、模型准确性受影响,以及模型容易过拟合。如果两个特征之间存在强相关性,那么在模型中同时使用这两个特征将不会带来任何准确性的提升,只会增加计算时间。面对数据中特征众多的挑战,采用“特征选择”技术来解决这一问题,通过选择最重要的特征来提高模型的准确性并减少计算时间。
特征选择方法主要分为三类:过滤法、包装法和嵌入式法。过滤法通过统计方法(如相关系数、方差分析、卡方检验等)来选择与目标变量关系密切的特征。包装法则不需要统计测试,它包括前向选择、后向消除和递归特征消除等方法。嵌入式法则通过创建所有可能的特征子集的组合和排列,然后选择能够提供最佳准确性的子集。
Boruta算法是一种包装法特征选择方法,它基于随机森林算法。Boruta算法的名称来源于斯拉夫民间传说中的一个居住在松树中的怪物。该算法的工作原理是生成原始独立变量的影子特征,这些影子特征是原始特征的副本,但经过充分的洗牌以消除独立变量和目标属性之间的相关性。然后,算法将原始特征和影子特征合并,并将其传递给随机森林算法,以确定特征的重要性。
以下是使用R语言实现Boruta算法的步骤:
# 加载所需的库
library(caTools)
library(Boruta)
library(mlbench)
library(caret)
library(randomForest)
# 读取在线购物数据集
data <- read.csv("onlineshopping.csv", header = TRUE)
str(data)
# 使用Boruta函数找到重要和不重要的属性
set.seed(123)
boruta_res <- Boruta(Revenue~., data= data, doTrace=2, maxRuns= 150)
plot(boruta_res, las=2, cex.axis=0.8)
# 将数据分为训练集和测试集
set.seed(0)
split <- sample.split(data, SplitRatio = 0.75)
train <- subset(data, split == TRUE)
test <- subset(data, split == FALSE)
# 使用所有特征训练随机森林模型并检查准确性
rfmodel <- randomForest(Revenue ~., data = train)
pred_full <- predict(rfmodel, test)
confusionMatrix(table(pred_full, test$Revenue))
# 获取所有重要特征的公式
getConfirmedFormula(boruta_res)
# 使用仅重要特征训练模型并检查准确性
rfmodel <- randomForest(Revenue ~ Administrative + Administrative_Duration + Informational +
Informational_Duration + ProductRelated + ProductRelated_Duration +
BounceRates + ExitRates + PageValues + Month + OperatingSystems +
Browser + TrafficType + VisitorType, data = train)
pred_confirmed <- predict(rfmodel, test)
confusionMatrix(table(pred_confirmed, test$Revenue))