R语言caret包的学习(一)--数据预处理

本文介绍了R语言caret包在数据预处理中的应用,包括创建虚拟变量(model.matrix(),dummyVars())、识别和处理零方差及近似零方差特征变量、发现相关特征以及使用preProcess函数进行数据转换。caret包提供了丰富的函数,如findCorrelation()和nearZeroVar(),用于优化数据质量,提高模型性能。

caret包(Classification and Regression Training)是一系列函数的集合,它试图对创建预测模型的过程进行流程化。本系列将就数据预处理、特征选择、抽样、模型调参等进行介绍学习。

本文将就caret包中的数据预处理部分进行介绍学习。主要包括以下函数:model.matrix(),dummyVars(),nearZeroVar(),findCorrelation(),findLinearCombos(),preProcess(),classDist(),featurePlot()

创建虚拟变量

创建虚拟变量的两个主要函数:model.matrix , dummyVars

model.matrix()

 model.matrix(object, data = environment(object), contrasts.arg = NULL, xlev = NULL, ...) 

其实,主要参数为object,一个公式;data就是引用的数据咯

这里,式子中 ~后可以理解为要展开的数据(其实也可以有只有一个因子水平的数据,从而便于在展开数据的同时,cbind其他列的数据,从而得到接下来分析用到的数据),结果返回的是matrix类型

如上所示,有3个因子水平的a被展开成2列,其他一列被省掉,减少了多重共线性的困扰。但是,没搞明白,intercept是怎么得出来的?????

dummyVars()

 dummyVars(formula, data, sep = ".", levelsOnly = FALSE, fullRank = FALSE, ...) 

其用法跟model.matrix差不多,主要参数依旧是formula和data

不同的是

可以看出两点不同了:1. 需要调用predict函数才能显示矩阵   2. 是对所有level进行展开

此外,dummyVars还可以生成交互的展开

当然,还可以通过 sep = ";" 将a;1的形式,   levelsOnly = TRUE 将a.1改成1, 但a.1:b.1改成1:1  不行 报错 情理之中,因为这样1:1的话就没有辨识度了,只有level是唯一不重复的,才可以如愿。

注意:因为dummyVars展开的没有截距(intercept),并且每个因子水平都有对应的虚拟变量,所以这些参数对于某些模型可能是不可用的,例如lm等

 

零方差和近似零方差特征变量

识别清除近似零方差的特征变量的原因: 

  • 在某些情况下,数据产生机制只创建具有单一值的特征变量(例如零方差特征变量)。这对于大多数模型(不包括树模型)来说,这可能造成模型的破坏,或者数据拟合的不稳定。
  • 同样的,特征变量中可能有一些出现频率非常低的唯一值,当这样的数据使用交叉验证(cross-validation)或自助法(bootstrap)抽样或一些样本可能对模型有过度影响的时候,这些特征变量可能变成零方差的特征变量

识别此种特征变量的方法:

  • 最大频率数值的频数比上第二频率数值的频数(称作频数比率(frequency ratio)),对于平衡的特征变量其值接近1,对于高度不平衡的数据其值会非常大
  • 唯一值比例就是唯一值的个数除以样本的总数再乘以100, 它随着数据粒度的增大而几近于0。 

如果频数比率大于预先设定的阈值,并且唯一值的比例小于一个阈值,我们可以认为这个特征变量为近似零方差。 

caret包中提供了函数:nearZeroVar()

 nearZeroVar(x, freqCut = 95/5, uniqueCut = 10, saveMetrics = FALSE, names = FALSE, foreach = FALSE, allowParallel = TRUE) 

参数解释:

  • x 是一个数值型向量、矩阵或data frame,freqCut是频数比率阈值,uniqueCut是唯一值比例阈值
  • saveMetrics是一个逻辑值,false时返回的是近零特征的位置,true时,返回特征信息的data frame
  • name 逻辑值,false时,返回列的索引,true时返回列的名字
  • foreach 是否调用foreach包,若为ture,将使用更少的内存
  • allowPatallel 是否通过foreach包进行并行计算,若为true,将占用更多内存,但执行时间更短

返回的参数解释:

freqRatio 频数比率  percentUnique 唯一值比率   zeroVar 是否仅有一个值   nzv 是否是近零方差特征

清除近零方差特征变量:

 

识别相关的特征变量

有些模型依赖与相关的特征变量(像偏最小二乘法(pls,partial least-squares regression)),而有些模型能够得益于变量之间的相关性减少。

 findCorrelation(x, cutoff = 0.9, verbose = FALSE, names = FALSE, exact = ncol(x) < 100) 

参数解释:

  • x 是一个相关性矩阵
  • cutoff 是相关性绝对值的阈值
  • verbose 是否显示details
  • names 是否返回列名。false时,返回列的索引
  • exact 逻辑值,平均相关性是否在每一步重新计算。当维数比较大时,exact calculations将清除更少的特征,且比较慢

 

线性相关性

函数findLinearCombos使用QR分解来枚举线性组合的集合(如果存在的话)

 findLinearCombos(x)   只有一个参数x,x是一个数值矩阵

返回一个列表,含有两项:

  • linearCombos  若有线性相关的,显示列索引向量
  • remove 为去除线性相关性,应去除的列索引

preProcess函数

preProcess函数可以对特征变量施行很多操作,包括中心化和标准化。preProcess函数每次操作都估计所需要的参数,并且由predict.preProcess 应用于指定的数据集。

preProcess(x, method = c("center", "scale"), thresh = 0.95,     
                pcaComp = NULL, na.remove = TRUE, k = 5, 
                knnSummary = mean, outcome = NULL, fudge = 0.2, 
                numUnique = 3, verbose = FALSE, freqCut = 95/5, 
                uniqueCut = 10, cutoff = 0.9, ...)        

x 是一个矩阵或数据框。非数值型的变量是被允许的,但是将被忽略

method 处理类型的字符串向量。常见的几种如下:

  • center 中心化,即减去自变量的平均值
  • scale  标准化,即除以自变量的标准差,变换后值域为[0,1]。如果新样本值大于或小于训练集中值,则值将超出此范围。
  • BoxCox 变换,用于自变量,简单,与幂变换一样有效
  • YeoJohnson 与BoxCox 变换相似,但是它的自变量可以是0或负数,而BoxCox只能是正数
  • expoTrans 指数变换(exponential transformations)也可以被用于正数或负数
  • zv  识别并清除掉只含有一个值的数值型自变量
  • nzv 相当于应用nearZeroVar,清除近零方差的自变量
  • corr 寻找并过滤掉具有高相关性的自变量,参见findCorrelation

这些方法的运行顺序是:zero-variance filter, near-zero variance filter, correlation filter, Box-Cox/Yeo-Johnson/exponential transformation, centering, scaling, range, imputation, PCA, ICA then spatial sign. 

thresh  PCA的累积方差比

其实,preProcess的功能很强大,据说还可以对数据进行插补缺失值(K近邻,袋装树bagged tree)

笔者还未深入研究,在此不一一叙述

类别距离计算

classDist 函数计算训练集的类别质心和协方差矩阵,从而确定样本与每个类别质心的马氏距离。

 classDist(x, y, groups = 5, pca = FALSE, keep = NULL, ...) 

 predict(object, newdata, trans = log, ...)  默认的距离取对数,但是这可以通过predict.classDist的参数trans来改变

可见,上图关于对角线对称,且将test分为两类,蓝色一类,红色一类。

数据描述性可视化

caret包中的可视化是对lattice包作图的集成。主要函数是featurePlot

 featurePlot(x, y, plot = “strip”, labels = c("Feature", ""), ...) 

x 为一个连续数值的矩阵或data frame

y 是一个表明类别的因子变量

plot 是作图的种类。对于分类有: box, strip, density, pairs,ellipse,对于回归有pairs,scatter。默认情况下,当y为因子,则为strip,否则为scatter  (注意:若用ellipse作图,需加载ellipse包)

还可以设定其他的可传递给lattice的选项。常见的有

  • layout=c(3,1) 将图设置为3行1列;
  • auto.key = list(columns = 3)) 将图例置于图顶,并以3列摆开

 

参考:

 http://topepo.github.io/caret/pre-processing.html其中文翻译见此

转载于:https://www.cnblogs.com/Hyacinth-Yuan/p/8284612.html

内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,并强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务分配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习并实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值