机器学习中,离散化,特征归一化等等,这些都是很重要的数据处理方式,所以在这里进行简单的解释我的理解.

简介

  • 离散化
  • 为什么离散化
  • 离散化的优势
  • 特征归一化
  • 标准化
  • 变量编码方式
  • cut与qcut

离散化

定义:离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
例如:原数据:1,999,100000,15;处理后:1,3,4,2;原数据:{100,200},{20,50000},{1,400};处理后:{3,4},{2,6},{1,5};(定义来自百度百科)

通常情况下,我们认为的离散性变量是非数值性变量,例如:男,女;老,少等,我们进行数据离散化也可以是使男->1,女->0,这样用数值性数据进行代替,能方便我们后续的计算.

一.为什么离散化

数据离散化是指将连续的数据进行分段,使其变为一段段离散化的区间。分段的原则有基于等距离、等频率或优化的方法。数据离散化的原因主要有以下几点:

1.方便算法需要

例如决策树、朴素贝叶斯等算法,都是基于离散型的数据展开的。如果要使用该类算法,必须将离散型的数据进行。有效的离散化能减小算法的时间和空间开销,提高系统对样本的分类聚类能力和抗噪声能力。

2.离散化的特征相对于结构复杂的连续型特征更易理解

比如工资收入,月薪2000和月薪20000,从连续型特征来看高低薪的差异还要通过数值层面才能理解,但将其转换为离散型数据(底薪、高薪),则可以更加直观的表达出了我们心中所想的高薪和底薪。

3.可以有效克服数据中隐藏的缺陷,使模型结果更加稳定

二.离散化的优势
  1. 离散特征的增加和减少都很容易,易于模型的快速迭代;
  2. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  3. 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  4. 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
  5. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  6. 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人.
  7. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

总结:离散化主要是"海量离散特征+简单模型"的使用,相对应的是连续化的"少量连续特征+复杂模型"相比较之下,离散化的操作要简单,并且高效.

特征归一化

定义:是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。

例如:比较一群人的身高,一般统计的身高单位有厘米:168cm和米1.7m,这个时候就要用到特征归一化,也就是归一化特征来进行数据的处理.

常用的方法:
Min-Max Scaling又称为Min-Max normalization, 特征量化的公式为:

离散变量组合优化 python 离散量化变量_归一化

就是将训练集中某一列数值特征(假设是第i列)的值缩放到0和1之间
特点
对不同特征维度的伸缩变换的目的是使各个特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。这也就改变了原始数据的一个分布。
好处:
1 提高迭代求解的收敛速度
2 提高迭代求解的精度

标准化

简单定义:就是将训练集中某一列数值特征(假设是第i列)的值缩放成均值为0,方差为1的状态.

常用方法:
标准差标准化,也叫z-score标准化

x =(x - u)/σ

u是均值 σ是标准差

特点
对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
好处
1 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上

2 不改变原始数据的分布

总结:不论是归一化还是标准化,相同点都是对某个特征(column)进行缩放(scaling)而不是对某个样本的特征向量(row)进行缩放.对特征向量进行缩放是毫无意义的.

变量编码方式

离散型特征编码方式: one-hot,哑变量和LabelEncoder

(一)onehotencoder(独热编码)

基本思想: 将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。举个例子,假设我们以学历为例,我们想要研究的类别为小学、中学、大学、硕士、博士五种类别,我们使用one-hot对其编码就会得到:

离散变量组合优化 python 离散量化变量_离散变量组合优化 python_02

(二)哑变量(dummy encoding)

哑变量编码直观的解释就是任意的将一个状态位去除。还是拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。只是因为对于一个我们研究的样本,他已不是小学生、也不是中学生、也不是大学生、又不是研究生,那么我们就可以默认他是博士,是不是。(额,当然他现实生活也可能上幼儿园,但是我们统计的样本中他并不是,-)。所以,我们用哑变量编码可以将上述5类表示成:

  

离散变量组合优化 python 离散量化变量_归一化_03


总结:one-hot 和哑变量编码 的总体思路是一样的,但是哑变量编码在one-hot的基础上进行了简化,两种方法相同但是也有区别,在特殊的条件下差异就会体现出来.

(三)标签编码(LabelEncoder)
LabelEncoder是对不连续的数字或文本编号。

用代码进行举例

1 # -*- coding: utf-8 -*-  
2 from sklearn.preprocessing import LabelEncoder  
3 le = LabelEncoder().fit([1,111,122,188,999])  
4 le_transform = le.transform([999,122,111])  
5 print(le_transform)  
6 """  
7 [4 2 1]  
8 """

总结:三种方法实际上可以算是两种方法,都是原理很简洁的编码方式,方法通俗易懂

上面的图片和代码均转自:
(原出处讲解的两种编码方式区别更加详细,感兴趣可以访问原帖)

cut和qcut的区别

一.pd.cut()

cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的

二.pd.qcut()

qcut是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的

总结:
两者的区别主要在与cut是间距相同,而qcut是每个箱子中的数的数量是相同的