Fork me on GitHub

大数据之数据预处理

 

1.数据处理的主要操作

2.离散化与连续化

3.特征提取与构造

4.数据选择与构造

5.缺失值的处理

6.多重共线性和内生性

1. 数据处理的主要操作

映射与收集数据 :我们获得数据后需要对数据的每一列都定义属性,这样才方便我们接下来的数据处理。

缩放大型数据:对于使用数据不一定要全部使用,我们应该根据情况选择我们需要的数据,或者说根据我们的需求增加数据。

处理噪声与错误:主要分为两种问题,内部错误:由于模型设计问题产生的错误;外部错误:随机错误与噪声。

处理未知属性:我们需要关注未知的源 1. 是否是被遗忘 2. 某些属性是不恰当的 3. 属性实不恰当的4. 数据库的设计者不关心的变量。

数值离散化: 有些算法只能使用分类数据,那么我们需要将连续变量转化为离散变量。

数值连续化:有些算法只能处理连续变量,因此我么你需要将分类变量转化为连续变量,我们采用哑变量 的手法或者 WOE的手段来实现。

属性选择:有时数据维数过多,存在非常强的相关性,不利于模型拟合,因此我们使用属性选择法筛检数据。

属性构造和变换:如果属性过少或者原本数据不太好用,我们可以对数据进行构造,形成新的数据来进行模型分析。           

数据选择与构造:很多时候数据存在大量的干扰和不均衡的数据,我们需要对数据进行筛选。         

2. 离散化与连续化

1)离散化的主要方法

   2.1 分箱法

通常有等宽法与等频法,一个是按照边界划分,一个是按照元素数量划分。

   2.2 基于熵的离散化

   类似于决策树的方法,计算熵值或者基尼系数,划分数据集。

   2.3  卡方分布法

   通过卡方假设检验,通过计算每一个区间的显著性来判断两个区间是否可以合并。 判断两个相邻区间的独立性。具体步骤如下所示:

  2.3.1 将原始数据按照递排列。

  2.3.2 确定初始区间,是的每个特征在一个独立区间内。

  2.3.3 合并区间。使用卡方分布,判断两个相邻区间的独立性,如果$\chi_2 $ 的结果小于阈值,那么就合并。

2)连续化的主要方法

  2.1 虚拟变量的选用

   虚拟变量的使用主要是因为在逻辑回归中,分类变量不具有特别的代表意义,因此使用虚拟变量,将分类变量转化为可以使用逻辑斯特回归的变量。

   大致方法就是将我们的分类变量中的每一类形成一个样本,使用这个样本进行训练回归,得到的回归参数是 这个分类变量中两个类别的对于y的差异!

  2.2 WOE方法的使用

     这个方法更加直接 直接上公式:

$WOE_i= In \frac{B_i/B_t}{G_i/G_t}$

   其中 B表示bad,G表示good,$B_i$表示第i个bad类,$B_t$表示B的总数,同理,$G_i$表示第i个good的数量,$G_t$表示good的总数。

   具体详见 <<精通数据科学>> ,这个作者也写了 博客   https://zhuanlan.zhihu.com/p/39361047 。大家可以多参考参考。

3. 特征提取和构造

    我们使用特征提取和构造的原因

 1. 可以进行一次,计算开销比模型训练小。

 2. 是离线进行的,因此可以尝试很多算法

特征提取的主要方法:

  3.1. PCA主成分分析法

PCA的方法大家肯定不会陌生,使用PCA,找出属性中的特征值,并选出特征值的最大的前几个,为什么我们可以这么做呢。如果大家学习过矩阵分析便很容易知道,PCA是求出矩阵的谱,本质上是将一个矩阵做一次线性变化,换句话将,就是对当前的标准正交基变成另外一组标准正交基,这个变化是可以让组内方差最大,也就是说,PCA是将原来的属性做出一组线性变化,成为新的一个属性。

  3.2. 奇异值分解法

奇异值分解和PCA非常相似,其实就是一个矩阵变换,将一个矩阵变成3个矩阵的乘积 $A=U \Sigma D $,和PCA非常相似,但是值得注意的是,PCA主要是为了保持数据之间的差异,SVD主要是尽可能还原矩阵,但是,他们的本质都是矩阵的谱。PCA主要用于数据可视化,和降低数据中的随机因素的干扰,而奇异值主要用于生成更高效的向量来表示数据。

  3.3. Fisher Score 分析法

又称LDA判别法,在使用PCA方法进行降维的基础上考虑到训练样本的类间信息。FLD的基本原理就是找到一个最合适的投影轴,使各类样本在该轴上投影之间的距离尽可能远,而每一类内的样本的投影尽可能紧凑,从而使分类效果达到最佳,即在最大化类间距离的同时最小化类内距离。所以主要思想就是将系统分为类内散度和类间散度两类判别,就是希望寻找的投影方向使投影以后两类尽可能分开,而各类内部又尽可能聚集。公式如下

$F(x^i)=\frac{\sum_{j=0}^{numC}n_j(\mu_{j}^i-\mu^i)^2}{\sum_{j=0}^{numC}n_j(\sigma_{j}^i )^2}$

其中,$x_i$表示第i个属性,$n_j$表示标签列中,每一个属性都有不同的类,取值为第j个类的对应的行数,$(\sigma_j^{i})^2 $表示第i个属性中第j个类的集合在第i个属性上的方差。$\mu_j^{i}$表示第i列第j个属性的集合的均值,$\mu^i$表示第j个列的均值。

 通过计算,可以得到得分前几个得分最高的属性。

  3.4. 基尼系数选择法

基尼系数选择法 和熵值判别法大多类似,求出每一列的基尼系数,然后选取其中基尼系数较小,或者熵值较大的属性。

  3.5.T检验法与卡方分布判别法

t检验法和卡方检验法非常相似,主要是通过t分布或者卡方分布,进行假设检验,比较两个属性之间是否显著。下面为t分布检验法(Welch's T-test):

$t=\frac{\bar{x_1}-\bar{x_2} }{\sqrt{\frac{S_{1}^2}{N_1}+\frac{S_{2}^2}{N_2}}}$

其中$\bar{x_1},S_1^2,N_1$是第一个样本的均值,样本方差,和样本大小。同理其余三个变量。

  3.6.线性前向选择法

    ToDo

  3.7.基于系数多项式回归的属性选择法

    ToDo

    这两个算法比较难,我还没有完全搞懂,也不敢随意乱写,这里先放着,等我搞懂了再来补充。

4. 数据选择与构造

   从数据角度,通常会遇到两种问题,第一种是数据不平衡问题,第二种就是数据缺失问题。以下内容主要围绕数据不平衡问题。

   我们必须重视这个问题,因为不均衡的数据会带来我们模型的错误,会让我们模型误判真实的结果,并且稍不注意我们就会陷入准确率陷阱,表现出准确率高但是模型效果不好的假象,使用ROC曲线则可以显示出数据不均衡的问题,但是要解决的话,通常有以下方法:

  4.1.修改类别权重

  这个方法是最常用也是最简单的方法,,将不重要的数据的权重降低,将重要的数据的权重升高,权重的改变主要是在损失函数中加入。

  4.2.RUS(Random Under-sampling随机下采样)

  这个方法也是常用方法之一,我们只要将多余的数据部分随机删除,就可以达到我们需要的要求。

  4.3.CNN(Condense的Nearest Neighbor Decision Rule)

  CNN是对NN规则的改进。其实使用的也是最邻近的思想,具体算法如下:

    1) 两个数据容器,grabbag 和store

    2)先选第一个数据放入grabbag中,取第二个数据,如果符合NN规则,那么放入grabbag,否则放入store。

    3)遍历一遍后如果这一轮没有一个放入grabbag,那么循环结束

    4)重复步骤2,3直到grabbag中没有数据。

  4.4.SMOTE(Synthetic Minority Over-sampling Technique)

  一般来说,我们使用抽样,并不能很好的满足我么你的需求,更多的时候我们要生成一些数据,一般我们可以用我们重要的数据和距离他近的不重要的数据,生成原本不存在的样本$c=(a+b)*\gamma$ 其中$\gamma$ 为一个随机数,将a,b各个维度相加然后乘以一个随机数,便是我们需要的数据。

5.OSS(One side selection)

  这个算法就比较高大上了,主要思路如下所示:

   1) S为初始训练集

   2) 最初的时候,C包含了S中所有的少数类,并且随机挑选了一个多数类实例

   3)使用C中的实例,使用1-NN规则最邻近方法对S进行预测,将预测标签与原始标签对比,将未能正确预测的标签放入C

   4) 最终将所有处于C中的所有符合Tomek links 的多数类全部移走,而少数类留下,最终就是我们需要的标签。

  Tomek links: 取两个x,y,这两个具有不同标签,x,y的距离为$delta(x,y),如果不存在实例$z$,是的$delta(x,z)<delta(x,y)$或者$delta(y,z)<delta(x,y)$我们就把           $(x,y)$称为Tomek links。

5. 缺失值的处理

  缺失值其实是一个很难处理的问题,因为缺失的因素实在是太多了,因此,我们只有判断好数据缺失的原因,才能更好的处理缺失值。

5.1 缺失值的机制

实际上数据缺失通常有三种性质:

1)数据完全随机缺失:这就意味着数据缺失与其他值完全无关

2)数据随机缺失:缺失仅仅依赖于其他变量

3)非随机缺失:$P(y缺失|Y,X)=P(Y缺失|X)

5.2 数据缺失如何处理

我们必须解决一下三个问题:

1) 如何比较两个具有不同数目的缺失值样本

2)在划分数据集是未知数据该如何处理

3) 在分类阶段,样本具有缺失值该如何处理

那么我们首先可以抛弃数据,但这样做在有大量数据缺失的情况下是不能容忍的,

第二种情况便是使用可以处理缺失数据的模型:决策树,在决策树,中处理缺失数据主要有两个方面。决策树建立环节和决策树预测环节

    1)决策树建立环节:这个地方主要参照了<<数据挖掘基础教程>>这本书,大多数书都没有提到过这个问题。在决策树建立环节,我们通常使用基尼系数或者熵值来确定分叉,推广来讲就是我们的增益,XGBOOST也不例外,熵值的计算是通过计算每一类的熵。这是如果我么你具有一个缺失的数据,我们恰好使用其缺失的参数,我我么你可以先对未缺失的数据进行分类,然后将这个缺少数据的依次放入每个类中,当然,此时我们需要给我们的分类加上权重。通常来说,如果数据不具有缺失,那么系数为1,否则系数为这一类占总树的百分数。

$\omega_new=\omega_old*P(T_i)$

$P(T_i)=\frac{c_i}{\sum_{i=1}^{numC}c_i}$

   其中$c_i$为当前列的第i个属性的列数,$numC$为当前列的总的属性个数。

   通过这种加入权重的方法,最后我们得出的树的结果将以百分数表示,通常表示为具有多少可能性会被分到当前类。

    2)决策树预测环节: 如果重要的数据缺失,那么此时决策树可以使用两个节点都走的策略,当然,这里两个节点都走是具有权重的,那么最终结果就会是得到的结果乘以他们的权重!

6.多重共线性和内生性

6.1 多重共线性:

我们知道,数据的属性很多情况下具有极强的线性相关性,同时我们选择数据是如果我们使用虚拟变量,极其容易产生多重共线性,这种情况对于模型建立时十分不利的,因此我们要消除多重共线性,首先我们要检验是否存在多重共线性。

1. 使用皮尔逊相关度或者斯皮尔曼相关度检验相关度

2. 使用联合检验假设:如果几个变量分别不显著,但是联合显著,那么他们存在多重共线性。

3. 方差膨胀因子法。

而我们想要解决这个问题,可以使用以下手段

1. 增加数据量

2. 去掉数据变量:这样会带来很多的信息损失,去掉了变量,因此我们不建议这么做。

3. 降维: 使用PCA等方法降维

4. 加入惩罚项:使用l1,l2 正则化。

5. 有一种特别的情况,叫做结构化地方共线性,类似于 $x_1,x_1^2$两个参数,在远离远点的位置二者的值呈线性分布[2],因此使用中心位置置0可以解决这种问题,即是用 $x_1-\bar{x_1} (x_1-\bar{x_1})^2$。

6.2 内生性:

 与多重共线性类似,内生性也同样来自于线性模型,数学上表示为由于模型中一个或者两个变量。由于受到扰动的影响,导致变量与扰动之间存在某种联系,致使模型重要的假设:扰动是一个独立的相矛盾,这样的后果就是模型预测失准。从表现上来看,就是因变量与自变量互为因果,例如学区房与升学率之间的关系就是互为因果。

  我们要解决这个问题,主要是使用工具变量,工具变量就是变量要是与引起内生性变量相关,其次与随机扰动不相关。,找到随机变量后使用二阶最小二乘法,便可以消除内生性。

7.参考文献

[1] 唐亘<<精通数据科学--从线性回归到深度学习>>

[2] 张重生<<大数据分析-数据挖掘散发实例详解>>

[3] <<集体智慧编程>>       

 

posted @ 2019-03-17 20:19  顾鹏pen  阅读(5215)  评论(0编辑  收藏  举报