连续数据的离散化

离散化的优势

在特征工程中,我们常常需要对连续型特征进行离散化处理,下面对离散化的优势做简单总结:

  • 映射到高维度空间,用linear的LR更快,且兼具更好的分割性
  • 稀疏化,0,1向量内积乘法运算速度快,计算结果方便存储,容易扩展
  • 单变量离散化N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合
  • 离散特征的增加和减少都很容易,易于模型的快速迭代
  • 模型稳定,收敛度高,对异常数据有很强的鲁棒性(比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰)
  • 在一定程度上降低了过拟合风险
  • 离散化后可以进行特征交叉,由M+N个变量变为MNM*N个变量,进一步引入非线性,提升表达能力

离散变量的编码方式

在模型训练过程中,我们会对训练数据集进行抽象、抽取大量特征,这些特征中有离散型特征也有连续型特征。若此时你使用的模型是简单模型(如LR),那么通常我们会对连续型特征进行离散化操作,然后再对离散的特征,进行one-hot编码或哑变量编码或LabelEncoder,我们来介绍三种编码方式。

  • one-hot
    将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“**态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。
    连续数据的离散化

  • 哑变量编码(dummy encoding)
    哑变量编码直观的解释就是任意的将一个状态位去除。还是拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。所以,我们用哑变量编码可以将上述5类表示成:

连续数据的离散化

  • LabelEncoder
    LabelEncoder是对不连续的数字或文本编号。LabelEncoder可以将[中国,美国,日本]转化为[0,1,2],但这样会出现一个问题:中国和日本的平均会等于日本。 决策树、随机森林算法等可以直接处理这样的类别类型特征,并且这种方法使用的特征空间很少。

特征归一化

1.特征归一化的方法有哪些?具体计算逻辑。
连续特征

  • z-score标准化:这是最常见的特征预处理方式,基本所有的线性模型在拟合的时候都会做 z-score标准化。【用于改变分布】

具体的方法是求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。

在sklearn中,我们可以用StandardScaler来做z-score标准化。当然,如果我们是用pandas做数据预处理,可以自己在数据框里面减去均值,再除以方差,自己做z-score标准化。

  • max-min标准化:也称为离差标准化,预处理后使特征值映射到[0,1]之间。【用于特征数值的范围缩放】

具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果我们希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。

在sklearn中,我们可以用MinMaxScaler来做max-min标准化。这种方法的问题就是如果测试集或者预测数据里的特征有小于min,或者大于max的数据,会导致max和min发生变化,需要重新计算。所以实际算法中, 除非你对特征的取值区间有需求,否则max-min标准化没有 z-score标准化好用。

  • L1/L2范数标准化:如果我们只是为了统一量纲,那么通过L2范数整体标准化也是可以的。【用于统一量纲】

具体方法是求出每个样本特征向量x的L2范数||x||2||x||2,然后用x/||x||2x/||x||2代替原样本特征即可。当然L1范数标准化也是可以的,即用x/||x||1x/||x||1代替原样本特征。通常情况下,范数标准化首选L2范数标准化。

在sklearn中,我们可以用Normalizer来做L1/L2范数标准化。

2.归一化有什么好处?
其一,是提升模型训练速度。

比如就两个特征,一个特征取值为0~2000,而另一个特征取值为1-5,对其进行优化时,会得到一个长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代慢。相比之下,做过鬼优化的迭代就会很快。

其二,提升模型的精度。

在涉及到一些距离计算的算法时效果显著,比如算法要计算欧式距离。做归一化很有必要,可以让各个特征对结果做出的贡献相同。

pandas的cut和qcut的区别

在将一维连续数据分装到几个桶里的时候,可以利用pandas 的 cut和qcut函数

  • cut: 按连续数据的大小分到各个桶里,每个桶里样本量可能不同,但是,每个桶相当于一个等长的区间,即:以数据的最大和最小为边界,等分成p个桶。

  • qcout: 与cut主要的区别就是每个桶里的样本数量是一定的。