数据分析(7)-挖掘建模#分类模型特征
2018-03-15 15:48
567 查看
python 分类预测模型特点
1 聚类分析
(1)K-Means聚类算法
-数据类型与相似性的度量
对于连续属性,通常将其进行零-均值规范,再进行距离计算
度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离等
--针对文档数据
将文档数据整理成文档-词矩阵格式,相似度为:
-目标函数
使用误差平方与SSE作为度量聚类质量的目标函数,选择聚类结果最小的
#K为聚类簇的个数;ei为簇Ei的聚类中心;Ei为第i个簇;ni为第i个簇的样本数;x为对象样本
K-Means聚类算法
-聚类分析评价
(1)purity评价法
(2)RI评价法
(3)F值评价法
-聚类的可视化工具TSNE
该工具能将数据降维,并在2维或3维的空间中展示出来
用TSNE进行数据降维并展示聚类结果
--Apriori算法
均认为小的频繁项集满足阀值,将使得大的频繁项集也具备满足阀值的条件
--时间序列的预处理
首先对序列进行纯随机性、平稳性检测或者非平稳性检测,如果属于纯随机性序列则直接放弃
--平稳性检测
对于X随机性变量,我们计算它的均值与方差;对于X与Y随机变量,我们可以计算其协方差与相关系数,它们度量
两类变量间的联系
对于时间序列下的X随机变量,可以定义序列{Xt}的自协方差函数与自相关系数(衡量同一时间在不同时期的相关度)
,若自协方差函数与自相关系数相等,则为平稳序列
(1)时序图检测
根据时间序列的均值与方差都为常数,在某一常数附近随机波动,且波动范围有限,则为稳定
(2)自相关图检测
平稳序列具有短期相关性,离的越近对现时值影响越大,随着延迟期数k值的增加,平稳序列的相关系数ρk会较快的衰减,并接近零
(3)单位根检验
检验序列中是否存在单位根
--平稳时间序列分析
(1)AR模型
重点!自相关系数,平稳AR(p)公式为:
该值呈指数的速度衰减,始终有非零取值,不会在k大于某个常数之后就恒等于零,这就是自相关系数pk具有拖尾性
(2)MA模型
(3)ARMA模型
--平稳时间序列建模
(1)计算自相关系数与偏自相关系数
(2)选择合适的模型AR、MA或者ARMA模型
(3)估计模型中未知参数的值并进行参数检验
(4)模型检验
(5)模型优化
(6)模型应用:进行短期预测
-非平稳时间序列分析
对平稳时间序列分析方法可以分为1确定性元素分解的时序分析和2随机时序分析
前者把所有序列变化归结于长期趋势、季节变动、循环变动和随机波动,其中随机波动难以确定和分析
(1)差分运算
p阶差分即相距一期的两个序列值之间的减法运算称为1阶差分运算
k步差分即相距k期的两个序列之间的减法运算称为k步差分运算
(2)ARIMA模型
-离散群点检测
通常可以检测一些异常行为
--离群点检测方法
--基于模型的离群点检测方法
(1)一元正态分布中的离群点检测方法
(2)混合模型的离散群检测
--基于聚类的离散群点检测
诊断步骤如下:
(1)进行聚类,选取聚类算法,将样本集聚为K簇
(2)计算各对象到它的最近质心的距离
(3)计算各对象到它的最近质心的相对距离
(4)与给定的阀值作比较
1 聚类分析
(1)K-Means聚类算法
-数据类型与相似性的度量
对于连续属性,通常将其进行零-均值规范,再进行距离计算
度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离等
--针对文档数据
将文档数据整理成文档-词矩阵格式,相似度为:
-目标函数
使用误差平方与SSE作为度量聚类质量的目标函数,选择聚类结果最小的
#K为聚类簇的个数;ei为簇Ei的聚类中心;Ei为第i个簇;ni为第i个簇的样本数;x为对象样本
K-Means聚类算法
import pandas as pd inputfile='./data/consumption_data.xls' outputfile='./tmp/data_type.xls' k=3 iteration=50 data=pd.read_excel(inputfile,index_col='Id') data_zs=1.0*(data-data.mean())/data.std()#数据标准化 from sklearn.cluster import KMeans model=KMeans(n_clusters=k,n_jobs=1,max_iter=iteration)#分为k类,并发数1 model.fit(data_zs)#开始聚类 #简单打印结果 r1=pd.Series(model.labels_).value_counts()#统计各个类别的数目 r2=pd.DataFrame(model.cluster_centers_)#找出聚类中心 r=pd.concat([r2,r1],axis=1)#横向连接 r.columns=list(data.columns)+[u'聚类类别']#重命名表头 print(r) #详细输出原始数据及其类别 r=pd.concat([data,pd.DataFrame(model.labels_,index=data.index)],axis=1) #输出每个样本对应的类别 r.columns=list(data.columns)+[u'聚类类别'] r.to_excel(outputfile) #概率图的绘制,DataFrame数据可以直接使用plt def density_plot(data): import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False p=data.plot(kind='kde',linewidth=2,subplots=True,sharex=False) [p[i].set_ylabel(u'密度') for i in range(k)] plt.legend() return plt pic_output='./tmp/pd_' for i in range(k): density_plot(data[r[u'聚类类别']==i]).savefig(u'%s%s.png'%(pic_output,i))
-聚类分析评价
(1)purity评价法
(2)RI评价法
(3)F值评价法
-聚类的可视化工具TSNE
该工具能将数据降维,并在2维或3维的空间中展示出来
用TSNE进行数据降维并展示聚类结果
from sklearn.manifold import TSNE tsne = TSNE() tsne.fit_transform(data_zs) #进行数据降维 tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #转换数据格式 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 #不同类别用不同颜色和样式绘图 d = tsne[r[u'聚类类别'] == 0] plt.plot(d[0], d[1], 'r.') d = tsne[r[u'聚类类别'] == 1] plt.plot(d[0], d[1], 'go') d = tsne[r[u'聚类类别'] == 2] plt.plot(d[0], d[1], 'b*') plt.show()-关联规则
--Apriori算法
均认为小的频繁项集满足阀值,将使得大的频繁项集也具备满足阀值的条件
Apriori算法
from __future__ import print_function import pandas as pd #自定义连接函数,用于实现L_{k-1}到C_k的连接 def connect_string(x, ms):# c219 ms为连接符号,x为组合 x = list(map(lambda i:sorted(i.split(ms)), x)) l = len(x[0]) r = [] for i in range(len(x)): for j in range(i,len(x)): if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]: r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]])) return r #寻找关联规则的函数 def find_rule(d, support, confidence, ms = u'--'): result = pd.DataFrame(index=['support', 'confidence']) #定义输出结果 support_series = 1.0*d.sum()/len(d) #支持度序列 column = list(support_series[support_series > support].index) #初步根据支持度筛选 k = 0 while len(column) > 1: k = k+1 print(u'\n正在进行第%s次搜索...' %k) column = connect_string(column, ms) print(u'数目:%s...' %len(column)) sf = lambda i: d[i].prod(axis=1, numeric_only = True) #新一批支持度的计算函数 #创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。 d_2 = pd.DataFrame(list(map(sf,column)), index = [ms.join(i) for i in column]).T support_series_2 = 1.0*d_2[[ms.join(i) for i in column]].sum()/len(d) #计算连接后的支持度 column = list(support_series_2[support_series_2 > support].index) #新一轮支持度筛选 support_series = support_series.append(support_series_2)#support_series中元素为字典 column2 = [] for i in column: #遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B? i = i.split(ms) for j in range(len(i)): column2.append(i[:j]+i[j+1:]+i[j:j+1]) cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) #定义置信度序列 for i in column2: #计算置信度序列 cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))]/support_series[ms.join(i[:len(i)-1])] for i in cofidence_series[cofidence_series > confidence].index: #置信度筛选 result[i] = 0.0 result[i]['confidence'] = cofidence_series[i] result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))] result = result.T.sort_values(['confidence','support'], ascending = False) #结果整理,输出 print(u'\n结果为:') print(result) return result-时间序列
--时间序列的预处理
首先对序列进行纯随机性、平稳性检测或者非平稳性检测,如果属于纯随机性序列则直接放弃
--平稳性检测
对于X随机性变量,我们计算它的均值与方差;对于X与Y随机变量,我们可以计算其协方差与相关系数,它们度量
两类变量间的联系
对于时间序列下的X随机变量,可以定义序列{Xt}的自协方差函数与自相关系数(衡量同一时间在不同时期的相关度)
,若自协方差函数与自相关系数相等,则为平稳序列
(1)时序图检测
根据时间序列的均值与方差都为常数,在某一常数附近随机波动,且波动范围有限,则为稳定
(2)自相关图检测
平稳序列具有短期相关性,离的越近对现时值影响越大,随着延迟期数k值的增加,平稳序列的相关系数ρk会较快的衰减,并接近零
(3)单位根检验
检验序列中是否存在单位根
--平稳时间序列分析
(1)AR模型
统计量 | 性质 | 统计量 | 性质 |
均值 | 常数均值 | 自相关系数 | 拖尾 |
方差 | 常数方差 | 偏自相关系数 | p阶截尾 |
该值呈指数的速度衰减,始终有非零取值,不会在k大于某个常数之后就恒等于零,这就是自相关系数pk具有拖尾性
(2)MA模型
(3)ARMA模型
--平稳时间序列建模
(1)计算自相关系数与偏自相关系数
(2)选择合适的模型AR、MA或者ARMA模型
(3)估计模型中未知参数的值并进行参数检验
(4)模型检验
(5)模型优化
(6)模型应用:进行短期预测
-非平稳时间序列分析
对平稳时间序列分析方法可以分为1确定性元素分解的时序分析和2随机时序分析
前者把所有序列变化归结于长期趋势、季节变动、循环变动和随机波动,其中随机波动难以确定和分析
(1)差分运算
p阶差分即相距一期的两个序列值之间的减法运算称为1阶差分运算
k步差分即相距k期的两个序列之间的减法运算称为k步差分运算
(2)ARIMA模型
ARIMA模型实现算法
#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式 data = pd.read_excel(discfile, index_col = u'日期') #时序图 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 data.plot() plt.show() #自相关图 from statsmodels.graphics.tsaplots import plot_acf plot_acf(data).show() #平稳性检测 from statsmodels.tsa.stattools import adfuller as ADF print(u'原始序列的ADF检验结果为:', ADF(data[u'销量'])) #返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore #差分后的结果 D_data = data.diff().dropna() D_data.columns = [u'销量差分'] D_data.plot() #时序图 plt.show() plot_acf(D_data).show() #自相关图 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data).show() #偏自相关图 print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测 #白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值 from statsmodels.tsa.arima_model import ARIMA data[u'销量'] = data[u'销量'].astype(float) #定阶 pmax = int(len(D_data)/10) #一般阶数不超过length/10 qmax = int(len(D_data)/10) #一般阶数不超过length/10 bic_matrix = [] #bic矩阵 for p in range(pmax+1): tmp = [] for q in range(qmax+1): try: #存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data, (p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值 p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。 print(u'BIC最小的p值和q值为:%s、%s' %(p,q)) model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型 model.summary2() #给出一份模型报告 model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
-离散群点检测
通常可以检测一些异常行为
分类标准 | 分类名称 | 分类描述 |
从数据范围 | 全局离散点 局部离散点 | 从整体来看,某些对象没有离散特征,但是从局部 来看,却显示了一定的离群性,如下图,C为全局 离散点,D为局部离散点 |
从数据类型 | 数值型离散点 分类型离散点 | 以数据集的属性类型进行划分 |
从属性个数 | 一维离散点 多维离散点 | 一个对象可能有一个或多个属性 |
--离群点检测方法
--基于模型的离群点检测方法
(1)一元正态分布中的离群点检测方法
(2)混合模型的离散群检测
--基于聚类的离散群点检测
诊断步骤如下:
(1)进行聚类,选取聚类算法,将样本集聚为K簇
(2)计算各对象到它的最近质心的距离
(3)计算各对象到它的最近质心的相对距离
(4)与给定的阀值作比较
K-Means实现算法
# -*- coding: utf-8 -*- """ Created on Thu Mar 15 15:25:48 2018 @author: Administrator """ #使用K-Means算法聚类消费行为的特征数据 import numpy as np import pandas as pd inputfile = './data/consumption_data.xls' #销量及其他属性数据 k = 3 #聚类的类别 threshold = 2 #离散点阈值 iteration = 500 #聚类最大循环次数 data = pd.read_excel(inputfile, index_col = 'Id') #读取数据 data_zs = 1.0*(data - data.mean())/data.std() #数据标准化 from sklearn.cluster import KMeans model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分为k类,并发数4 model.fit(data_zs) #开始聚类 #标准化数据及其类别 r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis = 1) #每个样本对应的类别 r.columns = list(data.columns) + [u'聚类类别'] #重命名表头 norm=[] for i in range(k): norm_tmp=r[['R','F','M']][r[u'聚类类别']==i]-model.cluster_centers_[i] norm_tmp=norm_tmp.apply(np.linalg.norm,axis=1)#按行来求绝对距离 norm.append(norm_tmp/norm_tmp.median())#求相对距离并添加 norm = pd.concat(norm) #合并 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 norm[norm <= threshold].plot(style = 'go') #正常点 discrete_points = norm[norm > threshold] #离群点 discrete_points.plot(style = 'ro') for i in range(len(discrete_points)): #离群点做标记 id = discrete_points.index[i] n = discrete_points.iloc[i] plt.annotate('(%s, %0.2f)'%(id, n), xy = (id, n), xytext = (id, n)) plt.xlabel(u'编号') plt.ylabel(u'相对距离') plt.show()
相关文章推荐
- 【大数据部落】WEKA文本挖掘分析垃圾邮件分类模型
- 数据挖掘--分类--决策树--特征
- KNIMI数据挖掘建模与分析系列_002_利用KNIMI做商超零售关联推荐
- Python数据挖掘建模 chapter_6 主成分分析(简)
- KNIMI数据挖掘建模与分析系列_003_利用KNIMI做客户细分
- KNIMI数据挖掘建模与分析系列_001_利用KNIMI做演员关系网络分析
- 数据挖掘应用案例:RFM模型分析与客户细分(转)
- 数据挖掘-K-近邻分类器-Iris数据集分析-PCA降维处理后显示分类情况(三)
- KNIMI数据挖掘建模与分析系列_004_利用KNIMI做客户流失预测
- 数据挖掘应用案例:RFM模型分析与客户细分(转)
- 微博特征与行为的大数据挖掘分析
- 『Python数据分析与挖掘实战』第五章:挖掘建模
- 使用Weka进行数据挖掘(Weka教程八)Weka分类评价Evaluation输出分析
- Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据
- 数据挖掘应用案例:RFM模型分析与客户细分(未完成)
- 案例2:数据挖掘---BP神经网络的数据分类—语音特征信号分类
- 【数据分析】挖掘建模-分析与预测
- 数据挖掘-K-近邻分类器-Iris数据集分析-使用K-近邻分类器进行分类预测(四)
- 数据分析、数据挖掘之特征分解、特征分析
- [session] 多视图建模与半监督学习:应用于海量用户数据挖掘与行为分析