R语言笔记之特征工程

1.特征构建(艺术成分最高)

特征构建指的是从原始数据中人工地构建新的特征
它需要我们从原始数据中找出一些具有物理意义的特征

2.特征提取

它是一项用不同变量的组合代替原变量的技术
它的目的是自动地构建新的特征,将原始特征转换为一组具有明显物理意义或者统计意义的特征。
下面是3个常用的对数据降维的特征提取方法
(1)主成分分析(PCA)
(2)探索性因子分析(EFA)
(3)高维标度化(MDS)

3.特征选择

在建立统计模型常常会有以下几个问题
a.模型拟合情况如何?
b.模型在新样本上预测的情况如何?
c.所有的自变量都有助于解释因变量(y),还是只有其中部分重要的自变量?
以上三个问题的共同前提是要先有一个评判模型的好与坏的标准
特征选择的主要目的是删除无信息变量或冗余变量,从而达到降维的效果。
特征选择的方法主要可以分成3类:
(1)过滤法(filter)

过滤法主要侧重于单个特征与目标变量的关系,在建模前对每个特征进行评估,选择“重要”的变量进行建模。
这里所说的重要性指的是一个量化预测变量和结果变量之间关系的粗略度量。
如果缺失某特征导致模型表现大幅度下降,表明变量重要性大。
该方法优点是计算时间上较高效。
该方法缺点是倾向于选择冗余的特征,因为他们不考虑特征之间的相关性,如果某一个特征重要性较高,所有和该特征高相关的特征重要性都会很高。
a.特征重要性度量
特征重要性度量的方式和其类型有关,分类型和连续型特征度量差别很大
这里我们按照不同的特征和因变量类型来介绍相应的常用度量。
a1.-因变量和特征都是数值型,最常用的是简单相关性统计量。
Pearson相关系数衡量线性相关,Spearman相关系数衡量曲线相关
Kendall相关系数衡量两个变量观测排序的一致性
基础包中的cor()函数可以计算这些相关性。
-用一个相关性度量有时会丢失很多信息,可以用局部加权回归模型(Loess),该方法对一系列局部区域样本应用多项式回归。这种方法可以有效得到平滑的回归趋势。
基础包中的loess()函数可以进行Loess平滑。
Lattice包中的xyplot()以及ggplot2包可以很方便对其进行可视化。
a2:对于特征是数值型,因变量是分类型的情况,可以使用ROC曲线下面积量化特征和因变量的相关性。
a3:如果特征和因变量都是分类型,有几种用于测量变量重要性的方法。
对于二分类预测变量,一个有效的方式是使用让步比。它表明从预测变量的第一类到预测变量的第二类,对应时间发生比的变化。
可以用Fisher确切检验来测量预测变量和相应结果类别的联系。
b.Relief算法
Relief为一系列算法,和其他重要性衡量的方法类似,该算法给出的是一个重要性分值,将分值低于某个阈值的特征移除。
这里可以将阈值当作调优参数通过划分测试集合训练集,基于一个模型表现的度量进行选择。
原始的Relief算法的基本原理是通过特征对近距离样本的区分能力来估计重要性。
c.结束

Relief算法的运行时间随着样本的抽样次数m和原始特征个数p的增加线性地增加,因而运行效率非常高。
Relief统计量的计算可以使用CORElearn包,attrEval()函数能计算几个不同版本的Relief值(使用estimator选项),该函数也能用来计算其他分值,如增益比,基尼系数等。

> library(CORElearn)
Warning message:
程辑包‘CORElearn’是用R版本3.4.3 来建造的 
> infoCore(what="attrEvalReg")
[1] "RReliefFequalK"      "RReliefFexpRank"     "RReliefFbestK"       "RReliefFwithMSE"     "MSEofMean"          
[6] "MSEofModel"          "MAEofModel"          "RReliefFdistance"    "RReliefFsqrDistance"
> infoCore(what="attrEval")
 [1] "ReliefFequalK"      "ReliefFexpRank"     "ReliefFbestK"       "Relief"             "InfGain"            "GainRatio"         
 [7] "MDL"                "Gini"               "MyopicReliefF"      "Accuracy"           "ReliefFmerit"       "ReliefFdistance"   
[13] "ReliefFsqrDistance" "DKM"                "ReliefFexpC"        "ReliefFavgC"        "ReliefFpe"          "ReliefFpa"         
[19] "ReliefFsmp"         "GainRatioCost"      "DKMcost"            "ReliefKukar"        "MDLsmp"             "ImpurityEuclid"    
[25] "ImpurityHellinger"  "UniformDKM"         "UniformGini"        "UniformInf"         "UniformAccuracy"    "EqualDKM"          
[31] "EqualGini"          "EqualInf"           "EqualHellinger"     "DistHellinger"      "DistAUC"            "DistAngle"         
[37] "DistEuclid"        
>  

要用置换检验观测到的Relief分值可以使用AppliedPredictiveModeling包中的permuteRelief()函数
重要性分值的置换分布非常有用,它能够让我们直观的了解分值 的随机性。(lattice::histogram())
标准化后的分值,其代表了观测到Relief分值(无置换)离置换分布中心的距离与标注差的比值。

(2)绕封法(wrapper)
它按照一定规律不断增加或者删除变量,通过评估不同特征组合得到的模型拟合结果寻找能够最优化模型拟合的特征组合。
其本质是搜索算法,将不同的特征子集当作输入,将模型评估结果作为需要优化的输出。
a.穷举法:
通过穷举得到所有可能的特征子集,然后找到优化模型拟合的组合。
通过leap包中 regsubsets()函数进行穷举变量选择
该方法问题在于:要拟合和评估所有可能的特征子集,对稍微大一点的p来说计算量过大。同时这种方法也会导致统计问题,如过度拟合和参数估计的高方差。
b.向前选择法(逐步回归)
其从没有特征的模型开始逐一加入特征,直到所有的特征都在模型当中。
当加入一个变量对模型提升有很大帮助时,就将该变量保留在模型中。
可以继续使用regsubsets()函数进行向前选择,只需要设置method=”forward”

c.向后选择法(逐步回归)
和向前选择不同的是,向后选择从含有所有p个特征的全模型开始,然后迭代逐一删除最 无效的特征。
向后选择评估的模型个数和向前选择一样,但它无法保证选出迭代模型是全局最优的。
可以用regsubsets()函数进行向后选择,需要设置method=”backward”

d.双向选择法(逐步回归)
和向前选择类似,模型从0个特征开始向模型里加特征,但不同的是,每次加入特征之后算法会重新评估模型,看是否有些特征可以移除。
R中的MASS包的函数stepAIC()可以根据AIC进行双向选择。
此外,基础包中step()函数也可以用来进行向前,向后和双向选择。

(3)内嵌法(embedded)
它是将特征选择的过程内嵌入建模的过程,它是学习器自身自主选择特征,如Lasso,或者使用决策树思想的方法。

猜你喜欢

转载自blog.csdn.net/lulujiang1996/article/details/79058520
今日推荐