精华内容
下载资源
问答
  • 常见数据预处理

    千次阅读 2018-06-27 16:36:06
    1.2 常见数据预处理方法数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。数据集成:将多个数据源中的数据合并,并存放到一个一致的数据存储...

    一、背景


    原始数据存在的几个问题:不一致;重复;含噪声;维度高。

    1.1 数据挖掘中使用的数据的原则
    • 尽可能赋予属性名和属性值明确的含义;
    • 去除惟一属性;
    • 去除重复性;
    • 合理选择关联字段。
    1.2 常见的数据预处理方法
    • 数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。
    • 数据集成:将多个数据源中的数据合并,并存放到一个一致的数据存储(如数据仓库)中。这些数据源可能包括多个数据库、数据立方体或一般文件。
    • 数据变换:找到数据的特征表示,用维度变换来减少有效变量的数目或找到数据的不变式,包括规格化、规约、切换和投影等操作。
    • 数据规约:是在对发现任务和数据本身内容理解的基础上,寻找依赖于发现目标的表达数据的有用特征,以缩减数据模型,从而在尽可能保持数据原貌的前提下最大限度的精简数据量,主要有两个途径:属性选择和数据抽样,分别针对数据库中的属性和记录。

    二、数据清洗

    2.1 缺失值处理的两种方法

    删除法,根据数据处理的不同角度,删除法可分为以下4种:

    • (1)删除观测样本
    • (2)删除变量:当某个变量缺失值较多且对研究目标影响不大时,可以将整个变量整体删除
    • (3)使用完整原始数据分析:当数据存在较多缺失而其原始数据完整时,可以使用原始数据替代现有数据进行分析;
    • (4)改变权重:当删除缺失数据会改变数据结构时,通过对完整数据按照不同的权重进行加工,可以降低删除数据带来的偏差。

    插补法:在条件允许的情况下,找到缺失值的替代值进行插补,尽可能还原真实数据是更好的方法。常见的方法有均值插补、回归插补、二阶插补、热平台、冷平台等单一变量插补。

    • (1)均值法是通过计算缺失值所在变量所有非缺失观测值的均值,使用均值来代替缺失值的插补方法。
    • (2)均值法不能利用相关变量信息,因此会存在一定偏差,而回归模型是将需要插补变量作为因变量,其他相关变量作为自变量,通过建立回归模型预测出因变量的值对缺失变量进行插补。
    • (3)热平台插补是指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。
    • (4)在实际操作中,尤其当变量数量很多时,通常很难找到与需要插补样本完全相同的样本,此时可以按照某些变量将数据分层,在层中对缺失值使用均值插补,即采取冷平台插补法。
    2.2 噪声数据处理

    噪声是一个测量变量中的随机错误和偏差,包括错误值或偏离期望的孤立点值。

    • 噪声检查中比较常见的方法: 
      • (1)通过寻找数据集中与其他观测值及均值差距最大的点作为异常
      • (2)聚类方法检测,将类似的取值组织成“群”或“簇”,落在“簇”集合之外的值被视为离群点。
    • 在进行噪声检查后,通常采用分箱、聚类、回归、计算机检查和人工检查结合等方法“光滑”数据,去掉数据中的噪声。 
      分箱:分箱方法是一种简单常用的预处理方法,通过考察相邻数据来确定最终值。所谓“分箱”,实际上就是按照属性值划分的子区间,如果一个属性值处于某个子区间范围内,就称把该属性值放进这个子区间所代表的“箱子”内。把待处理的数据(某列属性值)按照一定的规则放进一些箱子中,考察每一个箱子中的数据,采用某种方法分别对各个箱子中的数据进行处理。在采用分箱技术时,需要确定的两个主要问题就是:如何分箱以及如何对每个箱子中的数据进行平滑处理。
    2.2.1 分箱的方法:有4种:等深分箱法、等宽分箱法、最小熵法和用户自定义区间法。
    • 等深分箱法(统一权重):将数据集按记录行数分箱,每箱具有相同的记录数,每箱记录数称为箱子的深度。这是最简单的一种分箱方法。
    设定权重(箱子深度)为4,分箱后
    箱1:800 1000 1200 1500
    箱2:1500 1800 2000 2300 
    箱3:2500 2800 3000 3500
    箱4:4000 4500 4800 5000  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 等宽分箱法(统一区间):使数据集在整个属性值的区间上平均分布,即每个箱的区间范围是一个常量,称为箱子宽度。
    设定区间范围(箱子宽度)为1000元人民币,分箱后
    箱1:800 1000 1200 1500 1500 1800
    箱2:2000 2300 2500 2800 3000
    箱3:3500 4000 4500
    箱4:4800 5000 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 用户自定义区间:用户可以根据需要自定义区间,当用户明确希望观察某些区间范围内的数据分布时,使用这种方法可以方便地帮助用户达到目的。
    如将客户收入划分为1000元以下、1000~2000、2000~3000、3000~4000和4000元以上几组,分箱后
    箱1:800 
    箱2:1000 1200 1500 1500 1800 2000 
    箱3:2300 2500 2800 3000  
    箱4:3500 4000 
    箱5:4500 4800 5000 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.2.2 数据平滑方法
    • 按平均值平滑 :对同一箱值中的数据求平均值,用平均值替代该箱子中的所有数据。
    • 按边界值平滑:用距离较小的边界值替代箱中每一数据。
    • 按中值平滑:取箱子的中值,用来替代箱子中的所有数据。

    三、数据集成

    • 数据集成中的两个主要问题是: 
      • (1)如何对多个数据集进行匹配,当一个数据库的属性与另一个数据库的属性匹配时,必须注意数据的结构;
      • (2)数据冗余。两个数据集有两个命名不同但实际数据相同的属性,那么其中一个属性就是冗余的。

    四、数据变换

    数据变换策略主要包括以下几种:
    • 光滑:去掉噪声;
    • 属性构造:由给定的属性构造出新属性并添加到数据集中。例如,通过“销售额”和“成本”构造出“利润”,只需要对相应属性数据进行简单变换即可
    • 聚集:对数据进行汇总。比如通过日销售数据,计算月和年的销售数据;
    • 规范化:把数据单按比例缩放,比如数据标准化处理;
    • 离散化:将定量数据向定性数据转化。比如一系列连续数据,可用标签进行替换(0,1);

    五、数据归约

    数据归约通常用维归约、数值归约方法实现。维归约指通过减少属性的方式压缩数据量,通过移除不相关的属性,可以提高模型效率。常见的维归约方法有:分类树、随机森林通过对分类效果的影响大小筛选属性;小波变换、主成分分析通过把原数据变换或投影到较小的空间来降低维数。

    展开全文
  • 机器学习-常见数据预处理

    万次阅读 2016-12-21 20:36:36
    背景常见数据预处理方法

    一、背景


    原始数据存在的几个问题:不一致;重复;含噪声;维度高。

    1.1 数据挖掘中使用的数据的原则
    • 尽可能赋予属性名和属性值明确的含义;
    • 去除惟一属性;
    • 去除重复性;
    • 合理选择关联字段。
    1.2 常见的数据预处理方法
    • 数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。
    • 数据集成:将多个数据源中的数据合并,并存放到一个一致的数据存储(如数据仓库)中。这些数据源可能包括多个数据库、数据立方体或一般文件。
    • 数据变换:找到数据的特征表示,用维度变换来减少有效变量的数目或找到数据的不变式,包括规格化、规约、切换和投影等操作。
    • 数据规约:是在对发现任务和数据本身内容理解的基础上,寻找依赖于发现目标的表达数据的有用特征,以缩减数据模型,从而在尽可能保持数据原貌的前提下最大限度的精简数据量,主要有两个途径:属性选择和数据抽样,分别针对数据库中的属性和记录。

    二、数据清洗

    2.1 缺失值处理的两种方法

    删除法,根据数据处理的不同角度,删除法可分为以下4种:

    • (1)删除观测样本
    • (2)删除变量:当某个变量缺失值较多且对研究目标影响不大时,可以将整个变量整体删除
    • (3)使用完整原始数据分析:当数据存在较多缺失而其原始数据完整时,可以使用原始数据替代现有数据进行分析;
    • (4)改变权重:当删除缺失数据会改变数据结构时,通过对完整数据按照不同的权重进行加工,可以降低删除数据带来的偏差。

    插补法:在条件允许的情况下,找到缺失值的替代值进行插补,尽可能还原真实数据是更好的方法。常见的方法有均值插补、回归插补、二阶插补、热平台、冷平台等单一变量插补。

    • (1)均值法是通过计算缺失值所在变量所有非缺失观测值的均值,使用均值来代替缺失值的插补方法。
    • (2)均值法不能利用相关变量信息,因此会存在一定偏差,而回归模型是将需要插补变量作为因变量,其他相关变量作为自变量,通过建立回归模型预测出因变量的值对缺失变量进行插补。
    • (3)热平台插补是指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。
    • (4)在实际操作中,尤其当变量数量很多时,通常很难找到与需要插补样本完全相同的样本,此时可以按照某些变量将数据分层,在层中对缺失值使用均值插补,即采取冷平台插补法。
    2.2 噪声数据处理

    噪声是一个测量变量中的随机错误和偏差,包括错误值或偏离期望的孤立点值。

    • 噪声检查中比较常见的方法:
      • (1)通过寻找数据集中与其他观测值及均值差距最大的点作为异常
      • (2)聚类方法检测,将类似的取值组织成“群”或“簇”,落在“簇”集合之外的值被视为离群点。
    • 在进行噪声检查后,通常采用分箱、聚类、回归、计算机检查和人工检查结合等方法“光滑”数据,去掉数据中的噪声。
      分箱:分箱方法是一种简单常用的预处理方法,通过考察相邻数据来确定最终值。所谓“分箱”,实际上就是按照属性值划分的子区间,如果一个属性值处于某个子区间范围内,就称把该属性值放进这个子区间所代表的“箱子”内。把待处理的数据(某列属性值)按照一定的规则放进一些箱子中,考察每一个箱子中的数据,采用某种方法分别对各个箱子中的数据进行处理。在采用分箱技术时,需要确定的两个主要问题就是:如何分箱以及如何对每个箱子中的数据进行平滑处理。
    2.2.1 分箱的方法:有4种:等深分箱法、等宽分箱法、最小熵法和用户自定义区间法。
    • 等深分箱法(统一权重):将数据集按记录行数分箱,每箱具有相同的记录数,每箱记录数称为箱子的深度。这是最简单的一种分箱方法。
    设定权重(箱子深度)为4,分箱后
    箱1:800 1000 1200 1500
    箱2:1500 1800 2000 2300 
    箱3:2500 2800 3000 3500
    箱4:4000 4500 4800 5000  
    • 等宽分箱法(统一区间):使数据集在整个属性值的区间上平均分布,即每个箱的区间范围是一个常量,称为箱子宽度。
    设定区间范围(箱子宽度)为1000元人民币,分箱后
    箱1:800 1000 1200 1500 1500 1800
    箱2:2000 2300 2500 2800 3000
    箱3:3500 4000 4500
    箱4:4800 5000 
    • 用户自定义区间:用户可以根据需要自定义区间,当用户明确希望观察某些区间范围内的数据分布时,使用这种方法可以方便地帮助用户达到目的。
    如将客户收入划分为1000元以下、1000~2000、2000~3000、3000~4000和4000元以上几组,分箱后
    箱1:800 
    箱2:1000 1200 1500 1500 1800 2000 
    箱3:2300 2500 2800 3000  
    箱4:3500 4000 
    箱5:4500 4800 5000 
    2.2.2 数据平滑方法
    • 按平均值平滑 :对同一箱值中的数据求平均值,用平均值替代该箱子中的所有数据。
    • 按边界值平滑:用距离较小的边界值替代箱中每一数据。
    • 按中值平滑:取箱子的中值,用来替代箱子中的所有数据。

    三、数据集成

    • 数据集成中的两个主要问题是:
      • (1)如何对多个数据集进行匹配,当一个数据库的属性与另一个数据库的属性匹配时,必须注意数据的结构;
      • (2)数据冗余。两个数据集有两个命名不同但实际数据相同的属性,那么其中一个属性就是冗余的。

    四、数据变换

    数据变换策略主要包括以下几种:
    • 光滑:去掉噪声;
    • 属性构造:由给定的属性构造出新属性并添加到数据集中。例如,通过“销售额”和“成本”构造出“利润”,只需要对相应属性数据进行简单变换即可
    • 聚集:对数据进行汇总。比如通过日销售数据,计算月和年的销售数据;
    • 规范化:把数据单按比例缩放,比如数据标准化处理;
    • 离散化:将定量数据向定性数据转化。比如一系列连续数据,可用标签进行替换(0,1);

    五、数据归约

    数据归约通常用维归约、数值归约方法实现。维归约指通过减少属性的方式压缩数据量,通过移除不相关的属性,可以提高模型效率。常见的维归约方法有:分类树、随机森林通过对分类效果的影响大小筛选属性;小波变换、主成分分析通过把原数据变换或投影到较小的空间来降低维数。

    展开全文
  • 数据预处理

    2021-01-25 15:56:31
    数据预处理和特征工程概述1.1 数据预处理与特征工程1.2 sklearn中的数据预处理和特征工程2 数据预处理 Preprocessing & Impute2.1 数据无量纲化2.1.1 preprocessing.MinMaxScaler2.1.2 preprocessing....

    概述

    1.1 数据预处理与特征工程

    数据挖掘的五大流程:

    1. 获取数据
    2. 数据预处理:数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小。
      数据预处理的目的:让数据适应模型,匹配模型的需求。
    3. 特征工程:特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌。
      特征工程的目的:1) 降低计算成本,2)提升模型上限。
    4. 建模,测试模型并预测出结果
    5. 上线,验证模型效果

    1.2 sklearn中的数据预处理和特征工程

    sklearn中包含众多数据预处理和特征工程相关的模块,六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全部工程打下基础。
    虔诚的码农

    • 模块preprocessing:几乎包含数据预处理的所有内容
    • 模块Impute:填补缺失值专用
    • 模块feature_selection:包含特征选择的各种方法的实践
    • 模块decomposition:包含降维算法

    2 数据预处理 Preprocessing & Impute

    2.1 数据无量纲化

    在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布 的需求,这种需求统称为将数据“无量纲化”。譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经 网络,无量纲化可以加快求解速度;而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模 型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(一个特例是决策树和树的集成算法们,对决策 树我们不需要无量纲化,决策树可以把任意数据都处理得很好。)

    数据的无量纲化可以是线性的,也可以是非线性的。线性的无量纲化包括中心化(Zero-centered或者Mean- subtraction)处理和缩放处理(Scale)。中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到 某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。

    2.1.1 preprocessing.MinMaxScaler

    当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到 [0,1]之间,而这个过程,就叫做数据归一化(Normalization,又称Min-Max Scaling)。注意,Normalization是归 一化,不是正则化,真正的正则化是regularization,不是数据预处理的一种手段。归一化之后的数据服从正态分 布,公式如下:

    x ∗ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^*=\frac{x-min(x)}{max(x)-min(x)} x=max(x)min(x)xmin(x)

    在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。

    from sklearn.preprocessing import MinMaxScaler
    
    
    data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    
    #如果换成表是什么样子? import pandas as pd pd.DataFrame(data)
    
    #实现归一化
    scaler = MinMaxScaler()	#实例化
    scaler = scaler.fit(data)	#fit,在这里本质是生成min(x)和max(x)
    result = scaler.transform(data)	#通过接口导出结果 result
    
    result_ = scaler.fit_transform(data)	#训练和导出结果一步达成
    
    scaler.inverse_transform(result)	#将归一化后的结果逆转
    
    #使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中 data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    scaler = MinMaxScaler(feature_range=[5,10])       #依然实例化
    
    result = scaler.fit_transform(data)       #fit_transform一步导出结果
    result
    #当X中的特征数量非常多的时候,fit会报错并表示,数据量太大了我计算不了
    #此时使用partial_fit作为训练接口
    #scaler = scaler.partial_fit(data)
    

    2.1.2 preprocessing.StandardScales

    当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization),公式如下:

    x ∗ = x − μ σ x^*=\frac{x-\mu}{\sigma} x=σxμ

    from sklearn.preprocessing import StandardScaler
    data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    scaler = StandardScaler() #实例化
    scaler.fit(data) #fit,本质是生成均值和方差
    scaler.mean_ #查看均值的属性mean_
    scaler.var_ #查看方差的属性var_
    x_std = scaler.transform(data) #通过接口导出结果
    x_std.mean() #导出的结果是一个数组,用mean()查看均值
    x_std.std() #用std()查看方差
    scaler.fit_transform(data) #使用fit_transform(data)一步达成结果
    scaler.inverse_transform(x_std) #使用inverse_transform逆转标准化
    

    对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。通常来说,我们输入的X会是我们的特征矩阵,现实案例中特征矩阵不太可能是一维所以不会存在这个问题。

    2.1.3 StandardScaler和MinMaxScaler选哪个?

    看情况。大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。
    MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像。处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。
    建议先试试看StandardScaler,效果不好换MinMaxScaler。
    除了StandardScaler和MinMaxScaler之外,sklearn中也提供了各种其他缩放处理(中心化只需要一个pandas广播一下减去某个数就好了,因此sklearn不提供任何中心化功能)。比如,在希望压缩数据,却不影响数据的稀疏性时(不影响矩阵中取值为0的个数时),我们会使用MaxAbsScaler;在异常值多,噪声非常大时,我们可能会选用分位数来无量纲化,此时使用RobustScaler。

    2.2 缺失值

    机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实 际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因 此,数据预处理中非常重要的一项就是处理缺失值。

    2.2.1 impute.SimpleImputer填补

    参数列表:class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,copy=True)

    参数含义&输入
    missing_values告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan
    strategy我们填补缺失值的策略,默认均值。1)输入“mean”使用均值填补(仅对数值型特征可用)2)输入“median"用中值填补(仅对数值型特征可用)3)输入"most_frequent”用众数填补(对数值型和字符型特征都可用)4)输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)
    fill_value当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
    copy默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

    在这里,我们使用从泰坦尼克号提取出来的数据,这个数据有三个特征,一个数值型,两个字符型,标签也是字符型。

    import pandas as pd
    data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3 Preprocessing\Narrativedata.csv",index_col=0)
    
    data.head()
    data.info()    #填补年龄
    
    Age = data.loc[:,"Age"].values.reshape(-1,1)	#sklearn当中特征矩阵必须是二维 Age[:20]
    
    from sklearn.impute import SimpleImputer
    imp_mean = SimpleImputer()	#实例化,默认均值填补 imp_median = SimpleImputer(strategy="median")	#用中位数填补
    imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填补
    
    imp_mean = imp_mean.fit_transform(Age)	#fit_transform一步完成调取结果 imp_median = imp_median.fit_transform(Age)
    imp_0 = imp_0.fit_transform(Age)
    
    
    imp_mean[:20] imp_median[:20] imp_0[:20]
    #在这里我们使用中位数填补Age data.loc[:,"Age"] = imp_median
    
    data.info()
    
    #使用众数填补Embarked
    Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
    
    imp_mode = SimpleImputer(strategy = "most_frequent") 
    data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)
    
    data.info()
    

    2.2.2 用Pandas和Numpy进行填补

    import pandas as pd
    data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3 Preprocessing\Narrativedata.csv",index_col=0)
    
    data.head()
    
    data.loc[:,"Age"]  =  data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
    #.fillna 在DataFrame里面直接进行填补
    
    data.dropna(axis=0,inplace=True)
    #.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
    #参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
    

    2.3 处理分类型特征:编码与哑变量

    在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理 文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导 入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。然而在现实 中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小学”,“初 中”,“高中”,“大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和 库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

    2.3.1 preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值

    from sklearn.preprocessing import LabelEncoder
    
    y = data.iloc[:,-1]				#要输入的是标签,不是特征矩阵,所以允许一维
    le = LabelEncoder()  			#实例化
    le = le.fit(y)					#导入数据
    label = le.transform(y)			#transform接口调取结果
    
    le.classes_ #属性.classes_查看标签中究竟有多少类别
    label #查看获取的结果label
    le.fit_transform(y) #也可以直接fit_transform一步到位
    le.inverse_transform(label) #使用inverse_transform可以逆转
    

    2.3.2 preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值

    但由于名义变量、有序变量、有距变量的区别,这种方法只能由于处理有序变量。

    from sklearn.preprocessing import OrdinalEncoder
    
    #接口categories_对应LabelEncoder的接口classes_,一模一样的功能 
    data_ = data.copy()
    
    data_.head()
    
    OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_  #返回各个名义变量转化后的标签
    
    data_.iloc[:,1:-1]  =  OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
    
    data_.head()
    

    2.3.3 preprocessing.OneHotEncoder:独热编码,创建哑变量

    我们刚才已经用OrdinalEncoder把分类变量Sex和Embarked都转换成数字对应的类别了。在舱门Embarked这一列中,我们使用[0,1,2]代表了三个不同的舱门,然而这种转换是正确的吗?
    我们来思考三种不同性质的分类数据:
    1) 舱门(S,C,Q)
    三种取值S,C,Q是相互独立的,彼此之间完全没有联系,表达的是S≠C≠Q的概念。这是名义变量
    2) 学历(小学,初中,高中)
    三种取值不是完全独立的,我们可以明显看出,在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学历取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量
    3) 体重(>45kg,>90kg,>135kg)
    各个取值之间有联系,且是可以互相计算的,比如120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这是有距变量
    然而在对特征进行编码的时候,这三种分类数据都会被我们转换为[0,1,2],这三个数字在算法看来,是连续且可以计算的,这三个数字相互不等,有大小,并且有着可以相加相乘的联系。所以算法会把舱门,学历这样的分类特征,都误会成是体重这样的分类特征。这是说,我们把分类转换成数字的时候,忽略了数字中自带的数学性质,所以给算法传达了一些不准确的信息,而这会影响我们的建模
    类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息:
    虔诚的码农这样的变化,让算法能够彻底领悟,原来三个取值是没有可计算性质的,是“有你就没有我”的不等概念。在我们的 数据中,性别和舱门,都是这样的名义变量。因此我们需要使用独热编码,将两个特征都转换为哑变量。

    data.head()
    
    from sklearn.preprocessing import OneHotEncoder X = data.iloc[:,1:-1]
    
    enc = OneHotEncoder(categories='auto').fit(X) result = enc.transform(X).toarray()
    result
    
    #依然可以直接一步到位,但为了给大家展示模型属性,所以还是写成了三步 
    OneHotEncoder(categories='auto').fit_transform(X).toarray()
    
    #依然可以还原 
    pd.DataFrame(enc.inverse_transform(result))
    
    enc.get_feature_names()			# 返回编码矩阵列标签的名字
    
    #axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连 
    newdata = pd.concat([data,pd.DataFrame(result)],axis=1)			#合并哑变量的列
    
    newdata.drop(["Sex","Embarked"],axis=1,inplace=True)	# 删除原先的名义变量列
    
    newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]  # 修改哑变量列名称
    newdata.head()
    

    特征可以做哑变量,标签也可以吗?可以,使用类sklearn.preprocessing.LabelBinarizer可以对做哑变量,许多算法都可以处理多标签问题(比如说决策树),但是这样的做法在现实中不常见,因此我们在这里就不赘述了。
    虔诚的码农

    2.4 处理连续型特征:二值化与分段

    2.4.1 sklearn.preprocessing.Binarizer

    根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈 值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。二值化是对文本计数数据的常见操作,分析人员 可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯 设置中的伯努利分布建模)。

    #将年龄二值化
    
    data_2 = data.copy()
    
    from sklearn.preprocessing import Binarizer
    X = data_2.iloc[:,0].values.reshape(-1,1)	#类为特征专用,所以不能使用一维数组 
    transformer = Binarizer(threshold=30).fit_transform(X)
    
    transformer
    

    2.4.2 preprocessing.KBinsDiscretizer

    这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:

    参数含义&输入
    n_bins每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征
    encode编码的方式,默认1)“onehot”: onehot 做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该 类别的样本表示为1,不含的表示为0。 2)“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含 有不同整数编码的箱的矩阵 。 3)“onehot-dense”:做哑变量,之后返回一个密集数组。
    strategy用来定义箱宽的方式,默认"quantile" 。 1)“uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为 (特征.max() - 特征.min())/(n_bins) 。2)“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同。 3)“kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同
    
    from sklearn.preprocessing import KBinsDiscretizer
    X = data.iloc[:,0].values.reshape(-1,1)
    est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform') 
    est.fit_transform(X)
    #查看转换后分的箱:变成了一列中的三箱 set(est.fit_transform(X).ravel())
    
    est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
    #查看转换后分的箱:变成了哑变量 
    est.fit_transform(X).toarray()
    
    展开全文
  • 常见数据预处理--python篇1、 加载数据1.1 数据读取1.2 CSV文件合并1.3 CSV文件拆分1.4 数据查看2、缺失值2.1 缺失值查看2.2 缺失值处理2.2.1 不处理2.2.2 删除2.2.3 填充2.2.3.1 固定值填充2.2.3.2 出现最频繁值...

    做过数据分析的孩子一般都知道:数据预处理很重要,大概会占用整个分析过程50%到80%的时间,良好的数据预处理会让建模结果达到事半功倍的效果。本文简单介绍python中一些常见的数据预处理,包括数据加载、缺失值处理、异常值处理、描述性变量转换为数值型、训练集测试集划分、数据规范化。

    1、 加载数据

    1.1 数据读取

    数据格式有很多,介绍常见的csv,txt,excel以及数据库mysql中的文件读取

    import pandas as pd
    data = pd.read_csv(r'../filename.csv')	#读取csv文件
    data = pd.read_table(r'../filename.txt')	#读取txt文件
    data = pd.read_excel(r'../filename.xlsx')  #读取excel文件
    

    获取数据库中的数据

    import pymysql
    conn = pymysql.connect(host='localhost',user='root',passwd='12345',db='mydb')	#连接数据库,注意修改成要连的数据库信息
    cur = conn.cursor()	#创建游标
    cur.execute("select * from train_data limit 100")	#train_data是要读取的数据名
    data = cur.fetchall()	#获取数据
    cols = cur.description	#获取列名
    conn.commit()	#执行
    cur.close()	#关闭游标
    conn.close()	#关闭数据库连接
    col = []
    for i in cols:
    	col.append(i[0])
    data = list(map(list,data))
    data = pd.DataFrame(data,columns=col)
    

    1.2 CSV文件合并

    实际数据可能分布在一个个的小的csv或者txt文档,而建模分析时可能需要读取所有数据,这时呢,需要将一个个小的文档合并到一个文件中

    #合并多个csv文件成一个文件
    import glob
    
    #合并
    def hebing():
        csv_list = glob.glob('*.csv') #查看同文件夹下的csv文件数
        print(u'共发现%s个CSV文件'% len(csv_list))
        print(u'正在处理............')
        for i in csv_list: #循环读取同文件夹下的csv文件
            fr = open(i,'rb').read()
            with open('result.csv','ab') as f: #将结果保存为result.csv
                f.write(fr)
        print(u'合并完毕!')
    
    #去重    
    def quchong(file):
            df = pd.read_csv(file,header=0)    
            datalist = df.drop_duplicates()    
            datalist.to_csv(file) 
            
    if __name__ == '__main__':    
        hebing()    
        quchong("result.csv.csv") 
    

    1.3 CSV文件拆分

    对于一些数据量比较大的文件,想直接读取或者打开比较困难,介绍一个可以拆分数据的方法吧,方便查看数据样式以及读取部分数据

    ##csv比较大,打不开,将其切分成一个个小文件,看数据形式
    f = open('NEW_Data.csv','r') #打开大文件
    i = 0 #设置计数器
    
    #这里1234567表示文件行数,如果不知道行数可用每行长度等其他条件来判断
    while i<1234567 : 
        with open('newfile'+str(i),'w') as f1:
            for j in range(0,10000) : #这里设置每个子文件的大小
                if i < 1234567: #这里判断是否已结束,否则最后可能报错
                    f1.writelines(f.readline())
                    i = i+1
                else:
                    break
    

    1.4 数据查看

    在进行数据分析前呢,可以查看一下数据的总体情况,从宏观上了解数据

    data.head() #显示前五行数据
    data.tail() #显示末尾五行数据
    data.info() #查看各字段的信息
    data.shape #查看数据集有几行几列,data.shape[0]是行数,data.shape[1]是列数
    data.describe() #查看数据的大体情况,均值,最值,分位数值...
    data.columns.tolist()   #得到列名的list
    

    2、缺失值

    现实获取的数据经常存在缺失,不完整的情况**(能有数据就不错了,还想完整!!!)**,为了更好的分析,一般会对这些缺失数据进行识别和处理

    2.1 缺失值查看

    print(data.isnull().sum())  #统计每列有几个缺失值
    missing_col = data.columns[data.isnull().any()].tolist() #找出存在缺失值的列
    
    import numpy as np
    #统计每个变量的缺失值占比
    def CountNA(data):
        cols = data.columns.tolist()    #cols为data的所有列名
        n_df = data.shape[0]    #n_df为数据的行数
        for col in cols:
            missing = np.count_nonzero(data[col].isnull().values)  #col列中存在的缺失值个数
            mis_perc = float(missing) / n_df * 100
            print("{col}的缺失比例是{miss}%".format(col=col,miss=mis_perc))
    

    2.2 缺失值处理

    面对缺失值,一般有三种处理方法:不处理、删除以及填充

    2.2.1 不处理

    有的算法(贝叶斯、xgboost、神经网络等)对缺失值不敏感,或者有些字段对结果分析作用不大,此时就没必要费时费力去处理缺失值啦 =。=

    2.2.2 删除

    在数据量比较大时候或者一条记录中多个字段缺失,不方便填补的时候可以选择删除缺失值

    data.dropna(axis=0,how="any",inplace=True)  #axis=0代表'行','any'代表任何空值行,若是'all'则代表所有值都为空时,才删除该行
    data.dropna(axis=0,inplace=True)  #删除带有空值的行
    data.dropna(axis=1,inplace=True)  #删除带有空值的列
    

    2.2.3 填充

    数据量较少时候,以最可能的值来插补缺失值比删除全部不完全样本所产生的信息丢失要少

    2.2.3.1 固定值填充

    data = data.fillna(0)   #缺失值全部用0插补
    data['col_name'] = data['col_name'].fillna('UNKNOWN')  #某列缺失值用固定值插补
    

    2.2.3.2 出现最频繁值填充

    即众数插补,离散/连续数据都行,适用于名义变量,如性别

    freq_port = data.col_name.dropna().mode()[0]  # mode返回出现最多的数据,col_name为列名
    data['col_name'] = data['col_name'].fillna(freq_port)   #采用出现最频繁的值插补
    

    2.2.3.3 中位数/均值插补

    data['col_name'].fillna(data['col_name'].dropna().median(),inplace=True)  #中位数插补,适用于偏态分布或者有离群点的分布
    data['col_name'].fillna(data['col_name'].dropna().mean(),inplace=True)    #均值插补,适用于正态分布
    

    2.2.3.4 用前后数据填充

    data['col_name'] = data['col_name'].fillna(method='pad')    #用前一个数据填充
    data['col_name'] = data['col_name'].fillna(method='bfill')  #用后一个数据填充
    

    2.2.3.5 拉格朗日插值法

    一般针对有序的数据,如带有时间列的数据集,且缺失值为连续型数值小批量数据

    from scipy.interpolate import lagrange
    #自定义列向量插值函数,s为列向量,n为被插值的位置,k为取前后的数据个数,默认5
    def ployinterp_columns(s, n, k=5):
        y = s[list(range(n-k,n)) + list(range(n+1,n+1+k))]  #取数
        y = y[y.notnull()]  #剔除空值
        return lagrange(y.index, list(y))(n)    #插值并返回插值结果
    
    #逐个元素判断是否需要插值
    for i in data.columns:
        for j in range(len(data)):
            if (data[i].isnull())[j]:   #如果为空即插值
                data[i][j] = ployinterp_columns(data[i],j)
    

    2.2.3.6 其它插补方法

    最近邻插补、回归方法、牛顿插值法、随机森林填充等。

    3、异常值

    异常值是指样本中的个别值,其数值明显偏离它所属样本的其余观测值。异常值有时是记录错误或者其它情况导致的错误数据,有时是代表少数情况的正常值

    3.1 异常值识别

    3.1.1 描述性统计法

    #与业务或者基本认知不符的数据,如年龄为负
    neg_list = ['col_name_1','col_name_2','col_name_3']
    for item in neg_list:
        neg_item = data[item] < 0
        print(item + '小于0的有' + str(neg_item.sum())+'个')
        
    #删除小于0的记录
    for item in neg_list:
        data = data[(data[item]>=0)]
    

    3.1.2 三西格玛法

    当数据服从正态分布时,99.7%的数值应该位于距离均值3个标准差之内的距离,P(|x−μ|>3σ)≤0.003

    #当数值超出这个距离,可以认为它是异常值
    for item in neg_list:
        data[item + '_zscore'] = (data[item] - data[item].mean()) / data[item].std()
        z_abnormal = abs(data[item + '_zscore']) > 3
        print(item + '中有' + str(z_abnormal.sum())+'个异常值')
    

    3.1.3 箱型图

    #IQR(差值) = U(上四分位数) - L(下四分位数)
    #上界 = U + 1.5IQR
    #下界 = L-1.5IQR
    for item in neg_list:
        IQR = data[item].quantile(0.75) - data[item].quantile(0.25)
        q_abnormal_L = data[item] < data[item].quantile(0.25) - 1.5*IQR
        q_abnormal_U = data[item] > data[item].quantile(0.75) + 1.5*IQR
        print(item + '中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum())+'个异常值')
    

    3.1.4 其它

    基于聚类方法检测、基于密度的离群点检测、基于近邻度的离群点检测等。

    3.2 异常值处理

    对于异常值,可以删除,可以不处理,也可以视作缺失值进行处理。

    4、描述性变量转换为数值型

    大部分机器学习算法要求输入的数据必须是数字,不能是字符串,这就要求将数据中的描述性变量(如性别)转换为数值型数据

    #寻找描述变量,并将其存储到cat_vars这个list中去
    cat_vars = []
    print('\n描述变量有:')
    cols = data.columns.tolist()
    for col in cols:
        if data[col].dtype == 'object':
            print(col)
            cat_vars.append(col)
    
    
    ##若变量是有序的##     
    print('\n开始转换描述变量...')
    from sklearn import preprocessing
    le = preprocessing.LabelEncoder()
    #将描述变量自动转换为数值型变量,并将转换后的数据附加到原始数据上
    for col in cat_vars:
        tran = le.fit_transform(data[col].tolist())
        tran_df = pd.DataFrame(tran,columns=['num_'+col])
        print('{col}经过转化为{num_col}'.format(col=col,num_col='num_'+col))
        data = pd.concat([data, tran_df], axis=1)
        del data[col]	#删除原来的列
    
    
    ##若变量是无序变量## 
    #值得注意的是one-hot可能引发维度爆炸
    for col in cat_vars:
        onehot_tran = pd.get_dummies(data.col)
        data = data.join(onehot_tran)	#将one-hot后的数据添加到data中
        del data[col]	#删除原来的列
    

    5、训练测试集划分

    实际在建模前大多需要对数据进行训练集和测试集划分,此处介绍两种划分方式

    法一、直接调用train_test_split函数

    from sklearn.model_selection import train_test_split
    X = data.drop('目标列',1)	#X是特征列
    y = data['目标列']	#y是目标列
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)	
    
    法二:随机抽样
    #随机选数据作为测试集
    test_data = data.sample(frac=0.3,replace=False,random_state=123,axis=0)
    #frac是抽取30%的数据,replace是否为有放回抽样,取replace=True时为有放回抽样,axis=0是抽取行、为1时抽取列
    #在data中除去test_data,剩余数据为训练集
    train_data = (data.append(test_data)).drop_duplicates(keep=False)
    X_train = train_data.drop('目标列',1)
    X_test = test_data.drop('目标列',1)
    y_train = train_data['目标列']
    y_test = test_data['目标列']
    

    6、数据规范化

    数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。 一些需要数据规范化的算法:LR、SVM、KNN、KMeans、GBDT、AdaBoost、神经网络等

    6.1 最小最大规范化

    对原始数据进行线性变换,变换到[0,1]区间。计算公式为: x* = (x-x.min)/(x.max-x.min)

    from sklearn.preprocessing import MinMaxScaler
    
    x_scaler = MinMaxScaler()
    y_scaler = MinMaxScaler()
    
    #特征归一化
    x_train_sca = x_scaler.fit_transform(X_train)
    x_test_sca = x_scaler.transform(X_test)
    y_train_sca = y_scaler.fit_transform(pd.DataFrame(y_train))
    

    6.2 零均值规范化

    对原始数据进行线性变换,经过处理的数据的均值为0,标准差为1。计算方式是将特征值减去均值,除以标准差。计算公式为:x* = (x-x.mean)/σ

    from sklearn.preprocessing import StandardScaler
    
    #一般把train和test集放在一起做标准化,或者在train集上做标准化后,用同样的标准化器去标准化test集
    scaler = StandardScaler()
    train = scaler.fit_transform(train)
    test = scaler.transform(test)
    
    
    展开全文
  • 本用法教程假定您已从UK hesin_all.csv下载并提取了包含参与者数据的.csv文件和包含健康记录数据的hesin_all.csv文件。 文件夹包含有关如何下载这些文件的指南。 1.安装 要使用此仓库,请运行: $ git clone git@...
  • 数据预处理涉及的步骤:导入所需的库导入数据集处理缺失的数据。编码分类数据。将数据集拆分为测试集和训练集。特征缩放。那么让我们逐一学习这些步骤。步骤1:导入所需的库你先需要下载此数据集:Data.csv每...
  • 文章目录skLearn中的数据预处理和特征工程一、数据预处理 Preprocessing & Impute① 数据无量纲化preprocessing.MinMaxScalerpreprocessing.StandardScaler② 缺失值处理impute.SimpleImputer skLearn中的数据...
  • 数据预处理过程

    万次阅读 多人点赞 2018-12-27 16:50:05
    数据预处理过程会占用很多时间,虽然麻烦但也是必不可少且非常重要的一步。在数据能用于计算的前提下,我们希望数据预处理过程能够提升分析结果的准确性、缩短计算过程,这是数据预处理的目的。本文只说明这些预处理...
  • 数据预处理 常见的几种方法

    万次阅读 2018-08-20 10:05:14
    数据预处理又称属性值的规范化。 属性值具有多种类型,包括效益型、成本型、以及区间型等。这三种属性,效益型属性越大越好,成本型属性越小越好,区间型属性是在某个区间最佳。 在进行决策时,一般要进行属性值...
  • 数据预处理——数据清洗

    万次阅读 2018-05-10 20:46:04
    在数据挖掘中,海量的原始数据中存在着大量不完整、不一致、有异常的数据,严重影响到数据挖掘建模的执行效率,甚至可能导致挖掘结果的偏差,所以...数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据...
  • python数据预处理

    千次阅读 2018-05-06 22:14:03
    这本书前面五章主要讲的是数据挖掘的建模过程,包括数据探索、数据预处理以及挖掘建模常用算法等几个方面。后面十章是案例分析,每章一个实战案例,加深对数据分析与挖掘的理解。前面的都比较基础,所以从第四章数据...
  • 数据挖掘——数据预处理

    千次阅读 2018-07-24 21:27:14
    1.2 常见数据预处理方法 数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。 数据集成:将多个数据源中的数据合并,并存放到...
  • 数据预处理方法

    千次阅读 2019-03-10 01:30:54
    下面主要针对数据预处理方面入手整理一些常用的方法。数据预处理分为四步,数据清理、数据变换和变量筛选。 一、数据清理 主要根据探索性分析后得到的一些结论入手,然后主要对四类异常数据进行处理;分别是缺失值...
  • 01数据预处理

    2018-06-06 14:43:15
    神经网络之数据预处理 本教程参考StudyAI,仅作为个人读书笔记 对于数据预处理,我们有3个常用的符号,数据矩阵X,假设其尺寸是[NxD](N是数据样本的数量,D是数据的维度).数据预处理方法大约有一下几种: 均值...
  • 数据预处理的一些知识

    万次阅读 2016-12-20 11:02:34
    我们常见预处理包括:标准化(规范化),归一化,零均值(化),白化,正则化……这些预处理的目的是什么呢?网上查的总是零零散散,很难搞清楚。因此我用此片博客来总结下。借鉴其他博客的内容,可能未一一注明还...
  • 数据预处理总结

    千次阅读 2017-06-07 15:12:36
    完成的数据预处理流程及方法
  • 常见近红外/红外光谱数据预处理方法及MATLAB实现

    万次阅读 多人点赞 2019-07-26 14:22:54
    在近红外等光谱数据分析建模过程中,最关键的一步除了特征选择之外就是光谱数据预处理,预处理的原因是光谱数据除了纯光谱(pure spectra)之外还包含基线漂移、噪声等信号,与此同时存在着因样本大小以及环境等因素...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,585
精华内容 22,234
关键字:

常见数据预处理包括