R语言如何做特征选择

2025-09-24 20:10:29

1、首先,是caret包和C50包的安装,具体方法请参考“R语言如何做RF随机森林分类”及“R语言如和做支持向量机”。链接如下

11R语言如何做RF随机森林分类

9R语言如何做(SVM)支持向量机

2、首先,数据的准备本文的数据是从C50数据包中churn提取出部分训练和测试集来进行特征选择。处理数据的代码如下:

library(caret)  #加载特征选择caret包

library(C50)    #加载特征选择数据包

data(churn)

churnTrain <- churnTrain[,! names(churnTrain) %in% c("state","area_code","account_length")] 

set.seed(2)

ind = sample(2,nrow(churnTrain),replace=TRUE,prob=c(0.7,0.3))

trainset=churnTrain[ind==1,]

testset=churnTrain[ind==2,]

以上代码将数据分为两部分trainset和testset各占70%、30%。如图所示

R语言如何做特征选择

3、另外因为数据集中有字符串yes和no,故需要对数据进行分列,转换为1和0值。代码如下:

intl_plan = model.matrix( ~ trainset.international_plan - 1,data=data.frame(trainset$international_plan))

colnames(intl_plan)=c("trainset.international_planno"="intl_no","trainset.international_planyes"="intl_yes")

#将训练集中international_plan变为intl_yes和intl_no

voice_plan = model.matrix( ~ trainset.voice_mail_plan - 1,data=data.frame(trainset$voice_mail_plan))

colnames(voice_plan)=c("trainset.voice_mail_planno"="voice_no","trainset.voice_mail_planyes"="voice_yes")

#将训练集中ivoice_mail_plan变为intl_yes和intl_no

trainset$international_plan=NULL

trainset$voice_mail_plan=NULL

trainset=cbind(intl_plan,voice_plan,trainset)

#删除international_plan和ivoice_mail_plan,将之合并,下面同样处理测试集

intl_plan = model.matrix( ~ testset.international_plan - 1,data=data.frame(testset$international_plan))

colnames(intl_plan)=c("testset.international_planno"="intl_no","testset.international_planyes"="intl_yes")

voice_plan = model.matrix( ~ testset.voice_mail_plan - 1,data=data.frame(testset$voice_mail_plan))

colnames(voice_plan)=c("testset.voice_mail_planno"="voice_no","testset.voice_mail_planyes"="voice_yes")

testset$international_plan=NULL

testset$voice_mail_plan=NULL

testset=cbind(intl_plan,voice_plan,testset)

处理结果如图所示

R语言如何做特征选择

4、运用caret特征选择中的算法rfeControl()来进行特征优化;代码如下

  ldaControl=rfeControl(functions = ldaFuncs,method = "cv") #使用线性判别分析方法来创建一个特征筛选方法

  ldaprofile=rfe(trainset[,! names(trainset) %in% c("churn")],trainset[,c("churn")],sizes = c(1:18),rfeControl = ldaControl)   #删除训练集的标签列,利用1到18的数据子集对训练数据集trainset进行反向特征帅选

  ldaprofile  #打印输出

  plot(ldaprofile,type=c("o","g"))  #绘制选择结果示意图

关于size的设置,这是一个范围不是固定的本例有18个特征,故需要从1到18遍历所有组合,以确定最优特征(最高精度)组合。另外核函数根据需要来选择。

R语言如何做特征选择

R语言如何做特征选择

5、run: ldaprofile$optVariables  #检查最优变量子集

最优变量结果子集如图所示

R语言如何做特征选择

6、run: ldaprofile$fit  #检查合适的模型, 结果如图所示

R语言如何做特征选择

7、run: 

postResample(predict(ldaprofile,testset[,!names(testset) %in% c("churn")]),testset[,c("churn")])#重采样也就是用训练样本检验

 Accuracy     Kappa 

0.8585462 0.2678088 

输出模型总精度85%,Kappa系数为0.2678.

8、声明:此代码是参考“机器学习与R语言实战-丘祐玮著-第七章”。因为笔者也是不知道怎么使用caret特征选择算法,目前还在学习阶段,利用这本书来学习才刚刚对caret了解一点,顺便将自己手打代码分享给大家以供大家参考,欢迎一起讨论,共同进步!另外向大家推荐这本书,对于学习R语言很有帮助。

R语言如何做特征选择

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢