数据清洗
目的:删除原始数据集中的无关数据、重复数据、平滑噪声数据、筛选掉与挖掘主题无关的数据、处理缺失值、异常值等
缺失值处理方法:删除记录、数据插补和不处理
拉格朗日插值法:对于平面上已知的N个点(无两点在一条直线上)可以找到一个N-1次多项式y=a0+a1x+…+an-1x^n-1,使此多项式曲线过这n个点
代码实现:
import pandas as pd
from scipy.interpolate import lagrange
inputfile = '../data/catering_sale.xls' # 销量数据路径
outputfile = '../tmp/sales.xls' # 输出数据路径
data = pd.read_excel(inputfile) # 读入数据
row_indexs = (data[u'销量'] < 400) | (data[u'销量'] > 5000) #异常值
data.loc[row_indexs, u'销量'] = None # 过滤异常值,将其变为空值 loc为Selection by Label函数,即为按标签取数据 index为row_index 销量列的数据
# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
y = s.reindex(list(range(n - k, n)) + list(range(n + 1, n + 1 + k))) # reindex使它符合新的索引,如果索引的值不存在就填入空值,取前五和后五个值来进行插值
y = y[y.notnull()] # 剔除空值
return lagrange(y.index, list(y))(n) # scipy.interpolate.lagrange(x, y),最后的括号就是我们要插值的n
# 逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]: # 如果data中i列的第j个值为null,只有if[True][j]程序才去判断j,False则忽略
data[i, j] = ployinterp_column(data[i], j)
data.to_excel(outputfile) # 输出结果,写入文件
输出:
没有插入空白处,还产生了很多列同样的数据?日期也没正确显示 日后再改
源代码为
data[u’销量’] [(data(u’销量’) < 400) | (data(u’销量’) > 5000)] = None
报错 ‘DataFrame’ object is not callable 改成上面的代码可以正常运行,出现此报错一般是变量名重复。相当于把(data(u’销量’) < 400) 也看作data[u’销量’] ?
异常值处理:
处理方法:删除含有异常值的记录、视为缺失值、平均值修正、不处理
数据集成:
目的:将多个数据源合并存放在一个一致的数据存储中的过程
在数据集成时,来自多个数据源的现实世界实体的表达形式是不一样的,有可能不匹配,要考虑实体识别问题和属性冗余问题,从而将源数据在最底层上加以转换、提炼和集成。
实体识别:
任务是统一不同源数据的矛盾之处
- 同名异义
- 异名同义
- 单位不统一
冗余属性识别:
- 同一属性多次出现
- 同一属性命名不一致导致重复
数据变换
目的:对数据进行规范化处理,将数据转换为“适当的”形式,以适用于挖掘任务及算法的需要。
简单函数变换:
常用来将不具有正态分布的数据变换成具有正态分布的数据
规范化:
- 最大-最小规范化:[min,max]
- 零-均值规范化:经过处理的数据的均值为0,标准差为1
- 小数定标规范化:将属性值映射到[-1,1]
跳过代码 代入公式即可得到
连续属性离散化:
- 等宽法:将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定。
- 等频法:将相同数量的记录放入每个区间
- 基于聚类分析的方法:一维聚类方法包括两个步骤,首先将连续属性的值用聚类算法进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。需要用户指定簇的个数,从而决定产生的区间数
KMeans算法:
1)选取K个点做为初始聚集的簇心(也可选择非样本点);
2) 分别计算每个样本点到 K个簇核心的距离(这里的距离一般取欧氏距离或余弦距离),找到离该点最近的簇核心,将它归属到对应的簇;
3) 所有点都归属到簇之后, M个点就分为了 K个簇。之后重新计算每个簇的重心(平均距离中心,将其定为新的“簇核心”;
4) 反复迭代 2 - 3 步骤,直到达到某个中止条件。
以上三种离散方法代码实现:
参考
https://blog.csdn.net/YUBANGSHUANGYUER/article/details/103981481?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160310149819725271758589%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160310149819725271758589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-103981481.pc_first_rank_v2_rank_v28&utm_term=python%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E6%8C%96%E6%8E%98%E5%AE%9E%E6%88%98+4-3&spm=1018.2118.3001.4187
代码顺利运行:
#-*- 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)] #列表解析 将1.0*i/k 放入w列表 即为w=[0.0 0.25 0.5 0.75 1.0]
w = data.describe(percentiles = w)[4:4+k+1] #前面是取几个分位数的值作为不等长列表,[4:4+k+1]没懂代表什么意思
w[0] = w[0]*(1-1e-10) #这个也没懂
#w是区间 可以自己指定 w=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
#d2=pd.qcut(data,4,labels = range(k)) 如果是分成4个区间,可以使用qcut函数,4表示按照4分位数进行切割
d2 = pd.cut(data, w, labels = range(k)) #将data数组分成w个,名字为range(k)
from sklearn.cluster import KMeans #采用KMeans算法
kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型选取4个点为初始点,n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data.values.reshape((len(data), 1))) #训练模型.fit()求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序(默认是随机序的)
w = c.rolling(2).mean().iloc[1:] #相邻两项求中点,作为边界点.python中切片不包括偏移值,iloc前闭后开 切片1行的数据
w = [0] + list(w[0]) + [data.max()] #把首末边界点加上 第0行和最大值
d3 = pd.cut(data, w, labels = range(k)) #离散成w区间,名字为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') #x=data[d==j],
plt.ylim(-0.5, k-0.5)
return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()
小波变换:
具有多分辨率的特点,在时域和频域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度聚焦分析,提供了一种非平稳信号的时频分析手段,可以由粗及细地逐步观察信号,从中提取有用信号。
数据规约:
目的:产生更小但保持原数据完整性的新数据集,在规约后的数据集上分析和挖掘更有效率
属性规约:
通过属性合并来创建新属性维数或者直接通过删除不相关的属性来减少数据维数。
常用方法:
- 合并属性
- 逐步向前选择:从空属性集开始,每次从原来属性集合中选择一个当前最优的属性添加到当前属性于集中
- 逐步向后删除:从全属性集开始,每次从属性集中选择一个最差的属性删除
- 决策树归纳:利用决策树的归纳法对初始数据进行分类
- 主成分分析:用较少的变量取解释原始数据中的大部分变量,即将许多相关性很高的变量转化成彼此相互独立或不相关的变量
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_ #返回模型的各个特征向量
#降维
#low_d = pca.transform(data)
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
主成分分析的函数:
sklearn.decomposition.PCA(n_components = None, copy = True, whiten = False)
n_components:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n,缺省默认为None,所有成分被保留,赋值为Int。
copy:将原始数据复制一份
whiten:白化,使得每个特征具有相同的方差
特征值对应的特征向量就是理想中想取得正确的坐标轴,而特征值就等于数据在旋转之后的坐标上对应维度上的方差。
通常经过特征向量变换下的数据被称为变量的主成分,当前m个主成分累计的方差贡献率达到一个较高的百分数(如85%以上)的话,就保留着这m个主成分的数据。实现了对数据进行降维的目的。
从上面的结果可以得到特征方程有7个特征根
?
数值规约:
目的通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。
有参数方法:使用模型来评估数据,只需存放参数,而不需要存放实际数据
- 回归
- 对数线性模型
无参数方法:需要存放实际数据
- 直方图
- 聚类
- 抽样
- 参数回归