考虑概况,经常遇到的数据有噪声、冗余、相关性、不完备性等。 本章考虑了这些问题,在使用算法进行学习之前,首先需要分析数据,根据数据的情况采用不同的方法对数据进行预处理。 数据预处理的一般方法如下。
1 .数据清理:主要是指完全弥补数据中缺失的值,消除干扰数据,识别或消除离群点,解决不一致问题。 主要目标是实现数据格式标准化、清除异常数据、纠错、清除重复数据。
2 .数据集成:主要是将多个数据源的数据集成存储。
3 .数据转换主要是指通过光顺、数据概化、归一化等方式将数据转换成适合数据挖掘的格式。
4 )数据聚合)由于数据挖掘中数据量非常大,用少量的数据进行挖掘分析需要很长时间。 数据聚合技术主要是指聚合或简化数据集,不仅保持原始数据的完整性,而且数据聚合后的结果与聚合前的结果相同或大致相同。
这些数据处理技术用于数据挖掘之前,可以输入机器学习算法进行学习。 这大大提高了数据挖掘模型的质量,减少了实际挖掘所需的时间
0x00数据整合
我们日常使用的数据来源于各种渠道,既有连续的数据,也有离散的数据,既有模糊的数据,既有定性数据也有定量数据。 数据整合是指将多个文件或多个数据库中的异构数据整合起来,存储在统一的一个数据库中进行存储。 合并数据时,通常需要考虑以下事项:
实体识别
主要指数据源来源不同,其中许多概念定义不同
同名异意:具有数据源a的数据特征名称与具有数据源b的数据特征相同,但显示内容不同。
又名同义:数据源a中某个特征的名称与数据源b中某个特征的名称不同,但表示形式不同。
单位不统一:不同的数据源记录的单位不同,如统计身高、一个数据源使用m个单位、一个使用英尺等
冗馀属性
指数据中存在冗余,一般分为以下两种
同一属性多次出现。 例如,两个数据源都记录每天的最高温度和最低温度,数据合并后会出现两次。
同一属性的名称不一致,因此数据重复
数据不一致
编码不一致问题和数据显示的不一致问题。 例如,旧的***号码15位,新的情况下为18位
0x01数据转换
数据转换是指将数据转换或统一为适合机器学习的格式。 为了让人类学习,有必要将收集到的外部数据转换成我们能接收的形式。
实际过程中采集到的各种数据,格式多种多样,格式也不一致,所以它们需要采用一定的数据预处理才能配合机器学习的算法使用。
数据转换的常用方法如下。
使用简单的数学函数转换数据
用各种简单的数学函数转换收集到的原始数据。 常见的函数包括平方、卡方、取对数、差分运算等(压缩时大时小)。
正规化
特征归一化又称数据无量纲化,主要包括总和标准化、标准差标准化、极大值标准化、极差标准化。 另外,基于树的方法不需要GBDT、bagging、boosting等特征归一化,基于参数的模型和基于距离的模型需要特征归一化。
总和标准化
总和的归一化处理后的数据介于[ 0,1 ]之间,其和是1。 总和标准化的步骤和公式也非常简单。 分别求出各集群要素定义的数据总和,用各要素的数据除以该要素的数据总和,结果如下。
总和标准化处理后得到的新数据满足以下条件
标准偏差
标准偏差的标准化公式如下
其中
标准偏差标准化处理后得到的新数据,各要素(指标)的平均值为0,标准偏差为1,即
极大值标准化
结果极大值的标准化公式如下:
极大值标准化的新数据,各要素的最大值为1,其余各项均小于1。
对稀疏数据进行中心化会破坏稀疏数据的结构,因此意义不大,但可以对稀疏数据进行标准化。 极大值标准化是为稀疏数据设计的,同时这也是一种常用的方法。 必须设置with_ )才能在Python中使用最大值MaxAbsScaler (),在Python中使用标准偏差标准化(StandardScaler )
极差标准化(区间简并法,0-1标准化) )。
极差的标准化公式如下
经过极差标准化处理的新数据,各元素的极大值为1,极小值为0,剩下的数值都在0和1之间。 这里的min{x_ij}和max{x_ij}指的是与x_ij相同的列的最小值和最大值。
如果数据有偏差,标准化数据的平均值和方差就没有效果。 在这种情况下,可以改为使用robust_scale和RobustScaler。 这些参数对数据中心化和数据缩放具有很好的鲁棒性。
连续特征变换
>连续特征变换的常用方法有三种:基于多项式的数据变换、基于指数函数的数据变换、基于对数函数的数据变换。连续特征变换能够增加数据的非线性特征捕获特征之间的关系,有效提高模型的复杂度。#encoding=utf-8
"""
生成多项式特征与自定义函数(如:log等)
在输入特征中增加非线性特征可以有效提高模型的复杂度,其中最常用的是多项式特征
matrix =
[[0 1 2]
[3 4 5]
[6 7 8]]
当degree = 2时,以第二行为例:
[1 3 4 5 3*3 3*4 3*5 4*4 4*5 5*5]
当degree = 3时,以第二行为例::
[1 3 4 5 3*3 3*4 3*5 4*4 4*5 5*5 3*3*3 3*3*4 3*3*5 4*4*3 4*3*5 5*5*3 4*4*4 4*4*5 4*5*5 5*5*5]
"""
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import FunctionTransformer
"""生成多项式"""
X = np.arange(9).reshape(3,3)
print(X)
ploy = PolynomialFeatures(2)
print(ploy.fit_transform(X))
ploy = PolynomialFeatures(3)
print(ploy.fit_transform(X))
"""自定义转换器"""
X = np.array([[0,1],[2,3]])
transformer = FunctionTransformer(np.log1p) #括号内的就是自定义函数
print(transformer.fit_transform(X))
transformer = FunctionTransformer(np.exp)
print(transformer.fit_transform(X))
输出结果:
(env_default) PS F:workspace> python .test.py
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 1. 0. 1. 2. 0. 0. 0. 1. 2. 4.]
[ 1. 3. 4. 5. 9. 12. 15. 16. 20. 25.]
[ 1. 6. 7. 8. 36. 42. 48. 49. 56. 64.]]
[[ 1. 0. 1. 2. 0. 0. 0. 1. 2. 4. 0. 0. 0.
0.
0. 0. 1. 2. 4. 8.]
[ 1. 3. 4. 5. 9. 12. 15. 16. 20. 25. 27. 36. 45.
48.
60. 75. 64. 80. 100. 125.]
[ 1. 6. 7. 8. 36. 42. 48. 49. 56. 64. 216. 252. 288. 294.
336. 384. 343. 392. 448. 512.]]
[[0. 0.69314718]
[1.09861229 1.38629436]]
[[ 1. 2.71828183]
[ 7.3890561 20.08553692]]
(env_default) PS F:workspace>
连续属性离散化
1. 离散化技术分类
连续属性的离散化方法也可以被称为分箱法,即将一组连续的值根据一定的规则分别放到其术语的集合中。
离散化技术可以根据如何对数据进行离散化加以分类,可以根据是否使用类信息或根据进行方向(即自顶向下或自底向上)分类。
如果离散化过程使用类信息,则称它为监督离散化(superviseddiscretization);否则是非监督的(unsupervised)。
如果首先找出一点或几个点(称作分裂点或割点)来划分整个属性区间,然后在结果区间上递归地重复这一过程,则称它为自顶向下离散化或分裂。自底向上离散化或合并正好相反,首先将所有的连续值看作可能的分裂点,通过合并相邻域的值形成区间,然后递归地应用这一过程于结果区间。
2. 无监督离散化与监督离散化
根据数据是否包含类别信息可以把它们分成有监督的数据和无监督的数据。有监督的离散化要考虑类别信息而无监督的离散化则不需要。
无监督离散化
假设属性的取值空间为
,离散化之后的类标号是
,则无监督离散化的情况就是X已知而Y未知。以下介绍几种常用的无监督离散化方法:
(1) 等宽算法
根据用户指定的区间数目K,将属性的值域[Xmin−Xmax]划分成K个区间,并使每个区间的宽度相等,即都等于Xmax−XminK。缺点是容易受离群点的影响而使性能不佳。
(2) 等频算法
等频算法也是根据用户自定义的区间数目,将属性的值域划分成K个小区间。他要求落在每个区间的对象数目相等。譬如,属性的取值区间内共有M个点,则等频区间所划分的K个小区域内,每个区域含有MK个点。
(3) K-means聚类算法
首先由用户指定离散化产生的区间数目K,K-均值算法首先从数据集中随机找出K个数据作为K个初始区间的重心;然后,根据这些重心的欧式距离,对所有的对象聚类:如果数据x距重心Gi最近,则将x划归Gi所代表的那个区间;然后重新计算各区间的重心,并利用新的重心重新聚类所有样本。逐步循环,直到所有区间的重心不再随算法循环而改变为止。
监督离散化
监督离散化就是事先X和Y均为已知,然后找到某个函数,利用X值对Y值做预测。可以建立回归或者分类模型。
以下介绍的自下而上或者自上而下的分类方法都属于监督离散化方法。
3. 齐次性的卡方检验
在介绍两种基于卡方检验的离散化算法之前,先来介绍一下齐次性的卡方检验。
数据:有rr个总体。
从每个总体中抽取一个随机变量,记第ii个样本含有的观测数是
, 每个样本的每个观测值可以归为cc个不同类别中的一类。记Oij为样本ii的观测值归入类j的个数,所以,
对于所有的样本i,将数据排列成以下的r∗c
| 类1 | 类2 | ⋯⋯ | 类c | 总和|
| -------- | -------- | -------- | -------- | -------- |
| 总体1| O11 | O12| ⋯⋯ | O1c | n1|
| 总体2 | O21| O22 | ⋯⋯| O21 | n2|
| ⋯⋯| ⋯⋯| ⋯⋯ | ⋯⋯ | ⋯⋯ | ⋯⋯|
| 总体r | Or1 | Or2 | ⋯⋯| Orc | nr|
| 总和 | C1 | C2 | ⋯⋯ | Cc | N|
假设:
记pijpij为随机取到第ii个总体划分为第要减肥的小海豚类的概率,j∈[i,c]i∈[1,r],。
H0:同一列中所有的概率相等(即对任意的j,p1j=p2j=⋯=prjp1j=p2j=⋯=prj)。
H1:每列中至少存在两个概率不相等(即给定j,存在i和k,使得pij≠pkj)。
检验统计量χ2为:
零分布:
| 吸烟 | 不吸烟| 总计|
| -------- | -------- | -------- |
| 男 | 20 | 5 | 25|
| 女 | 10| 15 | 25|
| 总计 | 30| 20 | 50|
首先假设H0:性别和吸烟相关。
根据公式求得χ2=8.33,自由度为1,查表可得p值小于0.005,所以拒绝原假设。
4. 自上而下的卡方分裂算法
该分裂算法是把整个属性的取值区间当做一个离散的属性值,然后对该区间进行划分,一般是一分为二,即把一个区间分为两个相邻的区间,每个区间对应一个离散的属性值,该划分可以一直进行下去,直到满足某种停止条件,其关键是划分点的选取。
分裂步骤:
依次计算每个插入点的卡方值,当卡方值达到最大时,将该点作为分裂点,属性值域被分为两块。
然后再计算卡方值,找到最大值将属性值域分成三块。
停止准则:
当卡方检验显著,即pp值
当卡方检验不显著,即pp值⩾α⩾α时,停止分裂区间;
5. ChiMerge算法
ChiMerge算法是一种基于卡方值的自下而上的离散化方法。和上一种算法正好相反。
分裂步骤:
第一步:根据要离散的属性对实例进行排序:每个实例属于一个区间
第二步:合并区间,计算每一对相邻区间的卡方值
停止准则:
当卡方检验不显著,即pp值⩾α时,继续合并相邻区间;
当卡方检验显著,即pp值
6. 基于熵的离散化方法
本方法也是一种自上而下的离散化方法。首先,定义一下熵的概念:
其中,
是第i个区间中类要减肥的小海豚的概率。
该划分的总熵e是每个区间的熵的加权平均:
其中
是第i个区间的值的比例,n是区间个数。
划分过程:
首先将属性的取值值域按照值得大小排序。 把每个值看作是可能的分割点,依次把区间分成两部分计算它们的熵值,取熵值最小的作为第一次划分点。
然后选取一个区间,通常选择熵值最大的区间重复此过程。
当区间个数达到用户指定的个数或某个用户指定的终止条件则停止继续分裂。
本作品采用《CC 协议》,转载必须注明作者和本文链接