上部分讲了些跟数据有关的概念,这部分来聊一聊操作。
这里讲的操作其实是对数据预处理的操作。大概有以下这些操作。
数据聚合(Aggregation)
数据取样(Sampling)
数据降维
属性子集选取
构建属性
离散化和二分化属性
变量转换
数据聚合
有个思想叫做"less is more",即所谓删繁就简。举个栗子,把超市的日销售记录聚合成月销售,把广州的各个seven-eleven店的销售记录聚合成全广州的销售记录,然后可以跟北京的,深圳的,上海的一起放在一个数据集里。前一Part提到的数据集的粒度问题,其实也涉及了数据聚合。这种聚合通常会使数据记录(个体)变少,这样能够节省存储空间和处理时间,提供一个更高瞻远瞩的视角,同时也必须承受可能丢失的数据细节。
取样
取样就是从现有的数据集里选出一个新的数据集集。取样要达到的效果就是,使用这个新数据集和使用整个数据集作为算法的输入,得到的结果应该是接近的,这样我们就说这个子集取得很有代表性。在进行取样之前,要确定新数据集的大小,以及取样所使用的方法。
取样的常用方法。最直观的就是简单随机抽样咯,每个数据个体(样本)有均等的机会被抽取。简单随机抽样又分为有放回和无放回抽样。有放回是比较简单的,因为每个样本被抽到的概率一直不变吗。当原始数据集相对于待抽出样本集合而言足够大,无放回也可以近似认为是有放回的抽样。主要真正的有放回抽样是可能带来重复样本的。还有些稍微复杂点的抽样方法,比如分层抽样(Stratified Sampling),对属于不同类别的样本按照其比例抽取样本。比如一个班有10名女生和30名男生(应该是个计科的班吧),要选取20人去参加一个合唱比赛,为了表现性别平等,可以按比例抽取男女同学,从女生里随机选择5人,并从男生中随机选择15人。
如果取样的样本数过小的话,通常会丢失较多有用信息。另外如果数据集本身较小的话,也可以通过设定一个更大的取样Size,重复选取某些样本,得到一个更大是数据集。样本数量也可以动态地确定(Adaptive Sampling),从较小的样本数开始,逐步增大样本数,看看对算法结果的影响。这个过程是比较耗时的。
降维
先说说降维的好处吧。首先降维可以减少相关性较弱的属性,及噪声;然后能避免维度灾难。通过降维能得到更易懂的模型,使得数据能更清晰地可视化,还可以减少数据处理的时间空间消耗。降维的主要方式是将现有的属性进行组合,得到新的较少的属性,具体的常用方法有PCA和SVD,在下一节中具体讨论。或者还有更简单粗暴的方法,直接从现有属性中选择一个子集,这种选择通常要依赖于特定的领域知识。特征选取的主要方法有,嵌入式的方法,过滤型方法,Wrapper型方法。所谓嵌入式的方法,就是说所选择的数据挖掘算法,它本身就带有特征选取的能力。举个栗子如决策树,建树的过程就在选取特征。过滤性的方法,就是先选好特征的子集,再来跑算法,而特征选择过程是独立于数据挖掘过程的,例如可以选择相关性较小的一些特征。通常把后两种方法结合在一起是比较好的选择。也就是说,特征的子集有很多很多,这个特征的选择过程是个搜索的过程,我们希望在可接受的时间内找到一种较优的子集。在这个过程中我们不断列举特征的子集,用这些特征来跑算法,用算法结果的优劣来衡量这个子集的优劣。我们不希望耗费太多时间,因此可以设定迭代到一定代数时,或者当结果足够好时停止搜索。
另外如果我们把在特征选取过程中是否保留某个特征用1和0来表示的话,自然而然可以想到,是不是有一种可能,不完全提出某个属性,而是赋予它一个0到1之间的权重。这种变形的特征选取也是很实用的,因为可能某些特征对最终结果的影响大于另一些特征。如何确定这些权值的大小也是个问题,可以依靠领域知识,或者用SVM之类的算法自动确定。
构建属性
属性构建的目的在于通过现有的数据集构建新的数据集,使得信息的表示更有效,或许还能降维呢。常见三种属性构建方法:抽取,映射,创建(实在没别的好名儿了)。
抽取嘛,例如从一张图片(一堆像素点)得到更高级的特性如颜色直方图什么的。映射呢,信号的时域到频域的转换。特征创建要跟普通降维方法所谓的特征创建区分开来。比如有两个属性,重量和体积,那么可以通过计算得到密度这一新的属性,这里依赖的是领域知识而不是属性的值本身之间的数学关系,简单讲敢这么做是因为物理学得好而不是数学棒棒哒。
离散化和二分化
必要性:某些算法要求属性是离散值,关联规则分析中通常要求数据是Binary的。另外也可以把取值较多的离散型属性稍微聚合一下。
对离散值的二分化,来个实例吧,简单直观。对于一个本来取值是{1,2,3,4,5}的属性(nominal或者ordinal都行),可以用三个新的属性X1,X2,X3来表示。辣么用000表示1,001表示2,010表示3...这样做的好处是所用的属性数量不算太多,坏处也很明显,这些新属性之间是有关联的,不独立的。因此还有另一种选择,用五个新的属性。10000表示1,01000表示2,00100表示3...
对于连续值的离散化,就是要找到一些分割点(首先要确定分割点的个数),然后切分,一个数值落在了那个区间就归属于对应的离散值。根据是否使用了类别信息,可以把离散化方法分为无监督的离散化和有监督的离散化。对应无监督离散化而言,只考虑这个属性的值的分布本身。常用的方法有,等间距的划分,等频率的划分,以及聚类方法。等间距划分比较容易受异常值的影响,聚类方法通常表现会优于另两种。对于有监督离散化,要用类别来计算熵。作为一个迭代过程,每次选择使得熵增最小的划分点,然后在下一步中对熵最大的子间隔继续划分。
变量转换
变量的转换主要有简单函数转换和标准化。简单函数,如y=x^k,logx 1/x等。
标准化的目的是避免某些scale较大的变量对结果的影响过大。通常是要得到一组均值为0,标准差为1的属性值:x'=(x-mean(x))/sx,,这里mean(x)表示变量x的均值,sx是其标准差。注意均值和标准差都对异常值比较敏感,一种可能更好的选择是,用中位数代替均值,用绝对标准差代替标准差。