数据是机器学习的原料,在把数据投入机器学习模型前,我们需要对数据进行加工。同样的,正确预处理数据对模型输出结果有非常非常非常(重要的事情说三遍)大的影响。可以说,数据预处理是机器学习落地最麻烦但最具有挑战的环节。
在实际业务处理中,数据通常是脏数据。所谓的脏,指数据可能存在以下几种问题(主要问题):数据缺失,数据噪声,数据不一致,数据冗余,数据集不均衡,离群点/异常值,数据重复
数据进行预处理主要有以下步骤,第一部分提及的各种脏数据的处理就在这些步骤中完成:
在数据清洗阶段,我们处理第一部分提及的 缺失数据1、离群点6和重复数据7。
缺失种类:
解决方式:
离群点是远离数据集中其余部分的数据,这部分数据可能由随机因素产生,也可能是由不同机制产生。如何处理取决于离群点的产生原因以及应用目的。若是由随机因素产生,我们忽略或者剔除离群点,若是由不同机制产生,离群点就是宝贝,是应用的重点。后者的一个应用为异常行为检测,如在银行的信用卡诈骗识别中,通过对大量的信用卡用户信息和消费行为进行向量化建模和聚类,发现聚类中远离大量样本的点显得非常可疑,因为他们和一般的信用卡用户特性不同,他们的消费行为和一般的信用卡消费行为也相去甚远。还有购物网站检测恶意刷单等场景也重点对离群点进行分析。
不论是对离群点提出还是重点研究应用,我们首先需要检测出离群点。在sklearn(一个python机器学习包)中提供了多种方法,如OneClassSVM、Isolation Forest、Local Outlier Factor (LOF)。
对重复数据的处理如下:如果高度疑似的样本是挨着的,就可以用滑动窗口对比,为了让相似记录相邻,可以每条记录生成一个hash key, 根据key去排序。
数据清洗阶段结束后,我们得到的是没有错误的数据集了~
在数据转换阶段,我们对数据进行 采样处理、类型转换、归一化。
采样是从特定的概率分布中抽取样本点的过程。采样在机器学习中有非常重要的应用:将复杂分布简化为离散的样本点;用重采样可以对样本集进行调整以更好地进行调整并适应后期的模型学习;用于随机模拟以进行复杂模型的近似求解或推理。采样的一个重要作用是处理不均衡数据集。
最简单的处理不均衡样本集的方法是随机采样。采样一般分为过采样(Over-sampling)和欠采样(Under-sampling)。随机过采样是从少数类样本集 S_min中有放回地随机重复抽取样本,随机欠采样是从多数类样本集S_max中随机选取较少样本。两种方法也存在问题,如随机过采样会扩大数据规模,容易造成过拟合;随机欠采样可能损失部分有用信息,造成欠拟合。为了解决上诉问题,通常在随机过采样时不是简单复制样本,而是采取一定方法生成新的样本。如使用SMOTE(Synthetic Minority Oversampling Technique)算法、Borderline-SMOTE、ADASYN等算法。对于欠采样,可以采用Informed Undersampling来解决数据丢失问题。
在类型转换处理前,我们先来看下 数据的类型。
数据类型可以简单划分为数值型和非数值型。数值型有连续型和离散型。非数值型有类别型和非类别型,其中类别型特征中如果类别存在排序问题为定序型,若不存在排序问题则为定类型,非类别型是字符串型。
对于非数值型,我们需要进行类别转换,即将非数值型转换为数值型,以方便机器学习算法后续处理。
对于定序型,我们可以使用序号编码,如成绩,分为Average, Good, Best三档,序号编码可以按照大小关系对定序型特征赋予一个数值ID,例如Average表示为1,Good表示为2,Best表示为3,转换后依旧保留了大小关系。
对于定类型,我们可以使用独热编码,如颜色三原色,为Red, Green, Blue,独热编码可以把三原色变为一个三维稀疏向量,Red表示为(0,0,1),Green表示为(0,1,0),Blue表示为(1,0,0)。需要注意的是,在类别值较多的情况下,可以使用稀疏向量来节省空间,目前大部分算法实现均接受稀疏向量形式的输入。当然还有很多别的编码方式,如二进制编码等,感兴趣的可以额外查阅资料了解。
对于字符串型,我们有多种表示方式,如词袋模型(Bag of Words),TF-IDF(Term Frequency-Inverse),主题模型(Topic Model),词嵌入模型(Word Embedding)。各种表示有不同的适用场景和优缺点,需要进一步了解的可以额外查资料
经过类别转换后,我们所有的数据均转为了数值型。为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,身高在1.6-1.8m的数值范围内,体重特征在50-100kg的数值范围内,分析出来的结果会倾向于数值差别较大的体重特征。对数值型特征进行归一化可以将所有特征都统一到一个大致相同的区间内,以便进行分析。归一化方式通常有线性函数归一化(Min-Max Scaling)和零均值归一化(Z-score Normalization)。
当然,不是所有的机器学习算法需要对数值进行归一化,在实际应用中,通过梯度下降法求解的模型通常需要归一化,因为经过归一化后,梯度在不同特征上更新速度趋于一致,可以加快模型收敛速度。而决策树模型并不需要,以C4.5为例,决策树在节点分裂时主要依据数据集D关于特征x的信息增益比,而信息增益比跟特征是否经过归一化是无关的
在数据描述阶段,我们可以根据需要计算统计量和对数据进行可视化。数据的一般性描述有mean, median, mode, variance.
数据可视化一维数据圆饼图,柱状图;二维数据散点图;三维数据用三维坐标呈现;高维数据需要先做转换或映射,比如用matlab的Box Plots,也可以用平行坐标呈现。可使用工具有很多,如matlab和Geph。
当我们做特定分析的时候,可能属性非常多,但有些属性是不相关的,有些属性是重复的,所以我们需要用特征选择挑选出来最相关的属性降低问题难度。
数据之间的相关性 可以使用Pearson correlation coefficient,Pearson chi-square进行度量。前者适用与有metric data的情况,后者适用于分类统计的情况
。
我们可以通过熵增益(Entropy Information Gain)、分支定界(Branch and Bound)等方式进行特征选择。特征选择还有sequential forward, sequential backward, simulated annealing(模拟退火), tabu search(竞技搜索), genetic algorithms(遗传算法)等方式去优化
为了提高复杂关系的拟合能力,在特征工程中经常会把一些离散特征两两组合,构成高阶特征。如在点击率预测问题中,原始数据有语言和类型两种特征,为了提高拟合能力,语言和类型可以组合成二阶特征,联合预测对点击率的影响。如何找到有意义的组合特征?有一种方法是基于决策树的组合特征寻找方法。
在机器学习中,数据通常需要表示为向量的形式进行训练,但是在对高维向量进行处理和分析时,会极大消耗系统资源,甚至产生维度灾难。因此,使用低维度的向量来表示高维度的向量就十分必要。特征抽取或降维即使用低纬度向量表示高维度向量的方法。
特征抽取是主要有主成分分析(Principal Component Analysis,PCA)和线性判别分析(Linear Discriminant Analysis,LDA)两种方式。
import pandas as pd
def GetData_excel(FilePath,sheetName):
Data = pd.read_excel(FilePath,sheet_name=sheetName)
return Data
if __name__ == "__main__":
file_path='./Excel_operate/相关性分析后.xlsx'
sheetName='合并'
features=['煤比','铁水温度','Si','燃料比']
Correlation=pd.DataFrame()
Data=GetData_excel(file_path,sheetName)
for i in range(4):
Correlation[features[i]]=Data.corr()[features[i]] #相关系数矩阵,即给出了任意两款菜式之间的相关系数
Correlation.to_excel('./Excel_operate/correlation.xls')
DataFrame.corr(method='pearson', min_periods=1)
method:可选值为{‘pearson’, ‘kendall’, ‘spearman’}
pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,即针对线性数据的相关系数计算,针对非线性数据便会有误差。
kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正太分布的数据
spearman:非线性的,非正太分析的数据的相关系数
min_periods:样本最少的数据量
返回值:一维数组Series 。type:
最全面的数据预处理介绍
5种常用的相关分析方法
皮尔森相关系数
相关性系数及其python实现
python数据相关性分析 (计算相关系数)
pandas相关系数-DataFrame.corr()参数详解-针对数值特征和类别特征
【Python】用pandas将dataframe写入excel中