使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法

在caret(short for classification and regression training)包中有多个函数可以实现特征选择,总的分为封装法和过滤法。封装法,将特征选择过程与训练过程融合在一起,以模型的预测能力作为特征选择的衡量标准。封装法可以选出高质量的变量子集,但运行速度上会大打折扣。在caret包中,封装法有递归特征消除(recursive feature elimination:rfe)算法,遗传算法(genetic algorithms:ga)和模拟退火(Simulated annealing:sa)算法。过滤法的特征选择与训练过程相互独立,通过分析变量内部的关系进行筛选操作,与训练模型的选择并没有关系。过滤法通过变量间的相关性、近零方差检验、聚类分析等方法选择出来的变量,再用于不同的训练模型构建、评估等。过滤法虽然在速度上比封装法更占优势,但可能会删除非常有实质意义的变量。caret包中的过滤法有Selection By Filtering (SBF)。

递归特征消除(recursive feature elimination RFE)算法

RFE算法是基于预测器重要性排序的预测器向后选择。在建模之前,对预测因子进行排序,不太重要的因子依次剔除。其目标是找到可以用于生成准确模型的预测器子集。http://topepo.github.io/caret/recursive-feat-elimination。

使用rfeControl() 对特征选择的参数进行选择,使用ref() 返回特征筛选结果。

下面主要讲解每个函数里参数表示的含义及选择的标准。

Usage (默认参数设置)

rfeControl(

functions = NULL,

rerank = FALSE,

method = "boot",

saveDetails = FALSE,

number = ifelse(method %in% c("cv", "repeatedcv"), 10, 25),

repeats = ifelse(method %in% c("cv", "repeatedcv"), 1, number),

verbose = FALSE,

returnResamp = "final",

p = 0.75,

index = NULL,

indexOut = NULL,

timingSamps = 0,

seeds = NA,

allowParallel = TRUE

)

Arguments

functions #functions选择用什么样的模型进行自变量排序,可以选择的有rfFuncs(随机森林),lmFuncs(线性回归),nbFuncs(朴素贝叶斯,只能用于分类),treebagFuncs(装袋决策树),ldaFuncs(只能用于分类),lrFuncs,caretFuncs。

rerank #逻辑值:每次计算的变量重要性是否删除

method #样本重采样方法,用于重复训练/测试集的分割:boot、cv、LOOCV或LGOCV

saveDetails #逻辑值:从选择过程中保存预测和变量的重要性

number #重采样迭代的次数,默认如果method是"cv"或者"repeatedcv",number=10,其余为25。可自定义迭代次数。

repeats #只对重复的k折叠交叉验证,要计算的折叠完整集的数目,如果method是"cv"或者"repeatedcv",repeats=1,其余的话与number取值一致。

Verbose # 逻辑值:是否打印每次重采样迭代的记录

returnResamp #字符串(“final”, “all” or “none”):指示保存多少重采样的摘要指标。

p #训练集占所有样本的比例。

index #列表or NULL:指定样本进行迭代训练,每个列表元素代表用于迭代训练的样本行。

indexOut #列表or NULL:指定每次取样都要保留的样品。如果为NULL,则使用index中不包含的唯一样本集。

timingSamps #数值:输入训练集样本的数目,估计预测样本所需的时间。0则代表不需要估计。

seeds # 整数集or NA or NULL or列表:整数集表示每次重采样迭代时的种子;NA值代表工作中不设置种子;NULL值代表使用一组随机整数设置种子。也可以使用列表,列表应该有B+1个元素,其中B是重复采样的数量。列表的前B个元素应该是长度为P的整数的向量,其中P是被求值的子集的个数(包括整个集合),列表的最后一个元素只需要是一个整数(对于最终的模型)。

allowParallel #逻辑值:如果加载了一个并行后端并可用,函数是否应该使用它

用法

rfe(

x,

y,

sizes = 2^(2:4),

metric = ifelse(is.factor(y), "Accuracy", "RMSE"),

maximize = ifelse(metric == "RMSE", FALSE, TRUE),

rfeControl = rfeControl(),

...

)

参数

x, #矩阵或数据框:训练集的特征矩阵或数据框,该对象必须有唯一的列名。

y, #向量:训练集的结果向量,数值型向量(regression)或因子型向量(classification

sizes #向量:程序要测试的特征数目.

metric #字符串:后续模型总结使用的维度。regression使用"RMSE" 和"Rsquared";classification使用"Accuracy" and "Kappa"。

maximize # 逻辑值,如果metric=“RMSE”,则为FALSE,否则为TRUE

rfeControl # 模型参数

ref()返回的是一个列表。内容包含

Example

1、回归预测:使用lmFuncs,rfFuncs和treebagFuncs分别进行特征筛选,选择最优模型筛选的特征。

data(BloodBrain)

data(BloodBrain)

x <- scale(bbbDescr[,-nearZeroVar(bbbDescr)])

x <- x[, -findCorrelation(cor(x), .8)]

x <- as.data.frame(x, stringsAsFactors = TRUE)

inTrain <- createDataPartition(logBBB, p = .75, list = FALSE)[,1]

trainx <- x[ inTrain, ]

testx <- x[-inTrain, ]

trainy <- logBBB[ inTrain]

testy <- logBBB[-inTrain]

set.seed(1)

lmProfile <- rfe(trainx, trainy,

sizes = c(2, 4, 6, 8, 15, 30,45,60,length(x)),

rfeControl = rfeControl(functions = lmFuncs))

set.seed(1)

#耗时

rfFuncs <- rfe(trainx, trainy,

sizes = c(2, 4, 6, 8, 15, 30,45,60,length(x)),

rfeControl = rfeControl(functions = rfFuncs))

set.seed(1)

treebagFuncs <- rfe(trainx, trainy,

sizes = c(2, 4, 6, 8, 15, 30,45,60,length(x)),

rfeControl = rfeControl(functions = treebagFuncs))

比较不同模型的性能

xyplot(lmProfile$results$RMSE + rfFuncs$results$RMSE + treebagFuncs$results$RMSE ~

lmProfile$results$Variables,ylab = "RMSE",xlab = "Variables",

type = c("g", "p", "l"),

auto.key = TRUE)

xyplot(lmProfile$results$Rsquared + rfFuncs$results$Rsquared + treebagFuncs$results$Rsquared ~

lmProfile$results$Variables,ylab = "Rsquared",xlab = "Variables",

type = c("g", "p", "l"),

auto.key = TRUE)

b13af43d3a65958f1c59bf53bc3ccc22.png
不同模型的RMSE比较

3747536b4d8ab9f62eb49f68d9dd8b69.png
不同模型的Rsquared 比较

返回最优RMSE的特征数量

lmProfile$bestSubset

rfFuncs$bestSubset

treebagFuncs$bestSubset

e4ff78ce09ff02365944d5c8d3c076c0.png
返回最优RMSE的特征数量

postResample(predict(lmProfile, testx), testy)

postResample(predict(rfFuncs, testx), testy)

postResample(predict(treebagFuncs, testx), testy)

76948e369fcc4b3e51547349b868d559.png
返回筛选特征在验证集的效果

结论:可以看到虽然随机森林的方法在测试集和验证集的性能均达到最优(RMSE最低,Rsquared最高),但是保留了所有的特征,并没有起到特征筛选的作用;线性回归虽然在测试集中保留15个特征可以使模型达到最优,但是在验证集的性能却要差一点。所以,实际使用的时候,还是要根据项目需求来选择是否要对特征进行筛选,然后进行下一步的模型构建。

2、分类预测 ldaFuncs只能用于分类

data(mdrr)

mdrrDescr <- mdrrDescr[,-nearZeroVar(mdrrDescr)]

mdrrDescr <- mdrrDescr[, -findCorrelation(cor(mdrrDescr), .8)]

set.seed(1)

inTrain <- createDataPartition(mdrrClass, p = .75, list = FALSE)[,1]

train <- mdrrDescr[ inTrain, ]

test <- mdrrDescr[-inTrain, ]

trainClass <- mdrrClass[ inTrain]

testClass <- mdrrClass[-inTrain]

set.seed(2)

ldaProfile <- rfe(train, trainClass,

sizes = c(1:10, 15, 30),

rfeControl = rfeControl(functions = ldaFuncs,method = "cv"))

set.seed(2)

nbFuncs <- rfe(train, trainClass,

sizes = c(1:10, 15, 30),metric="Accuracy",

rfeControl = rfeControl(functions = nbFuncs,method = "cv"))

set.seed(2)

lrFuncs <- rfe(train, trainClass,

sizes = c(1:10, 15, 30),

rfeControl = rfeControl(functions = lrFuncs,method = "cv"))

set.seed(2)

caretFuncs <- rfe(train, trainClass,

sizes = c(1:10, 15, 30),

rfeControl = rfeControl(functions = caretFuncs,method = "cv"))

xyplot(ldaProfile$results$Accuracy + nbFuncs$results$Accuracy + lrFuncs$results$Accuracy ~

ldaProfile$results$Variables,ylab = "Accuracy",xlab = "Variables",

type = c("g", "p", "l"),

auto.key = TRUE)

xyplot(ldaProfile$results$Kappa + nbFuncs$results$Kappa + lrFuncs$results$Kappa ~

ldaProfile$results$Variables,ylab = "Kappa",xlab = "Variables",

type = c("g", "p", "l"),

auto.key = TRUE)

a67177bc1cb33923b7e5c38b0167b090.png
不同模型的Accuracy比较

8cddf8ab294b03cc4eb0ca64e94824df.png
不同模型的Kappa比较

postResample(predict(ldaProfile, test), testClass)

postResample(predict(nbFuncs, test), testClass)

postResample(predict(lrFuncs, test), testClass)

164d7ba1e884852c20c932cbb4ed8404.png
返回特征在验证集的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7 centos 查看程序文件数量_「动手打造家庭媒体网络平台」安装篇-centos搭建DLNA媒体服务...

大家好&#xff0c;我是路程lucky&#xff0c;热爱开发、设计、学习、生活、爱捣鼓的web前后端工程师~本文的重点是在之前文章提到创建的centos基础上继续搭建DLNA媒体服务。由于centos的系统是从零开始初步安装完成&#xff0c;我们在安装媒体服务时&#xff0c;不可避免出现各…

python 逻辑回归准确率是1_python数据分析(三)——逻辑回归之学生成绩预测

Python数据分析项目——学生成绩预测一&#xff0e;数据源阿里云天池公开数据集&#xff1a;学生成绩预测数据集https://tianchi.aliyun.com/dataset/dataDetail?dataId6785特征(Features)介绍&#xff1a;Gender: 性别Nationality: 国籍PlaceofBirth&#xff1a;出生地StageI…

向量数量积公式_多法 | 向量数量积相关最值问题的常见处理方法

近日QQ群更新的部分内容如下高中11大类86个易错点全梳理(185页Word)恒成立涉及10大类40小类题型梳理(100页Word)高中数学10大专题100个考点配例题全梳理2020高考真题分类汇编理科(14讲Word)2019年江苏高考数学题根系列(50份Word)2020届江苏高三上期中期末分类汇编(12讲Word)202…

kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中

每一个成功人士的背后&#xff0c;必定曾经做出过勇敢而又孤独的决定。放弃不难&#xff0c;但坚持很酷~最近有一个将 mysql 数据导入到 MongoDB 中的需求&#xff0c;打算使用 Kettle 工具实现。本文章记录了数据导入从 0 到 1 的过程&#xff0c;最终实现了每秒钟快速导入约 …

增量同步_使用Kettle工具进行增量数据同步

增量同步的方式有很多种&#xff0c;我使用的是: 快照表 触发器需求&#xff1a;当主库库表发生增删改时&#xff0c;从库库表与主库库表数据保持一致。环境&#xff1a;1、Mysql2、kettle 7.1思路&#xff1a;1、在主库中&#xff0c;将需要同步的库表新建快照表&#xff0c;…

mysql in优化_MySQL的一次优化记录 (IN子查询和索引优化)

这两天实习项目遇到一个网页加载巨慢的问题(10多秒)&#xff0c;然后定位到是一个MySQL查询特别慢的语句引起的&#xff1a;SELECT *FROM (SELECT DISTINCT t.vc_date, t.c_bankno, t.vc_bankacco, t.vc_moneytype, t.en_totalbala, t.en_usablebala, t1.vc_nameinbank, date_f…

mysql sqlite转换_数据库转换工具(SqliteToMysql)

SqliteToMysql是一款用于SQLITE和MYSQL之间的数据库转换工具。它能够将SQLITE数据转换成MYSQL数据库&#xff0c;让用户自主配置转换条件&#xff0c;满足用户的数据库格式需要。。相关软件软件大小版本说明下载地址SqliteToMysql是一款用于SQLITE和MYSQL之间的数据库转换工具。…

mysql 查看集群状态_MySQL数据库集群正确配置步骤

类型&#xff1a;电子教程大小&#xff1a;8.5M语言&#xff1a;中文 评分&#xff1a;8.3标签&#xff1a;立即下载对MySQL数据库集群进行正确配置的实际操作步骤&#xff0c;以及对其概念的讲述&#xff0c;如果你对其相关的实际操作有兴趣了解的话&#xff0c;以下的文章将会…

oschina mysql limit_MySQL 用 limit 为什么会影响性能?

点击上方“武培轩”&#xff0c;选择“设为星标”技术文章第一时间送达&#xff01;一&#xff0c;前言首先说明一下MySQL的版本&#xff1a;mysql> select version();-----------| version() |-----------| 5.7.17 |-----------1 row in set (0.00 sec)表结构&#xff1a;m…

在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...

推荐阅读&#xff1a;吊打面试官&#xff01;MySQL灵魂100问&#xff0c;你能答出多少&#xff1f;MySQL的InnoDB索引数据结构是B树&#xff0c;主键索引叶子节点的值存储的就是MySQL的数据行&#xff0c;普通索引的叶子节点的值存储的是主键值&#xff0c;这是了解聚簇索引和非…

根据从日期控件选定的时间以表格形式显示数据_VB项目开发FlexGrid控件使用讲解...

FlexGrid控件使用介绍大家好&#xff0c;在VB开发管理系统中&#xff0c;FlexGrid控件使用是非常普遍的。用FlexGrid ActiveX控件可以在 Visual Basic的窗体中创建一个电子数据表格&#xff0c;也可称之为网格。FlexGrid ActiveX控件可以在网格中显示任何类型的表格式数据&…

mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决

本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。现象&#xff1a;阿里金融某业务的MySQL机器的内存每隔几天就会增长&#xff0c;涨上去后&#xff0c;却不下来。累积后内…

mysql atlas更新问题_Atlas几种常见故障解决(不定期更新)

1)使用atlas却发现“读库闲置&#xff0c;框架还是去主库读写数据”配置完atlas之后&#xff0c;发现使用jdbc框架的话&#xff0c;读库和写库各司其职&#xff0c;但是使用mybatis框架之后&#xff0c;就发现框架的读写都去了主库&#xff0c;把读库放置一边&#xff0c;那么这…

如何更改mysql服务名_技术小百科 |【云小课】数据复制服务如何实现对象名映射...

数据复制服务(Data Replication Service&#xff0c;简称DRS)是一种易用、稳定、高效、用于数据库在线迁移和数据库实时同步的云服务。数据复制服务提供了在线迁移、备份迁移、数据同步、数据订阅和多活灾备等多种功能。数据复制服务支持哪些对象名映射数据复制服务的数据同步功…

python 二维强度图_荐 python数据分析matplotlib库使用之二维图形绘制

本篇内容会在后期不定时更新什么是matplotlibmatplotlib是最流行的python底层绘图库&#xff0c;主要做数据可视化图表。为什么要学习matplotlib能将数据进行可视化&#xff0c;更直观的呈现使数据更加客观&#xff0c;更具有说服力二维图绘制matplotlib库的基本使用之折线图导…

python数据爬虫代码_python如何示例爬虫代码

python爬虫代码示例的方法&#xff1a;首先获取浏览器信息&#xff0c;并使用urlencode生成post数据&#xff1b;然后安装pymysql&#xff0c;并存储数据到MySQL即可。python爬虫代码示例的方法&#xff1a;1、urllib和BeautifuSoup获取浏览器信息from urllib import requestre…

kali linux查看网卡_CentOS7.6安装无线网卡驱动|Linux如何安装网卡驱动|Linux如何让配置网卡...

此前提到&#xff0c;Thinkpad E490安装CentOS7.6遇到内核崩溃的问题&#xff0c;解决之后&#xff0c;安装CentOS7.6操作系统成功。安装时发现&#xff0c;系统能够检测到有线网卡&#xff0c;但无法检测到无线网卡&#xff0c;说明CentOS7.6对此无线网卡的支持不足&#xff0…

python本地编译器_Python学习札记(0)——Python开发环境搭载及推荐几款Python编译器...

1、进入网址&#xff1a;http://www.python.org/download/#id102、选择版本&#xff1a;其中有两个Python版本&#xff0c;一个为3.0以上版本&#xff0c;一个为2.7版本&#xff0c;主要区别有一些特定的软件只支持2.7版本其中的两个windows版本为&#xff1a;Python 3.3.3 Win…

如何将mysql的数据库渲染到页面_vue.js实现数据库的JSON数据输出渲染到html页面功能示例...

本文实例讲述了vue.js实现数据库的JSON数据输出渲染到html页面功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、首先通过json.php把数据库给输出为json格式的数据[{"id":1,"resname":"百度","resimg":"http://www…

java模块_Java 9 揭秘(2. 模块化系统)

文 by / 林本托Tips做一个终身学习的人。在此章节中&#xff0c;主要介绍以下内容&#xff1a;在JDK 9之前Java源代码用于编写&#xff0c;打包和部署的方式以及该方法的潜在问题JDK 9中有哪些模块如何声明模块及其依赖关系如何封装模块什么是模块路径什么是可观察的模块如何打…