在统计学和机器学习中,离散化(Discretization)指将连续特征或者变量,转变成离散特征或者变量的过程。
一般来说,数据的离散化分为两个步骤:
I、决定需要多少个类别值。
在第一步中,将连续属性值排序后,通过指定n-1个分割点(split point)把它们分成n个区间。
II、确定如何将连续属性映射到这些分类值。
在第二步中,将一个区间中的所有值映射到相同的类别上。因此,离散化问题就是决定选择多少个分割点和确定分割点位置的问题,结果可以用区间集合{ ( x 0 , x 1 ] , ( x 1 , x 2 ] , ⋯ , ( x n − 1 , x n ] (x_0, x_1], (x_1, x_2], \cdots, (x_{n-1}, x_n] (x0,x1],(x1,x2],⋯,(xn−1,xn]}表示,其中 x 0 x_0 x0和 x n x_n xn可以分别为 − ∞ -\infty −∞和 + ∞ +\infty +∞,或者用一系列不等式 x 0 ≤ x ≤ x 1 , ⋯ , x n − 1 ≤ x ≤ x n x_0\leq x \leq x_1, \cdots,x_{n-1}\leq x \leq x_n x0≤x≤x1,⋯,xn−1≤x≤xn表示。
然而对于不同类别的机器学习我们会采用不同离散化方法,下面我们讨论非监督离散化和监督离散化:
非监督离散化:
用于分类的离散化方法之间的根本区别在于使用类信息(监督,supervised)还是不使用类信息(无监督,unsupervised)。如果不使用类信息,则常使用一些相对简单的方法。例如,等宽(equal width)方法将属性的值域划分为具有相同宽度的区间,而区间的个数由用户指定,这种方法可能由于受离群点的影响而性能不佳,因此等频率(equal frequency)或等深(equal depth)方法通常更为可取,等频率方法试图将相同数量的对象放进每个区间。作为非监督离散化的另一个例子,可以使用诸如K均值等聚类方法。最后,目测检查数据有事也可能是一种有效的方法。下面是示例:
# 将年龄数据离散化
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32])
# qcut 是等频切割,即基本保证每个组里的元素个数是相等的
cc = pd.qcut(ages,5) # 等频率(等深)
# cut是按值切割,即根据数据值的大小范围等分成n组,落入这个范围的分别进入到该组。
dd = pd.cut(ages,5) # 等宽
非监督离散化:
非监督学习原始数据的离散化处理要比不离散处理化好,但是使用附加的信息(类标号)常常能够产生更好的结果,因为未使用类标号知识所构成的区间常常包含混合的类标号。一种概念上的简单方法是以极大化区间纯度的方式确定分割点,然而实践中这种方法可能需要人为确定区间的纯度和最小的区间大小。为了解决这一问题,一些基于统计学的方法用每个属性值来分隔区间,并通过合并类似于根据统计检验得出的相邻区间来创造较大的区间。基于熵的方法是最有前途的离散化方法之一,下面给出一个简单的基于熵的方法。
区间的熵 e i e_i ei由如下等式给出: e i = − ∑ j = 1 k p i j log 2 p i j e_i = -\sum_{j=1}^k p_{ij} \log_2p_{ij} ei=−j=1∑kpijlog2pij其中, p i j = m i j m i p_{ij} = \frac{m_{ij}}{m_i} pij=mimij是第 i i i个区间中类 j j j的概率(值的比例)。该划分的总熵 e e e是每个区间的熵的加权平均,即: e = ∑ i = 1 2 w i e i e = \sum_{i=1}^2 w_ie_i e=i=1∑2wiei其中,m是值的个数, w i = m i m w_i = \frac{m_i}{m} wi=mmi是第 i i i个区间的值的比例,而 n n n是区间个数。直观上,区间的熵是区间纯度的度量。如果一个区间只包含一个类的值(表示该区间非常纯),则熵为0并且不影响总熵。如果一个区间中的值类出现的频率相等(该区间尽可能不纯),则其熵最大。
一种划分连续属性的简单方法:开始将初始值切分成两部分,让两个结果区间产生最小熵,该技术只需要把每个值看做可能的分割点即可,因为嘉定区间包含有序值的集合;然后,取一个区间,通常选取具有最大熵的区间,重复此分割过程,直到区间的个数达到用户指定的个数,或者满足终止条件。
在二维中,点是很好分开的,但在一维中,情况并非如此,一般而言,分别离散化每个属性通常只保证次最优的结果。
归一化( Normalization)是一种简化计算的方式,即将有量纲的表达式,经过变换转化为无量纲的表达式变成为标量。 在多种计算中都经常用到这种方法。在对数据进行算法训练时,由于数据的问题可能导致算法的效果并不理想,这时候可以考虑一下对数据进行归一化方法。
举个栗子:分析一个人的身高和体重对健康的影响,如果使用米/ m m m和千克 k g kg kg作为单位,那么身高特征会在1.6~1.8 m m m的数值范围内,体重特征会在50~100 k g kg kg的范围内,分析出来的结果显然会倾向于数值差别比较大的体重特征。也就是说体重的预测能力会比身高的预测能力高出很多,但是这并不符合事实,想要得到更为准确的结果,就需要进行特征归一化处理,使各指标处于同一数值量级,以便进行分析。
线性函数归一化:将原始数据进行线性的变换,并确保新的数据均映射到[0,1]区间内,实现对原始数据的等比缩放。
公式: X n o r m = X − X m i n x m a x − x m i n X_{norm} = \frac{X - X_{min}}{x_{max} - x_{min}} Xnorm=xmax−xminX−Xmin
0均值归一化:将原始数据均映射到均值为0,标准差为1的分布上。具体来说,假设原始特征的均值为 μ \mu μ、标准差为 σ \sigma σ,那么归一化公式定义为: z = x − μ σ z = \frac{x - \mu}{\sigma} z=σx−μ
I、独热编码:即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
例如:
自然状态码为:000, 001, 010, 011, 100, 101
独热编码为:000001, 000010, 000100, 001000, 010000, 100000
据我个人理解,独热编码就是是根据一个事物的几个不同状态来确定每个编码长度(有多少位),而且每个编码只有一个数字是1其的全是0,也就是one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,如:
# 小学 ---> [1, 0, 0, 0, 0]
# 中学 ---> [0, 1, 0, 0, 0]
# 大学 ---> [0, 0, 1, 0, 0]
# 硕士 ---> [0, 0, 0, 1, 0]
# 博士 ---> [0, 0, 0, 0, 1]
II、哑变量编码:直观的解释就是任意的将一个状态位去除,还是拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。只是因为对于一个我们研究的样本,他已不是小学生、也不是中学生、也不是大学生、又不是研究生,那么我们就可以默认他是博士,是不是。(额,当然他现实生活也可能上幼儿园,但是我们统计的样本中他并不是,-)。所以,我们用哑变量编码可以将上述5类表示成:
# 小学 ---> [1, 0, 0, 0]
# 中学 ---> [0, 1, 0, 0]
# 大学 ---> [0, 0, 1, 0]
# 硕士 ---> [0, 0, 0, 1]
# 博士 ---> [0, 0, 0, 0]
III、独热编码优缺点:
IV、什么情况下(不)用独热编码: