浅谈数据三-数据预处理

数据挖掘中,在海量的原始数据中存在大量有缺失、异常甚至是不一致的数据,严重影响到了建模的执行效率以及正确性。数据预处理的主要内容包括数据清洗、数据集成、数据变换、数据规约,预处理一方面是提高数据的质量,另一方面是要数据更好的适应特定的挖掘技术或工具。

数据清洗

数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据并且处理缺失值、异常值等。

一般处理缺失值的时候,通常采用删除记录、数据插补,或者不处理的方式。如果删除少量数据就可以达到目标,当然最好,但是他是以减少历史数据来换取数据的完备,会造成大量资源的浪费,丢弃大量隐藏在记录里的信息,所以个人而言并不太推荐这种方式,更推荐用插补的方式,补齐数据。插补的方法有很多,例如通过均值等属性数据填补,也可以使用固定的值/临近的值进行插补,这里推荐的是使用 拉格朗日插值(多项式) 进行处理。

拉格朗日: 对于给定的若n+1个点

,对应于它们的次数不超过n的拉格朗日多项式L只有一个。如果计入次数更高的多项式,则有无穷个,因为所有与L相差
的多项式都满足条件。公式为

在Python的Scipy库中,提供了其实现函数如下

from scipy.interpolate import lagrange

"""
    自定义列向量插值函数
    s为列向量,n为被插位置,k为取前后数据个数
"""
def ployinterp_column(s, n, k = 5):
    y = s[list(range(n - k, n)) + list(range(n + 1m n + 1 + k))] # 取数
    y = y[y.notnull()] # 去空
    return lagrange(y.index, list(y))(n) # 插值饼返航插值的结果

# 调用的时候,例如data 是从excel中读出来的
for i in data.column:
    for j in range(len(data)):
        if(data[i].isnull())[j]:
            data[i][j] = ployinterp_column(data[i], j)

数据集成

数据挖掘之前,数据集往往是在不同的数据源中,这时候需要将多个数据源合并饼存储到一个数据仓库中。由于多个数据源的表达形式是不一样的,有可能不匹配,要考虑到识别的问题以及属性冗余的问题,从而将源数据在最底层商加以转换、提炼和集成。这个步骤主要做的就是实体的识别以及冗余属性的识别。

实体识别是从不同数据源识别出现实世界的实体,需要做的是统一不同数据的矛盾之处。简单来说,就是将不同的字段名字统一成一个,和将数据的计量单位统一。例如A在一个数据源中叫 gender,另一个叫sex,需要进行统一,有的计量用的m,有的用km,这个需要统一等。

冗余属性的识别是为了解决 同一属性多次出现,同一属性命名不一致导致重复的问题。这个需要我们仔细观察与分析了。

数据变换

数据变换主要是对数据进行规范化的处理,以使用挖掘任务和算法的需要。这是挖掘中至关重要的一个步骤。

1. 简单的数据变化
一般进行简单的函数变化,是对原始数据进行简单变换,基本使用平方、开平方等运算。简单的函数变换常用来将不具备正态分布的数据变换成具有正态分布的数据。

2.规范化
数据规范化处理是数据挖掘的一项基础工作,主要是为了消除指标之间的量纲和取值范围的差异影响,需要进行标准化处理,将数据按照比例进行缩放,从而使落入一个特定的区域,以便于分析。规范化对于基于距离的挖掘算法尤为重要。通常使用的方法为 “最小 - 最大规范化”、“零 - 均值规范化”、“小数定标规范化”。如下为python实现

import pandas as pd
data = pd.read_excel(xxxxx)
# 最小-最大规范化
(data - data.min()) / (data.max() - data.min())
# 零 - 均值规范化
(data - data.mean()) / data.std()
# 小数定标规范化
data / 10 ** np.ceil(np.log10(data.abs().max()))

3.连续属性离散化

一些数据挖掘算法,特别是分类算法(ID3、Apriori等),要求数据是分类属性形式。这样需要将一些连续属性变换成分类属性,也就是 连续属性离散化。他其实就是在数值的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或数值代表每个区间的数据,即需要确定分类数以及将连续属性值映射到这些分类值中。

常用的离散化方法有 等宽法、等频法、基于聚类分析的方法。前两者顾名思义,一是将属性值域等分区间,一是将相同数量的记录分到不同的区间。这两个易于操作,但是弊端也很明显。一维聚类的方法包括两个步骤,首先将连续属性的值用聚类算法进行聚类,然后再将得到的簇进行处理,合并到一个簇的连续属性值并作同一标记。聚类分析的离散花坊法也需要指定簇的数量,来决定区间数。以下为python的k-means聚类分析方法示例:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
# data 为获取的pd

kmodel = KMeans(n_clusters = k)      #确定族数
kmodel.fit(data.values.reshape(len(data),1))    #训练数据集
c = pd.DataFrame(np.sort(kmodel.cluster_centers_))   #确定中心并排序
w = c.rolling(2).mean().iloc[1:]      #取移动平均值
w = [0]+list(w[0])+[data.max()]       #加上最大最小值作为边界值
w = list(np.sort(w))          #再次排序
d = pd.cut(data,w,labels = range(k))

属性构造

在数据挖掘过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,我们需要利用已有的属性,来构造新的属性,并加入到现有属性的集合中。简单的举例,一个餐馆的日营业总额数据,然后还有每日单据数量,我们就可以 知道 人均每笔消费的数据,加入的新的一列中进行统计。这个虽然是从已有数据中延伸来的,但是直接生成新属性统计时可更直观。

小波变换

小波变换是一种数据分析工具,是一种信号分析手段。小波变换具有多分辨率的特点,在时域和频域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度聚焦分析,提供了一种非平稳信号的时频分析手段,可以由粗及细的逐步观察信号,从中提取有用信息。

能够刻画某个问题的特征量往往是隐含在一个信号中的某个或者某些分量中,小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号特征的提取。

分享一个在查阅资料时发现的一个博文, 传送门: https://zhuanlan.zhihu.com/p/22450818

这里推荐一个python的信号处理库 PyWavelets,安装方式是 pip3 install pywt。虽然Scipy本身提供了一些信号处理函数,能够满足简单使用,但是不够全面。

from scipy.io import loadmat
import pywt

matfile = 'xxxxxxx.mat'
mat = loadmat(matfile)
signal = mat['xxxxx'][0]

coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)

数据规约

数据规约其实本质上就是在补损害数据完整性的前提下缩小数据集,使之能够低效快速的挖掘出结果。
数据规约一般要从两个方向进行,一是属性规约,其次是数值规约。

属性规约通过属性合并来创造新属性维数,或者通过删除不限干属性来减少数据的维度数,从而提高数据挖掘的效率以及降低计算成本,其目标是寻找出最小的属性子集,并确保新数据子集的概率分布尽可能接近原数据的概率分布。其主要方式为主成分分析(传送门:https://www.zhihu.com/question/41120789?sort=created)。

数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数和无参数两类。有参数方法是使用一个模型来评估数据,值存放参数,而不需要存放实际数据。午餐数方法就需要存放实际数据,例如直方图、聚类、抽样等。例如上文所提到的聚类的方式,将数据分为簇,让一个簇中对象相互相似,反之相异,并用数据簇来替换原始数据的数据规约方式。

你可能感兴趣的:(浅谈数据三-数据预处理)