《Python数据分析与挖掘实战》笔记(四):数据预处理

数据预处理主要包括数据清洗数据集成数据变换数据规约

数据清洗:删除原始数据集中的无关数据、重复数据、平滑噪声数据,处理缺失值、异常值等
①缺失值处理
删除记录、数据插补、不处理
常用插补方法

均值/中位数/众数 根据属性值类型,取均值、中位数、众数进行插补
使用固定值 将缺失属性用常量替代
最近邻插补法 在记录中找到与缺失样本最接近的样本的该属性值进行插补
回归方法 根据已有数据和与其有关的其他变量数据建立拟合模型来预测
插值法 建立合适的插值函数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



  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值