文章目录
- 一、特征工程概述
- 二、特征选择
- 1.什么是特征选择
- 2.为什么要做特征选择
- 3.特征选择的基本原则
- 4.特征选择常用的四种方法
- 4.1 方差选择法
- 4.2 相关系数法
- 4.3 递归特征消除法
- 4.4 模型选择法
- 参考:
- 三、特征构造
- 1.什么是好?
- 2.常见做法
- 3.两个变量组合而成的特征转换
- 4.常见的多个变量的特征转换
一、特征工程概述
在商业数据的分析挖掘当中,最常用的数据是结构化数据,其呈现为二维表的结构,数据可以用装载到二维数组当中,其中的每个数可以使用行与列进行索引。结构化数据中的每一行称为记录,也可称为样本或实例(视不同的学科而定),每一列则被称为字段,也可称为变量或特征(同样视学科领域而定),其中“特征(Feature)”这一叫法在机器学习及模式识别当中被广泛使用,在应用当中只要不引起歧义,可以不区分它们的叫法。
特征(feature)是一个被观察到的现象的可测量的属性,结构化数据中,特征通常以列的形式出现,用于描述记录在某些方面的属性;非结构化数据同样如此,例如对于一个文档,短语或单词的计数就可以是其一个特征。
特征是模型的输入,而不同的模型对输入有不同的要求。正因如此,原始数据往往需要通过一定的处理和转换才能在模型中使用,而为了提升模型的表现,又需要对所有可用的特征进行一定的筛选,既保证重要的特征进入模型,又要保证不会选择过多的特征。所有这些在建模前对数据进行处理、转换、筛选的工作被称为特征工程(Feature Engineering),其本质上是对原始数据的再加工,目的是产生进入模型的特征。“特征工程”这一名称在机器学习与模式识别领域被大量使用,在数据挖掘标准流程CRISP-DM
当中,“数据准备”(Data Preparation)具有与特征工程相同的作用和类似的方法,因此在应用当中,无需严格区分,本章当中使用“特征工程”这一名称。
特征工程分为数据预处理(Data Preprocessing)、特征抽取(Feature Extraction)、特征构造(Feature Construction) 和 特征选择(Feature Selection) 等几个步骤,每个步骤间没有明显的顺序之分,往往需要根据需求反复执行,甚至也没有严格区分的概念边界,例如特征构造可能会与数据预处理使用同样的数据变换技术等等。
特征工程在整个数据分析的流程当中占用最多的工作时间,而且具有重要的地位,可以认为,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
此外,为了演示特征工程的案例,建议采用pandas
与scikit-learn
进行数据的处理。因为商业数据通常是结构化的,pandas
包可以很好地对这类数据进行读取、统计、汇总、变换,也可以进行一些简单的可视化,因此数据的预处理可以使用pandas
中的函数和方法。同时scikit-learn
包作为流行的机器学习框架,对机器学习的多种方法都有支持,包括了对数据预处理、特征选择等建模前步骤的方法支持。
二、特征选择
1.什么是特征选择
特征工程(Feature Selection)
,也叫做特征子集选择(Feature Subset Selection, FSS)
, 或者叫做属性选择(Attribute Selection)
。是指从全部的数据特征中选取合适的特征,从而确保模型变得更好。
2.为什么要做特征选择
特征数量越多模型就越好吗?
不是,特征越多,意味这模型的计算维度越大,模型也会更复杂,从而训练模型的时间就会越长。这叫做“维度灾难”。
特征选择的意义便是,剔除掉一些不相关的特征,剔除掉一些重复的特征,在保证特征有效性的同时减少特征数量,从而提高模型精确度,减少模型复杂度,减少模型训练时间。另外,对模型做筛选会帮助模型变得更有可解释性和逻辑性。
3.特征选择的基本原则
特征与我们的目标是否具备发散性、相关性,我们要对相关性强的特征进行优先选择。
4.特征选择常用的四种方法
4.1 方差选择法
先计算各个特征的方差,根据阈值,选择方差大于阈值的特征。这个我想了很久,方差大的发散性就好,就适合做特征变量,方差低于阈值的,发散性就差,就不适合做特征变量。
大白话就是计算每个特征的方差。
from sklearn.feature_selection import VarianceThresholdvarianceThreshold = VarianceThreshold(threshold =1)
varianceThreshold.fit_transform([['累计票房','豆瓣评分']])
varianceThreshold.get_support()
输出哪些变量可以作为可用的特征,哪些不可以。
当阈值为1时,我们发现两个特征都可以作为特征的。
当阈值为3时,我们发现两个特征只有一个可以作为有效特征。
不过这个方法可能在互联网行业适用,在有些精密领域,也许方差的大小很难确认,还是需要行业经验辅助。
4.2 相关系数法
计算各个特征值和目标值的相关系数,选取相关性强的特征。
from sklearn.feature_selection import SelectKBest
from skleasrn.feature_selection import f_regressionselectKBest = SelectKBest(f_regression, k=2)
feature = data[['月份','季度','广告费用','客流量']]
bestFeature = selectKBest.fit_transform(feature, data[['销售额']])
selectKBest.get_support()
4.3 递归特征消除法
使用一个基模型来进行多轮训练,训练多轮训练后,保留指定的特征数。
递归特征前提是选择一种模型,例如SVM或者逻辑回归,然后选择一定数目的特征,进行模型评估。接下来对审改的特征重复上述动作,直到所有特征都遍历。最后,选择出模型效果最好的特征。
递归特征消除法属于一种贪心算法。 优点在于想法很好,缺点是当数据量很大时,这种贪心算法会导致计算很慢。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegressionfeature = data[['月份','季度','广告费用','客流量']]
rfe = RFE(estimator = LinearRegression(), n_features_to_select=2)
sFeature = rfe.fit_transform(feature, data[['销售额']])
rfe.get_support()
4.4 模型选择法
把我们建好的模型对象传入选择器,然后会根据建好的模型,自动帮我们选择最好的特征值。该方法自动选择最佳的特征,特征数不需要我们定。
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LinearRegressionIrModel = LinearRegression()
selectFromModel = SelectFromModel(IrModel)
selectFromModel.fit_transform(feature, data[['销售额']])
feature.columns[selectFromModel.get_support()]
参考:
https://www.jianshu.com/p/ad71fcda7d09
三、特征构造
导读:数据科学从业者们更倾向于选择用著名的算法来解决给定的问题,但仅仅靠算法并不能提供一个最优的解决方案,通过精心设计和选择的特征所建造的模型能够提供更好的结果。
此篇作者总结了很多常见且有效的特征转化的方法,有些方法附有简单说明。具体的应用方法可以在网络上搜索公开信息。
“任何一个有智力的笨蛋都可以把事情搞得更大,更复杂,也更激烈。往相反的方向前进则需要一点天分,以及很大的勇气。” –阿尔伯特·爱因斯坦
复杂的模型不易解释,难以调整。简单的算法配合更好的特征或者更多的数据,比脆弱的假设配合复杂的算法会得到更好的结果。
1.什么是好?
好的特征代表了灵活性、更简单的模型和更好的结果,不相关的特征则会影响模型的泛化性。因此特征选择和特征工程并非是互相排斥的,而是相辅相成的。有效的特征工程能够帮助我们提炼数据的代表。接着问题就来了,什么才是好的代表?
代表的好坏取决于里面所包含信息的好坏。
熵(Entropy
,熵值越高,数据中所包含的信息越多),方差(Variance
,方差越大,数据中所包含的信息越多),更好的分离映射(Projection for better separation
,最高的方差所对应的映射包含更多得信息),特征对类别的关联(feature to class association
)等。所有这些都解释了数据中所包含的信息。
特征工程是建模过程中很重要的一个步骤,但也很难实现自动化,它需要专业知识和很多数据的探索性分析。
2.常见做法
-
单一变量的基础转换:
x
,x^2
,sqrt x
,log x
,缩放
-
如果变量的分布是长尾的,应用
Box-Cox
转换(用log
转换虽然快但不一定是一个好的选择) -
你也可以检查残差
(Residuals)
或是log-odds
(针对线性模型),分析是否是强非线性。 -
对于基数比较大的数据,对于分类变量,创造一个表示每种类别发生频率的特征是很有用的。当然,也可以用占总量的比率或是百分比来表示这些类别。
-
对变量的每一个可能取值,估计目标变量的平均数,用结果当做创造的特征。
-
创造一个有目标变量比率的特征。
-
选出最重要的两个变量,并计算他们相互之间、以及与其它变量之间的二阶交叉作用并放入模型中,比较由此产生的模型结果与最初的线性模型的结果。
-
如果你想要的解决方案更平滑,你可以应用径向基函数核(
Kadial Basis function kernel
) 。这就相当应用一个平滑转换。 -
如果你觉得你需要协变量(
Covariates
),你可以应用多项式核,或者明确添加它们的协变量。 -
高基数特征:在预处理阶段,通过
out-of-fold
平均转换成数值变量。
3.两个变量组合而成的特征转换
以下为一些常见的由两个变量组合而成的特征转换:
-
加法转换
-
相对于基数的差值
-
乘法转换:交互效果
-
除法转换:缩放/归一化
-
对数值型特征设定阈值以获取其布尔值
-
笛卡儿积变换
-
特征向量积:所有特征的向量积
试想一个特征A,它有两个可能的值:{ A1,A2 } 。假设B是一个具有两种可能性{ B1,B2 }的另一特征。
那么, A和B之间的向量积(我们称之为AB)将采取以下值之一:
{ (A1 , B1),(A1 , B2),(A2 , B1),(A2 , B2) }
。
你基本上可以赋予这些”组合”你喜欢的任何名称。但要记住,每个组合都表示一个由A和B的相应值包含的信息之间的协同作用。
- 归一化/数据标准化变换
- 在机器学习算法中提出的隐含假设(对朴素贝叶斯而言,在某种程度上是显性假设)之一是:该特征服从正态分布。不过,有时我们可能会发现该特征不遵循正态分布,而是对数正态分布。那么在这种情况下常见的手段之一是取特征值的对数(即表现出对数正态分布的那些特征值),使得它展现出正态分布。如果在使用中的算法做出了正态分布的隐含/显性假设的话,则这种转化,即将一个服从对数正态分布的特征转化为正态分布,可以帮助改善该算法的性能。
- 分位数分级转换 (
Quantile Binning Transformation
) - 白化数据 (
Whitening the Data
) - 窗体压缩化 (
Windowing
)
如果所有的点都分布在时间轴上,那么在同一个窗口里的先前的点往往包含丰富的信息。
- 最小-最大归一化:不一定保留顺序
- S型/正切/对数转换 (
Sigmoid / Tanh / Log Transformations
) - 用特殊方法处理0:对于计数特征有可能很重要
- 去相关性/转换变量
- 重构数量
- 将不频繁的分类变量划分到新的/独立的类别中。
- 按顺序应用一系列转换。
- 独特的编码方式
- 靶值率编码 (
Target rate encoding
) - 哈希技巧 (
Hash Trick
)
4.常见的多个变量的特征转换
以下为一些常见的多个变量的特征转换:
-
主成分分析 (
PCA
) -
模型集成
-
压缩感知 (
Compressed Sensing
) -
“猜平均值”或是“猜通过变量X分段后的平均值”
-
处理映射(
hack projection
): -
执行聚类(
clustering
)并使用点和聚类中心的距离作为一个特征 -
主成分分析/奇异值分解 (
PCA/SVD
)这是用来分析变量之间的相互关系和在信息损失最小的情况下执行降维的有效技术。找到透过数据中,拥有最大方差的轴。在下一个正交轴上重复该步骤,直到你用完了数据或维度。每个轴都代表着一个新特征。
39.稀疏编码(sparse coding
)
选择基元:基于你能如何用一个基元来重建输入值和它有多稀疏来评估该基元;采取一些梯度步骤,以改进该评估。
- 有效的稀疏编码算法
- 深度自编码
40.随机森林:训练一部分决策树:使用每个叶子作为一个特征
原文:https://www.linkedin.com/pulse/feature-engineering-data-scientists-secret-sauce-ashish-kumar