在机器学习领域有这样一种说法——“特征处理决定了模型效果的上限,而算法则决定了模型能够在多大程度上接近这个上限”。从应用角度来说,纵观整个建模流程,数据预处理、特征工程占据80%以上时间,而模型建立和评估仅仅20%的时间。现在,我们就来看看特征工程的一些基本操作方法。
一、相关性检验
相关性检验主要用于检验变量之间两两的相关性,可以求自变量和因变量之间的相关性,也可以求自变量和自变量之间的相关性。自变量和因变量之间相关系数的大小能一定程度上反映变量的重要程度。自变量之间相关系数较大的话,需要考虑共线性的问题,共线性会导致模型出现开式解,降低模型的稳定性。
常见方法有皮尔森相关系数和斯皮尔曼相关系数。两个系数都是介于-1和1之间,-1表示完全负相关,1表示完全正相关,0表示完全不相关。
使用皮尔森相关系数有局限:要求数据是成对的从正态分布中取得的。而斯皮尔曼相关系数是一种秩相关系数,不受数据分布的影响,它通过对变量排序,以排序后两个变量的秩次差来计算相关系数。详情可参见文章相关性检验--Spearman秩相关系数和皮尔森相关系数。
二、离散化
变量离散化最重要的目的是为了降低过拟合的风险,因为粒度越小越容易出现过拟合。离散化可以提高模型运算速度,除此之外,还可以引入非线性特性。
举一个例子,如果有一个变量是年龄,我们知道大多数人的年龄均在0-100岁之间,那么如果有一个人的年龄是200岁,这是一个很明显的离群值。那么我们除了可以按照异常值的盖帽处理之外,还可以对年龄进行分段处理,比如可以把所有年龄分为四段0-10,10-30,30-50,50以上,这样一来,200就归到50以上那个分段里面了。
变量离散化主要有卡方检验法和信息增益法:
一、 卡方检验方法
1.1 分裂方法
1.2 合并方法
分裂方法,就是找到一个分裂点看,左右2个区间,在目标值上分布是否有显著差异,有显著差异就分裂,否则就忽略。这个点可以每次找差异最大的点。合并类似,先划分如果很小单元区间,按顺序合并在目标值上分布不显著的相邻区间,直到收敛。
二、信息增益方法
2.1 分裂方法
2.2 合并方法
这个和决策树的学习很类似。分裂方法,就是找到一个分裂点看,左右2个区间,看分裂前后信息增益变化阈值,如果差值超过阈值(正值,分列前-分裂后信息熵),则分裂。每次找差值最大的点做分裂点,直到收敛。合并类似,先划分如果很小单元区间,按顺序合并信息增益小于阈值的相邻区间,直到收敛。
以上内容引用自连续特征进行离散化的方法介绍与应用例子。
三、哑变量
在讲哑变量之前,我们首先要知道常见变量的类型,大的方面来分,可以分为连续型和离散型,而离散型又可以分为分类变量(如职业)和有序变量(如学位)。这些离散型变量一般是字符型的,但计算机只能识别数值型变量,因此需要给这些变量做哑变量变换。
具体怎么做呢?最简单的如性别,无非是男或者女,我们就可以用一个哑变量“是否男性”(男:1,女:0)来表示,再比如已知一群人属于一线城市(北上广深)的某一个,则可以构建一组哑变量——是否北京(是:1,否:0),是否上海(是:1,否:0),是否广州(是:1,否:0),那么北京人对应1/0/0,上海人对应0/1/0,广州人对应0/0/1,深圳人则是0/0/0。
所以对于N分类来说,构建的哑变量应该有N-1个。
四、L1/L2正则化
正则化主要是为了降低过拟合的风险,提高模型的泛化能力。
在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不work。
过拟合.png
如果使用Python做逻辑回归建模,scikit-learn中LogisticRegression和LogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为"l1"和"l2"。分别对应L1的正则化和L2的正则化,默认是L2的正则化。
L1/L2正则化具体的数学模型参见正则化方法:L1和L2 regularization、数据集扩增、dropout 和机器学习之正则化(Regularization)。
先写到这,如有错误,请指正。
网友评论