数据预处理主要包括数据清洗、数据集成、数据变换和数据规约
数据清洗:删除原始数据集中的无关数据、重复数据、平滑噪声数据,处理缺失值、异常值等
①缺失值处理
删除记录、数据插补、不处理
常用插补方法
均值/中位数/众数 根据属性值类型,取均值、中位数、众数进行插补
使用固定值 将缺失属性用常量替代
最近邻插补法 在记录中找到与缺失样本最接近的样本的该属性值进行插补
回归方法 根据已有数据和与其有关的其他变量数据建立拟合模型来预测
插值法 建立合适的插值函数f(x),未知值计算得到。拉格让日插值法、牛顿插值法。
②异常值处理:异常值是否剔除看情况,因为有些异常值可能含有有用信息
常用异常值处理方法
删除记录 直接删除
视为缺失值 视为缺失值进行缺失值的处理
平均值修正 取前后两个正常值的平均
不处理 判断其原因,若无问题直接使用进行挖掘
数据集成:将多个数据源合并存在一个一致的数据存储中,要考虑实体识别问题和属性冗余问题,从而将数据在最低层上加以转换、提炼和集成
①实体识别:同名异义、异名同义、单位不统一
②冗余属性识别:多次出现、同属性不同名导致重复
数据变换:对数据规范化处理
①简单函数变换,如平方、开方、对数、差分运算
②规范化,也称归一化,消除量纲和取值范围的差异,进行标准化处理。映射到[-1,1]或[0,1]内。
[1]最小-最大规范化,也称离差标准化。x*=(x-min)/(max-min);缺点:异常值影响;之后的范围限制在[min,max]中
[2]零-均值规范化,也称标准差规范化,处理后[0,1]。x*=(x-mean)/std
[3]小数定标规范化,移动属性值小数位,映射到[-1,1]。x*=x/10^k
#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
import numpy as np
datafile = '../data/normalization_data.xls' #参数初始化
data = pd.read_excel(datafile, header = None) #读取数据
print (data - data.min())/(data.max() - data.min()) #最小-最大规范化
print (data - data.mean())/data.std() #零-均值规范化
print data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化
#output:
# 0 1 2 3
#0 0.074380 0.937291 0.923520 1.000000
#1 0.619835 0.000000 0.000000 0.850941
#2 0.214876 0.119565 0.813322 0.000000
#3 0.000000 1.000000 1.000000 0.563676
#4 1.000000 0.942308 0.996711 0.804149
#5 0.264463 0.838629 0.814967 0.909310
#6 0.636364 0.846990 0.786184 0.929571
# 0 1 2 3
#0 -0.905383 0.635863 0.464531 0.798149
#1 0.604678 -1.587675 -2.193167 0.369390
#2 -0.516428 -1.304030 0.147406 -2.078279
#3 -1.111301 0.784628 0.684625 -0.456906
#4 1.657146 0.647765 0.675159 0.234796
#5 -0.379150 0.401807 0.152139 0.537286
#6 0.650438 0.421642 0.069308 0.595564
# 0 1 2 3
#0 0.078 0.521 0.602 0.2863
#1 0.144 -0.600 -0.521 0.2245
#2 0.095 -0.457 0.468 -0.1283
#3 0.069 0.596 0.695 0.1054
#4 0.190 0.527 0.691 0.2051
#5 0.101 0.403 0.470 0.2487#
③连续属性离散化:分类算法需要离散形式,如ID3、Apriori等
离散化过程就是在取值范围内设立若干个离散花粉店,将取值范围划分为离散区间
等宽法、等频发、基于聚类分析方法
#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
datafile = '../data/discretization_data.xls' #参数初始化
data = pd.read_excel(datafile) #读取数据
data = data[u'肝气郁结证型系数'].copy()
k = 4
d1 = pd.cut(data, k, labels = range(k)) #等宽离散化,各个类比依次命名为0,1,2,3
#等频率离散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1] #使用describe函数自动计算分位数
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels = range(k))
def cluster_plot(d, k): #自定义作图函数来显示聚类结果
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize = (8, 3))
for j in range(0, k):
plt.plot(data[d==j], [j for i in d[d==j]], 'o')
plt.ylim(-0.5, k-0.5)
return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
④属性构造
#-*- coding: utf-8 -*-
#线损率属性构造
import pandas as pd
#参数初始化
inputfile= '../data/electricity_data.xls' #供入供出电量数据
outputfile = '../tmp/electricity_data.xls' #属性构造后数据文件
data = pd.read_excel(inputfile) #读入数据
data[u'线损率'] = (data[u'供入电量'] - data[u'供出电量'])/data[u'供入电量']
data.to_excel(outputfile, index = False) #保存结果
⑤小波变换:信号分析手段,小波分析的理论和方法在信号处理、图像处理、语音处理、模式识别、量子物理等领域得到越来越广泛的应用
#-*- coding: utf-8 -*-
#利用小波分析进行特征分析
#参数初始化
inputfile= '../data/leleccum.mat' #提取自Matlab的信号文件
from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]
import pywt #导入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回结果为level+1个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组
数据规约:产生更小且保持数据完整性的新数据集。意义在于降低无效、错误数据;降低存储成本;少量且具有代表性的数据大幅加快。
①属性规约:属性合并或删除无关维,目标是寻找最小子集使子集概率分布尽可能与原来相同
属性规约常用方法
合并属性 将就属性合并为新属性 {A1,A2,A3,B1,B2,C}——{A,B,C}
逐步向前选择 从空集开始,逐个加入最优属性,直到无最优或满足条件 {}—{A1}—{A1,A4}
逐步向后删除 从全集开始,每次删除最差属性,直到无最差或满足阈值
决策树归纳 利用决策树归纳能力进行分类,删除未出现的属性,即效果差的属性
主成分分析 用少量变量解释大部分变量,保留大部分信息,将相关性高的数据转为彼此独立
#-*- coding: utf-8 -*-
#主成分分析 降维
import pandas as pd
#参数初始化
inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降维后的数据
data = pd.read_excel(inputfile, header = None) #读入数据
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(data)
pca.components_ #返回模型的各个特征向量
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
②数值规约:通过选择替代的、较小的数据来较少数据量,包括有参数(回归、对数线性模型)和无参数方法(直方图、聚类、抽样)
Python主要数据预处理函数
interpolate 一维、高维插值,如拉格朗日、样条插值等 Scipy
unique 去除重复 Pandas/Numpy
isnull 判断是否为空 Pandas
notnull 判断是否非空 Pandas
PCA 主成分分析 Scikit-Learn
random 生成随机矩阵 Numpy