一、数据清洗
删除原始数据集中的无关数据、重复数据,平滑噪声数据,处理缺失值、异常值。
- 缺失值处理
删除缺失值、数据插补、不处理
Scipy:拉格朗日插值法
from scipy.interpolate import lagrange#导入拉格朗日插值函数
- 异常值处理
直接删除、视为缺失值、平均值填补、不处理
二、数据集成
将多个数据源合并存放在一个一致的数据存储(如数据仓库)中的过程
- 实体识别
统一不同源数据的矛盾之处:同名异义、异名异义、单位不统一
- 冗余属性识别
同一属性多次出现、同一属性命名不一致导致重复
使用相关分析检测:给定两个数值型的属性A和B,根据其属性值,用相关系数度量一个属性在多大程度上蕴含另一个属性
计算相关系数:
Pearson 相关系数:分析两个连续变量之间的关系,且连续变量的取值服从正态分布。
Spearman 秩相关系数:分析不服从正态分布的变量、分类或等级变量见的关联性。
引入 Pandas 用于读取数据
计算示例:
data.corr( )[u'A的销量']
结果:列出所以产品销量与A销量的相关系数
三、数据变换
对数据进行规范化处理,转换成适于挖掘的形式。
- 简单函数变换
平方、开方、取对数、差分运算,以将不具有正态分布的数据变换城具有正态分布的数据。
- 规范化
将数据进行标准化处理,按照比例进行缩放,使之落入一个特定的区域,消除指标之间的量纲和取值范围差异的影响。
引入 Pandas 用于读取数据,numpy 用于计算数据
最小—最大规范化:离差标准化,是对原始数据的线性变换,将数值映射到 [0,1] 之间。
(不适用于数值集中且某个数值很大的情况)
转化公式: x*=(x-min)/(max-min)
max:样本数据的最大值; min:样本数据的最小值; max-min为极差
零—均值规范化:标准差规范化,经过处理的数据的均值为0,标准差为1。
(不适用于数值集中且某个数值很大的情况)
转化公式: x*= (x-均值) / 标准差
均值:原始数据的均值; min:原始数据的标准差;
小数定标规范化:通过移动属性值的小数位数,将属性值映射到 [-1,1] 之间。移动的位数取决于属性值绝对值的最大值。
(不适用于数值集中且某个数值很大的情况)
转化公式: x*= x / 10的K幂
均值:原始数据的均值; min:原始数据的标准差;
- 连续属性离散化
一些分类算法(如ID3算法、Apriori算法)要求数据时分类属性的,所以需要将连续属性变成分类属性,即连续属性离散化。
在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。
步骤:确定分类数——>将连续属性值映射到分类值
方法:
等宽法:将属性的值域分成具有相同宽度的区间。引入 Pandas 用于读取数据
计算示例:datafile='../data/abcd.xls'
data=pd.read_excel(datafile)
data=data[u 'a的销售量' ].copy( )
k=4
d1=pd.cut( data,k,labels=range(k) )
等频法:将相同数量的记录放进每个区间。引入 Pandas 用于读取数据
计算示例: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) )
基于聚类分析的方法:引入 Pandas 用于读取数据,从 scikit-learn 的 sklearn.cluster 引入 KMeans
计算示例:from sklearn.cluster import KMeans #引入KMeans
kmodel=KMeans( n_clusters=k,n_jobs=4 ) #建立模型,n_jobs 是并行数
kmodel.fit(data.reshape( ( len(data),1) ) ) #训练模型,此行reshape报错....待解决
c=pd.DataFrame ( kmodel.cluster_centers_).sort(0) #输出聚类中心,并且排序(默认是随机顺序的)
w=pd.rolling_mean (c,2) .iloc [1: ] #相邻两项求中点,作为边界点
w=[0] + list(w[0]) + [ data.max( ) ] #把首末边界点加上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 j in d[d==j] ], 'o') # data[d==j] 为 x 轴; [j for j in d[d==j] ] 为 y 轴; 以 o 圆圈画图
plt.ylim( -0.5, k-0.5) #ylim 设置 y 轴的限制
return plt
cluster_plot ( d1, k ).show( )
cluster_plot ( d2, k ).show( )
cluster_plot ( d3, k ).show( )
- 属性构造
利用已有属性构造新属性,并加入到现有的属性集合中。
引入 Pandas 用于读取数据
- 小波变换
在时域和频域都具有表征信号局部特征的能力。
引入 Scipy 的信号处理库和 Pywavelets 信号处理库
引入示例:from scipy.io import loadmat #用 loadmat 读取 mat , mat 是 python 专用格式
inputfile='../data/leleccum.mat'
mat=loadmat (inputfile)
signal=mat['leleccum'][0]
import pywt # 导入 PyWavelets
coeffs=pywt.wavedec(signal, 'bior3.7', level=5)
三、数据归约
数据归约产生更小单保持数据完整性的新数据集。
- 属性归约
寻找最小的属性子集,并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。
方法:
- 合并属性:将一些旧属性合为新属性
- 决策树归纳:利用决策树的归纳方法对初始数据进行分类归纳学习,获得一个初始决策树,所有没有出现在这个决策树上的属性均可认为是无关属性,因此将这些属性从初始集合中删除,就可以获得一个较优的属性子集。(属于直接删除不相关属性(维度)方法)
- 主成分分析:用较少的变量去解释原始数据中的大部分变量(即所谓主成分),即将许多相关性很高的变量转化成彼此相互独立或不相关的变量。(用于连续属性的数据降维)
主成分分析的函数位于 Scikit-Learn 下: sklearn.decomposition.PCA(n_components=None,copy=True,whiten=False)
n_components: PCA 算法中所要保留的主成分个数n, 即保留下来的特征个数 n
copy:是否在运行算法时将原始训练数据复制一份
whiten:使得每个特征具有相同的方差
引入 pandas 和 Scikit-Learn 下的 PCA
计算示例:import pandas as pd
inputfile ='../data/abc.xls'
outputfile ='../tmp/bcd.xls'
data=pd.read_excel(inputfile, index=False)
from sklearn.decomposition import PCA
pca=PCA( )
pca.fit(data)
pca.components #返回模型的各个特征向量
pca.explained_cariance_ratio_ #$返回各个成分各自的方差百分比
- 数值归约
通过选择替代的、较小的数据来减少数据量。
方法:
有参数方法:使用一个模型来评估数据,只需存放参数,不需要存实际数据。包括:回归(线性回归、多元回归)(回归系数可以用最小二乘法求解),对数线性模型。
无参数方法:需要存放实际数据。包括:直方图、聚类、抽样。
小结:
python 主要数据预处理函数:
interpolate:所在扩展库为 Scipy,用于数据插值
使用格式:f=scipy.interpolate.lagrange(x,y)
unique:所在扩展库为 Pandas 和 Numpy,用于去除数据中的重复元素,得到单值元素列表
使用格式:D.unique() #D是一维数据,可以是list、array、Series
isnull:所在扩展库为 Pandas,判断是否空值
notnull:所在扩展库为 Pandas,判断是否非空值。
使用格式:D.isnull() / D.notnull() #D是Series
PCA:所在扩展库为 Scikit-Learn,对指标变量矩阵进行主成分分析。
使用格式:model=PCA()
random:所在扩展库为Numpy,生成随机矩阵。
使用格式:np.random.rand(k,m,n,...) 生成一个 k×m×n×...随机矩阵,其元素均匀分布在区间(0,1)上
np.random.randn(k,m,n,...) 生成一个 k×m×n×...随机矩阵,其元素服从标准正态分布
注:本文属于学习总结笔记,大部分知识来源于书本和网络,非原创。