数据预预处理对于机器学习结果来说是至关重要,有时甚至是决定性的。本篇我们将讨论针对不同的数据类型,如何根据不同的数据模型来做预处理。具体我们将讨论四种最常见类型的数据,分别是 数字数据,类别数据,时间数据和坐标数据。

数字数据

  1. 标准化(Scaling)

为什么要标准化? 非标准化的数据会造成计算数据之间距离时,在一个数据纬度上的距离被过度放大,可能会极大的影响分类的准确性。 如下图,如果我们采用k-NN计算节点间距离,左右两个x1坐标系的尺度不同直接影响了绿色节点的分类结果。

标准化有四种常规实现方式,对应于Sklearn 以及Numpy中的实现,分别是MinMaxScaler, StandardScaler

MinMaxScaler 转化数据到[0, 1]区间 X = (X-X.min())/(X.max() - X.min()) 具体可使用 sklearn.preprocessing.MinMaxScaler

StandardScaler 转化数据到 平均值=0, 方差=1 X = (X-X.min())/X.std() 具体可使用sklearn.preprocessing.StandardScaler

是否所有模型都需要标准化? 答案是否定的,实际上决策树相关模型就不需要进行数值标准化,因为树模型不用考虑节点之间的相互距离。

  1. 离群值(Outlier)与排序

有时一个数据集中可能有几个数据点偏离其他数据点太远,这可能会极大影响分类效果,如下图所示:

这时候我们需要把离群点找出来剔除或单独处理,一种最简单可行的方法是对数据点进行排序,并用排序后的index代替原数值,这种方式把数据节点之间的距离尺度拉平到1个单位。

比如

rank([-100, 0, 1e5]) ==[0,1,2]
rank([1000,1,10]) = [2,0,1] 

sklearn.stats.RankData可以实现上述排序+映射的功能

  1. 取对数或开平方

对于神经网络模型来说,如果数值太靠近0, 可以采取对数或开平方的方式来使数据变得更加可区分,借助于Numpy 比如: np.log(1 + x) np.sqrt(1+x)

  1. 创造新的特征值

有时候你不必局限于已有数据的特征,可以创造一些新的特征值来使数据的表达更为丰富,在部分竞赛题目中,新特征值的构建对结果也产生了至关重要的作用

例如房地产数据,假设你已经有房子面积和总价数据,你可以很自然的想到房屋单价这一可能的新特征。有时候新特征可能需要一些统计知识,比如时间序列数据中每个窗口数据,可以添加其均值方差等新特征。总体来说,对于新特征的挖掘能力取决于两方面:一是领域知识的了解程度;二是通过探索性数据分析(EDA)所获得的发现

类别数据

类别数据,又称可枚举数据,是一种广泛存在的数据类型,比如性别,职业,学历等。 序数词是指一个序列中的一部分数据,比如考试名词。这些数据需要转换成数值数据以供模型使用。典型的处理方式有适用于决策树相关模型的LabelEncoding 和FrequencyEncoding , 以及适用于线性及其他非决策树模型的OneHot Encoding

  1. LabelEncoding 将类别或序数词直接映射为数值数据,具体有两种映射方式,一是按照字母顺序,二是按照出现顺序,比如下面这组数据:[S, C, S, S, S Q] 按照字母顺序映射结果 为[2, 1, 2, 2, 2, 3] 按照 出现顺序则为[1, 2, 1, 1, 1, 3] 分别采用的软件包为 sklearn.preprocessing.LabelEncoder 和 Pandas.factorize

  2. Frequency Encoding FrequencyEncoding 是指计算每个类别的出现频率,按照上述例子计算 那么我们有P(S) = 4/6 P(C) = 1/6 P(Q)=1/6

  3. One-hot Encoding 对于非决策树模型来说,One-Hot Encoding 是一个更合适的预处理方法,其具体处理过程如下所示:

One-Hot 将一维特征拓展为N维(N=类别总数), 每行对应的列为1,其他为0。 由于处理后的数值只能为0或1,所以OneHot的过程也同时是数据标准化的过程。 One-Hot一个潜在的缺点是,如果类别数过多会生成一个庞大的稀疏矩阵,使计算效率大打折扣,这个时候可以考虑用其他方式比如广泛用于自然语言处理的Word2Vec。

时间和地理坐标数据

时间和地理坐标数据有一些相似点是,时间和地理坐标本身是一种标尺不是数据,但是我们可以根据时间和地理坐标的特性生成新的数字或者类别特征。 时间数据

时间数据可以从三个方面考虑其新特征:

  1. 周期性 秒、分、时、星期、月、年。例如病人服药记录,一种药需要三天吃一次,可能就需要3天为一个时间周期来计算相关特征。
  2. 距离某个时间距离 分析电商销售数据比较常用的是计算比如开店后多少星期,从上一个节假日之后多少天的销售额。
  3. 时间差 两个时间点之间的数据差也可能成为新的特征值,比如股市每日收盘和开盘之间的价格变化。

地理坐标数据

类似于时间数据,地理坐标数据也可以产生很多有用的特征,假设要预测一个地区的房价信息,在给定了一个城市比如伦敦

我们可以从几个方向去探索:

  1. 聚类中心点 可以尝试依据房价的经纬度进行聚类分析,分析发现关键性的地标中心,比如伦敦塔、海德公园、大英博物馆等 。
  2. 距离信息 可计算预测的地点到中心点的距离值
  3. 聚合分析 在预测点周围比如1英里、3英里 半径范围内房子的类型价格、教育设施、生活设施等统计信息。