特征选择与Boruta算法详解

机器学习领域,经常面临一个误解:模型的特征越多,其准确性就越高。然而,事实并非如此。并非所有特征都同等重要,有些特征可能会对模型的准确性产生负面影响。特征数量与模型性能之间的关系并非线性,超过一定阈值后,增加特征维度反而会降低模型的准确性,这种现象被称为“维度的诅咒”。

添加不必要的特征维度会带来诸多问题,例如训练时间增加、模型准确性受影响,以及模型容易过拟合。如果两个特征之间存在强相关性,那么在模型中同时使用这两个特征将不会带来任何准确性的提升,只会增加计算时间。面对数据中特征众多的挑战,采用“特征选择”技术来解决这一问题,通过选择最重要的特征来提高模型的准确性并减少计算时间。

特征选择方法

特征选择方法主要分为三类:过滤法、包装法和嵌入式法。过滤法通过统计方法(如相关系数、方差分析、卡方检验等)来选择与目标变量关系密切的特征。包装法则不需要统计测试,它包括前向选择、后向消除和递归特征消除等方法。嵌入式法则通过创建所有可能的特征子集的组合和排列,然后选择能够提供最佳准确性的子集。

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))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485