挖掘建模根据挖掘目标和数据形式可创建:分类与预测、聚类分析、关联规则、时序模式、误差检测等模型算法
分类与预测是预测问题的两种主要类型,分类主要是:预测分类标号(离散属性);预测主要是:创建连续值函数模型,预测给定自变量对应的因变量的值。网络
(1)分类并发
分类是构造一个分类模型,输入样本属性值,输出对应类别,将每一个样本映射到预先定义好的类别。app
分类模型,创建在已有类标记的数据集上,所以,属于“有监督学习”dom
(2)预测ide
预测,指创建两种或两种以上变量间相互依赖的函数模型,进行预测或控制函数
(3)实现过程工具
分类算法:性能
a:学习步,经过概括分析训练样本集创建分类模型获得分类规则;学习
b:分类步,先用已知的测试样本集,评估分类规则的准确率
预测模型:
a:经过训练集创建预测属性的函数模型
b:在模型经过检验后进行预测或控制
算法名称 | 算法描述 |
回归分析 | 回归分析,肯定预测属性与其余变量间相互依赖的定量关系。包括:线性回归、非线性回归、Logistic回归、岭回归、主成分回归、偏最小二乘回归等模型 |
决策树 | 决策树采用自顶向下的递归方式,在内部节点进行属性值比较,并根据不一样的属性值从该节点向下分支,最终获得的叶节点是学习划分的类 |
人工神经网络 | 人工神经网络是一种模仿大脑神经网络结构和功能而创建的信息处理系统,表示神经网络的输入与输出变量之间关系的模型 |
贝叶斯网络 | 贝叶斯网络又称信度网络,是Bayes方法的扩展,是目前不肯定知识表达和推理领域最有效的理论模型之一 |
支持向量机 | 支持向量机是一种经过某种非线性映射,把低维的非线性可分转化为高维的线性可分,在高维空间进行线性分析的算法 |
回归模型名称 | 适用条件 | 算法描述 |
线性回归 | 因变量与自变量是线性关系 | 对一个或多个自变量和因变量间的线性关系进行建模,可用最小二乘法求解模型系数 |
非线性回归 | 因变量与自变量间不都是线性关系 | 对一个或多个自变量和因变量间的非线性关系进行建模。若非线性关系可经过简单的函数变换转化成线性关系,用线性回归的思想求解,若不能转化,用非线性最小二乘法求解 |
Logistic回归 | 因变量通常有1和0(是、否)两种取值 | 广义线性回归模型的特例,利用Logistic函数将因变量的取值范围控制在0、1之间,表示取值为1的几率 |
岭回归 | 参与建模的自变量间具备多重共线性 | 是一种改进最小二乘估计的方法 |
主成分回归 | 参与建模的自变量间具备多重共线性 | 主成分回归是根据主成分分析的思想提出的,是对最小二乘法的改进,它是参数估计的一种有偏估计。可消除自变量间的多重共线性 |
Logistic回归建模步骤:
(1)根据分析目的设置指标变量(因变量和自变量),收集数据,根据收集到的数据,对特征(y,x1,x2....xp)进行筛选
(2)y=1时,几率p=P(y=1|X);y=0,几率为1-p。用In(p/(1-p))和自变量列出线性回归方程:In(p/(1-p))=β0+β1x1+.....+βpxp+ε
(3)估计回归系数
(4)进行模型检验
(5)模型应用:输入自变量的取值,获得预测变量的值或根据获得预测变量的值取控制自变量的取值
利用Scikit-Learn逻辑回归分析步骤:
首先,进行特征筛选,
特征筛选方法:
a:经过F检验给出各个特征的F值和p值,筛选变量(选择F值大或p值小的特征);
b:递归特征消除:主要思想是反复构建模型,选出最好的(最差的)特征(可根据系数来选),将选出的特征放在一边,在剩余的特征里重复这个过程,直至遍历全部特征。
该过程当中特征被消除的次序便是:特征的排序。所以,也是一种寻找最优特征子集的贪心算法。
c:稳定性:一种基于二次抽样和选择算法相结合较新的方法,主要思想是:在不一样的数据子集和特征的子集上运行特征选择算法,不断重复,最终汇总特征选择结果。
而后,利用筛选后的特征创建逻辑回归模型,输出平均正确率
#-*- coding: utf-8 -*- #逻辑回归 自动建模 import pandas as pd #参数初始化 filename = '../data/bankloan.xls' data = pd.read_excel(filename) x = data.iloc[:,:8].as_matrix() y = data.iloc[:,8].as_matrix() from sklearn.linear_model import LogisticRegression as LR from sklearn.linear_model import RandomizedLogisticRegression as RLR rlr = RLR() #创建随机逻辑回归模型,筛选变量 rlr.fit(x, y) #训练模型 rlr.get_support() #获取特征筛选结果,也能够经过.scores_方法获取各个特征的分数 print(u'经过随机逻辑回归模型筛选特征结束。') print(u'有效特征为:%s' % ','.join(data.columns[rlr.get_support()])) x = data[data.columns[rlr.get_support()]].as_matrix() #筛选好特征 lr = LR() #创建逻辑货柜模型 lr.fit(x, y) #用筛选后的特征数据来训练模型 print(u'逻辑回归模型训练结束。') print(u'模型的平均正确率为:%s' % lr.score(x, y)) #给出模型的平均正确率,本例为81.4%
决策树是一种树状结构,它的每个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性不一样取值将其划分为若干个子集。
决策树构造的核心问题:在每一步如何选择适当的属性对样本作拆分。
决策树处理过程:对分类问题,应从已知类标记的训练样本中学习并构造出决策树,自上而下,分开进行解决。
决策树算法 | 算法描述 |
ID3算法 | 核心:在决策树的各级节点上,使用信息增益方法做为属性的选择标准,来帮助肯定生成每一个节点时所应采用的合适属性。 |
C4.5算法 | C4.5决策树生成算法相对于ID3算法的重要改进:使用信息增益率来选择节点属性。C4.5可客服ID3算法的不足:ID3算法只适用于离散的描述属性,而C4.5算法既能处理离散的描述属性,也可处理连续的描述属性 |
CART算法 | CART决策树是一种非参数分类和回归方法,经过构建树、修剪树、评估树来构造一个二叉树。当终结点是连续变量时,该树为回归树;当终结点是分类变量,该树为分类树 |
ID3算法原理:
ID3算法流程:
(1)对当前样本集合,计算全部属性的信息增益;
(2)选择信息增益最大的属性做为测试属性,把测试属性取值相同的样本划分为同一个子样本集;
(3)若子样本集的类别属性只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,而后返回调用处;不然对子样本集递归调用本算法。
#-*- coding: utf-8 -*- #使用ID3决策树算法预测销量高低 import pandas as pd #参数初始化 inputfile = '../data/sales_data.xls' data = pd.read_excel(inputfile, index_col = u'序号') #导入数据 #数据是类别标签,要将它转换为数据 #用1来表示“好”、“是”、“高”这三个属性,用-1来表示“坏”、“否”、“低” data[data == u'好'] = 1 data[data == u'是'] = 1 data[data == u'高'] = 1 data[data != 1] = -1 x = data.iloc[:,:3].as_matrix().astype(int) y = data.iloc[:,3].as_matrix().astype(int) from sklearn.tree import DecisionTreeClassifier as DTC dtc = DTC(criterion='entropy') #创建决策树模型,基于信息熵 dtc.fit(x, y) #训练模型 #导入相关函数,可视化决策树。 #导出的结果是一个dot文件,须要安装Graphviz才能将它转换为pdf或png等格式。 from sklearn.tree import export_graphviz x = pd.DataFrame(x) from sklearn.externals.six import StringIO x = pd.DataFrame(x) with open("tree.dot", 'w') as f: f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
人工神经网络:模拟生物神经网络进行信息处理的一种数学模型。
人工神经网络的学习也称为训练,指的是:神经网络在受到外部环境的刺激下调整神经网络的参数,使神经网络以一种新的方式对外部环境作出反应的一个过程。
分类预测时,人工神经网络主要使用有指导的学习方式,即根据给定的训练样本调整人工神经网络参数使网络输出接近于已知的样本类标记或其余形式的因变量。
分类预测时,经常使用的算法是:偏差校订学习算法
偏差校订算法,根据神经网络的输出偏差对神经元的链接强度进行修正,属于有指导学习。
设神经网络中神经元i做为输入,神经元j为输出神经元,它们的链接权值为wij,则对权值的修正为△wij=ηδjYi,其中η为学习率,δj=Tj-Yj为j的误差,即输出神经元j的实际输出和教师信号之差。
神经网络训练是否完成经过偏差函数E衡量。当偏差函数小于某个设定值时,中止神经网络训练。
偏差函数计算:
,N为训练样本个数。
人工神经网络算法
算法名称 | 算法描述 |
BP神经网络 | 一种按偏差逆传播算法训练的多层前馈网络,学习算法是:偏差校订学习算法 |
LM神经网络 | 基于梯度降低法和牛顿法结合的多层前馈网络,特色 :迭代次数少,收敛速度快,精确度高 |
RBF径向基神经网络 | RBF网络能以任何精度逼近任意连续函数,从输入层到隐含层的变换是非线性的,而从隐含层到输出层的变换是线性的,适用于解决分类问题 |
FNN模糊神经网络 | FNN是具备模糊权系数或输入信号是模糊量的神经网络 |
GMDH神经网络 | GMDH是前馈神经网络中经常使用的一种用于预测的神经网络。它的特色:网络结构不固定,在训练中不断改变 |
ANFIS自适应神经网络 | 神经网络嵌在一个所有模糊的结构中,不知不觉中向训练数据学习,自动产生、修正并高度归纳出最佳的输入与输出变量的隶属函数及模糊规则 |
BP算法
BP算法的学习过程由:信号的正向传播及偏差的逆向传播组成。
正向传播时,输入信号通过隐层的处理,传向输出层。
若输出层节点未能获得指望的输出,则转入偏差的逆向传播。
逆向传播时,将输出偏差按某种子形式,经过隐层向输出层返回,并分摊给隐层的节点与输入层节点,得到各层单元的参考偏差,做为修改各单元权值的依据。
信号正向及逆向传播周而复始,不断修改权值,即神经网络的训练过程。
算法开始时,给定学习次数上限,初始化学习次数为0,对权值和阙值赋予小的随机数,通常在[-1,1]。
输入样本数据,网络正向传播,获得中间层与输出层的值,比较输出层的值与教师信号的偏差,用偏差函数判断偏差是否小于偏差上限。
若不小于偏差上限,则对中间层和输出层权值和阙值进行更新
更新权值和阙值后,再次将样本数据做为输入,重复计算偏差E。
算法结束两条依据:达到学习次数货偏差达到预期
#-*- coding: utf-8 -*- #使用神经网络算法预测销量高低 import pandas as pd #参数初始化 inputfile = '../data/sales_data.xls' data = pd.read_excel(inputfile, index_col = u'序号') #导入数据 #数据是类别标签,要将它转换为数据 #用1来表示“好”、“是”、“高”这三个属性,用0来表示“坏”、“否”、“低” data[data == u'好'] = 1 data[data == u'是'] = 1 data[data == u'高'] = 1 data[data != 1] = 0 x = data.iloc[:,:3].as_matrix().astype(int) y = data.iloc[:,3].as_matrix().astype(int) from keras.models import Sequential from keras.layers.core import Dense, Activation model = Sequential() #创建模型 model.add(Dense(input_dim = 3, output_dim = 10)) model.add(Activation('relu')) #用relu函数做为激活函数,可以大幅提供准确度 model.add(Dense(input_dim = 10, output_dim = 1)) model.add(Activation('sigmoid')) #因为是0-1输出,用sigmoid函数做为激活函数 model.compile(loss = 'binary_crossentropy', optimizer = 'adam', class_mode = 'binary') #编译模型。因为咱们作的是二元分类,因此咱们指定损失函数为binary_crossentropy,以及模式为binary #另外常见的损失函数还有mean_squared_error、categorical_crossentropy等,请阅读帮助文件。 #求解方法咱们指定用adam,还有sgd、rmsprop等可选 model.fit(x, y, nb_epoch = 1000, batch_size = 10) #训练模型,学习一千次 yp = model.predict_classes(x).reshape(len(y)) #分类预测 from cm_plot import * #导入自行编写的混淆矩阵可视化函数 cm_plot(y,yp).show() #显示混淆矩阵可视化结果
分类与预测模型对训练集进行预测,获得的准确率,不能很好的反映预测模型将来的性能
为有效判断一个预测模型的性能表现,需一组没有参与预测模型创建的数据集,并在该数据集上评价预测模型的准确率,这组独立的数据集叫测试集。
模型预测效果评价指标:
(1)绝对偏差E与相对偏差e
(2)平均绝对偏差MAE
(3)均方偏差MSE
(4)均方根偏差RMSE
(5)平均绝对百分偏差MAPE(通常认为MAPE小于10时,预测精度较高)
(6)Kappa统计
Kappa统计是比较两个或多个观测者对同一事物,或观测者对同一事物的两次或屡次观测结果是否一致。Kappa统计量和加权Kappa统计量不只能够用于无序和有序分类变量资料的一致性,重现性检验。
Kappa取值在[-1,+1]间时:
Kappa=+1,说明两次判断结果彻底一致;
Kappa=-1,说明两次判断结果彻底不一致
Kappa<0,说明一致程度比机遇形成的还差,两次结果很不一致,在实际应用中毫无心义
Kappa>0,说明有意义,Kappa越大,说明一致性越好
Kappa≥0.75,说明已经取得至关满意的一致程度
Kappa<0,说明一致程度不够
(7)识别准确度Accuracy
Accuracy=(TP+FN)/(TP+TN+FP+FN)
TP为正确的确定表示正确确定的分类数,TN为正确的否认表示正确否认的分类数;
FP为错误的确定表示错误确定的分类数,FN为错误的否认表示错误否认的分类数。
(8)识别精确率Precision
Precision=TP/(TP+FP)
(9)反馈率Recall
Recall=TP/(TP+TN)
(10)ROC曲线
(11)混淆矩阵
模型 | 模型特色 | 位置 |
逻辑回归 | 较基础的线性分类模型 | sklearn.linear_model |
SVM | 可用来回归、预测、分类等,根据选取不一样的核函数。模型能够是线性的/非线性的 | sklearn.svm |
决策树 | 基于“分类讨论、逐步细化”思想的分类模型,模型直观 | sklearn.tree |
随机森林 | 思想跟决策树相似,精度一般比决策树要高,缺点是因为其随机性,丧失了决策树的可解释性 | sklearn.ensemble |
朴素贝叶斯 | 基于几率思想的简单有效的分类模型,能给出容易理解的几率解释 | sklearn.naive_bayes |
神经网络 | 具备强大的拟合能力,可用于拟合、分类等,它有不少个加强版本 | Keras |
聚类分析是在没有给定划分类别的状况下,根据数据类似度进行样本分组的一种方法。
聚类模型创建在无类标记的数据上,是一种非监督的学习算法。
聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或类似度将其划分为若干组,划分原则是:组内距离最小化而组间距离最大化。
经常使用聚类方法:
类别 | 包括的主要算法 |
划分(分裂)方法 | K-Means算法(K-平均)、K-MEDOIDS算法(K-中心点)、CLARANS算法(基于选择的算法) |
层次分析方法 | BIRCH算法(平衡迭代规约和聚类)、CURE算法(表明点聚类)、CHAMELEON算法(动态模型) |
基于密度的方法 | DBSCAN算法(基于高密度链接区域)、DENCLUE算法(密度分布函数)、OPTICS算法(对象排序识别) |
基于网格的方法 | STING算法(统计信息网络)、CLIOUE算法(聚类高维空间)、WAVE-CLUSTER算法(小波变换) |
基于模型的方法 | 统计学方法、神经网络方法 |
经常使用聚类算法:
算法名称 | 算法描述 |
K-Means | K-均值聚类(快速聚类发),在最小化偏差函数的基础上将数据划分为预约的类数K。该算法原理简单便于处理大量数据。 |
K-中心点 | K-均值算法对孤立点的敏感性,K-中心点算法不采用簇中对象的平均值做为簇中心,选用簇中离平均值最近的对象做为簇中心。 |
系统聚类 | 系统聚类也称多层次聚类,分类的单位由高到低呈树形结构,且处位置越低,其包含的对象就越少,但这些对象间的共同特征越多。该聚类方法只适合小数量的时使用,数据量大时速度会很是慢。 |
http://blog.csdn.net/qq_36663613/article/details/72784444
K-Means算法是典型的基于距离的非层次聚类算法,在最小化偏差函数的基础上将数据划分为预约的类数K,采用距离做为类似性评价指标,即认为两个对象的距离越近,其类似度越大。
(1)算法过程
a:从N个样本数据中随机选取K个对象做为初始的聚类中心;
b:分别计算每一个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中;
c:全部对象分类完成后,从新计算K个聚类的中心;
d:与前一次计算获得的K个聚类中心比较,若聚类中心发生变化,转过程2,不然,转过程5;
e:当质心不发生变化时,中止并输出聚类结果。
(2)数据类型与类似性变量
连续属性,先对各属性值进行零——均值规范,再进行距离计算。K-Means算法,通常需先度量样本间(欧几里得距离、曼哈顿距离、闵可夫斯距离) ,样本与簇间(样本到簇中心的距离)及簇与簇间距离(簇中心距离 )。
文档数据,使用余弦类似性度量,先将文档数据整理成文档——词矩阵格式,再计算类似性
(3)目标函数
使用偏差平方和SSE做为度量聚类质量的目标函数,对两种不一样的聚类结果,选择偏差平方和较小的分类结果。
连续属性的SSE
文档数据的SSE
簇Ei的聚类中心ei
#-*- coding: utf-8 -*- #使用K-Means算法聚类消费行为特征数据 import pandas as pd #参数初始化 inputfile = '../data/consumption_data.xls' #销量及其余属性数据 outputfile = '../tmp/data_type.xls' #保存结果的文件名 k = 3 #聚类的类别 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 = 4, max_iter = iteration) #分为k类,并发数4 model.fit(data_zs) #开始聚类 #简单打印结果 r1 = pd.Series(model.labels_).value_counts() #统计各个类别的数目 r2 = pd.DataFrame(model.cluster_centers_) #找出聚类中心 r = pd.concat([r2, r1], axis = 1) #横向链接(0是纵向),获得聚类中心对应的类别下的数目 r.columns = list(data.columns) + [u'类别数目'] #重命名表头 print(r) #详细输出原始数据及其类别 r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) #详细输出每一个样本对应的类别 r.columns = list(data.columns) + [u'聚类类别'] #重命名表头 r.to_excel(outputfile) #保存结果 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评价法【计算正确聚类数占总数的比例】
xk表示第k个聚类的组合,x是聚类的集合,y表示须要被聚类的集合,yi表示第i个对象,n表示被聚类集合对象总数。
(2)RI评价法【排列组合原理对聚类进行评价】
R表示应该被聚在一类的两个对象被正确分类,W表示不该该被聚在一类的两个对象被正确分类,M表示不该该聚在一类的对象被错误归在一类,D表示不该该分开对象被错误分开
(3)F值评价法【RI方法衍生】
对象名 | 函数功能 | 所属工具箱 |
K-Means | K均值聚类 | sklearn.cluster |
AffinityPropagation | 吸引力传播聚类(运行效率较低) | sklearn.cluster |
MeanShift | 均值漂移聚类算法 | sklearn.cluster |
SpectralClustering | 谱聚类(效果比K均值好,速度比K均值快) | sklearn.cluster |
AgglomerativeClusering | 层次聚类 | sklearn.cluster |
DBSCAN | 具备噪声的基于密度的聚类方法 | sklearn.cluster |
BIRCH | 综合层次聚类算法,适用于大规模数据聚类 | sklearn.cluster |
TSNE:聚类结果可视化工具
#-*- coding: utf-8 -*- #接k_means.py 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()
关联规则目的:在一个数据集中,找出各项之间的关联关系。
算法名称 | 算法描述 |
Aprior | 关联规则是最经常使用的挖掘频繁项集的算法,核心是经过链接产生候选项及其支持度而后经过剪枝生成频繁项集 |
FP-Tree | 针对Aprior算法的固有的屡次扫描事务数据集的缺陷,提出不产生候选频繁项集的方法。Aprior和FP-Tree都是寻找频繁项集的算法。 |
Eclat算法 | Eclat算法是一种深度优先算法,采用垂直数据表示形式,在概念格理论基础上利用基于前缀的等价关系将搜索空间划分为较小的子空间 |
灰色关联法 | 分析和肯定各因素间影响程度或是若干个子因素(子序列)对主因素(母序列)的贡献度而进行的一种分析方法 |
A:关联规则的通常形式:
项集A、B同时发生的几率称为关联规则的支持度
项集A发生,则项集B发生的几率为关联规则的置信度
B:最小支持度和最小置信度
最小支持度:衡量支持度的一个阙值,表示项目集在统计意义上的最低重要性
最小置信度:衡量置信度的一个阙值,表示关联规则的最低可靠性
同时知足最小支持度阙值和最小置信度阙值的规则称为强规则
C:项集
项集是项的集合。包括k个项的项集称为k项集
项集的出现频率是全部包含项集的事务个数
若项集I的相对支持度知足预约义的最小支持度阙值,则I是频繁项集
D:支持度计数
项集A的支持度计数是事务数据集中包含项集A的事务个数,简称为项集的频率或计数
已知项集的支持度计数,则规则A→B的支持度和置信度易从全部事务计数、项集A和项集A U B的支持度计数推出
相关博客:http://blog.csdn.net/wo334499/article/details/51698810
Aprior算法主要思想是:找出存在于事务数据集中的最大的频繁项集,在利用获得的最大频繁项集与预先设定的最小置信度阙值生成强关联规则
#-*- coding: utf-8 -*- from __future__ import print_function import pandas as pd #自定义链接函数,用于实现L_{k-1}到C_k的链接 def connect_string(x, ms): 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) 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(['confidence','support'], ascending = False) #结果整理,输出 print(u'\n结果为:') print(result) return result
模型名称 | 描述 |
平滑法 | 平滑法用于趋势分析和预测,利用修匀技术,削弱短时间随机波动对序列的的影响,使序列平滑化。 |
趋势拟合法 | 趋势拟合法把时间做为自变量,相变的序列观察值做为因变量,创建回归模型。根据序列特征,可具体分为线性拟合和曲线拟合 |
组合模拟 | 时间序列变化主要受长期趋势(T)、季节变更(S)、周期变更(C)和不规则变更(e)影响。根据序列特色,可构建:【加法模型:xt=Tt+St+Ct+εt】【乘法模型:xt=Tt*St*Ct*εt】 |
AR模型 | |
MA模型 | |
ARMA模型 | |
ARIMA模型 | |
ARCH模型 | |
GARCH模型及衍生模型 |
序列预处理:观察值序列的纯随机性和平稳性检验称为序列预处理
纯随机序列(白噪声序列):序列各项间没有任何相关关系,序列在进行彻底无序的随机波动,可终止对该序列的分析。白噪声序列是没有信息可提取的平稳序列。
平稳非白噪声序列:一般是创建一个线性模型来拟合该序列的发展,借此提取该序列额有用信息。经常使用的模型是:ARMA(平稳序列拟合模型)。
非平稳序列:均值、方差不稳定,处理方法,将其转变为平稳序列,再进行分析。
(1)平稳性检验
a:平稳时间序列定义
单个随机变量X,可计算其均值(数学指望)μ、方差σ2
两个随机变量X、Y,可计算X、Y的协方差cov(X,Y)、相关系数ρ(X,Y)
若时间序列再某一个常数附近波动且波动范围有限,即有常数均值和常数方差。延迟k期的序列变量的自协方差和自相关系数相等,则该时间序列是平稳序列。
b:平稳性检验
时序图检验
自相关图检验
单位根检验
(2)纯随机性检验
若一个序列是纯随机序列,那么它的序列值之间应没有 任何关系,即知足y(k)=0,k!=0,实际上纯随机序列样本自相关系数很接近0,并在0附近随机波动。
纯随机性检验,通常是构造检验统计量来检验序列的纯随机性。经常使用的检验统计量有Q统计量、LB统计量
由样本各延迟期数的自相关系数可计算获得检验统计量,而后计算出对应的P值,若P值显著大于显著性水平a,则表示该序列不能拒绝纯随机的原假设,可中止对该序列的分析。
(1)AR模型
(2)MA模型
(3)ARMA模型
(4)平稳时间序列建模
A:计算ACF和PACF。先计算非平稳白噪声序列的自相关系数(ACF)和偏自相关系数(PACF)
B:ARMA模型识别(模型定阶)。由AR(p)模型、MA(q)、ARMA(p、q)的自相关系数和偏自相关的性质,选择合适的模型
C:估计模型未知参数的值并进行参数检验
D:模型检验
E:模型优化
F:模型应用,短时间预测
(5)ARMA模型识别原则
模型 | 自相关系数(ACF) | 偏自相关系数(PACF) |
AR(p) | 拖尾 | p阶截尾 |
MA(q) | q阶截尾 | 拖尾 |
ARMA(p,q) | p阶截尾 | q阶拖尾 |
(1)差分运算(具备较强的肯定性信息提取能力)
p阶差分:相距一期的两个序列值之间的减法运算称为 1阶差分运算
k步差分:相距k期的两个序列值之间的减法运算称为k步差分运算
(2)ARIMA模型
#-*- coding: utf-8 -*- #arima时序模型实现代码 import pandas as pd #参数初始化 discfile = '../data/arima_data.xls' forecastnum = 5 #读取数据,指定日期列为指标,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天的预测,返回预测结果、标准偏差、置信区间。
函数名 | 函数功能 | 所属工具箱 | 使用格式 | 备注 |
acf() | 计算自相关系数 | statsmodels.tsa.stattools | autocorr=acf(data,unbiased=False,nlags=40,qstat=False,fft=False,alpha=None) | data为观测值序列(时间序列,能够是DataFrame或Series),返回参数autocorr为观测值序列自相关函数,其他的均为可选参数 |
plot_acf() | 画自相关系数图 | statsmodels.graphics.tsaplots | p=plot_acf(data) | |
pacf() | 计算偏相关系数 | statsmodels.tsa.stattools | autocorr=pacf(data,unbiased=False,nlags=40,qstat=False,fft=False,alpha=None) | |
plot_pacf() | 画偏相关系数图 | statsmodels.graphics.tsaplots | p=plot_pacf(data) | |
adfuller() | 对观测值序列进行单位根检验 | statsmodels.tsa.stattools | h=adffuller(Series,maxlag=None,regression='c',autolag='AIC',store=Fals,regresults=False) | 输入参数Series为一维观测值序列,返回值依次为:adf、pvalue、usedlag、nobs、critical、values、icbest、regresults、resstore |
diff() | 对观测值序列进行差分计算 | Pandas对象自带的方法 | D.diff() | D为Pandas的DataFrame或Series |
ARIMA() | 建立一个ARIMA时序模型 | statsmodels.tsa.arima_model | arima=ARIMA(data,(p,1,q)).fit() | data参数为输入的时间序列,p、q为对应的阶,d为差分次数 |
summary()或summaty2 | 给出一份ARIMA模型的报告 | ARIMA模型对象自带的方法 | arima.summary()/arima.summary2() | arima为已创建好的ARIMA模型,返回一份格式化的模型报告,包含模型的系数、标准偏差、p值、AIC、BIC等指标 |
aic\bic\hqic | 计算ARIMA模型的AIC\BIC\HQIC指标值 | ARIMA模型对象自带的变量 | arima.aic/arima.bic/arima.hqic | arima为已创建好的ARIMA模型,返回值是Model时序模型获得的AIC、BIC、HQIC指标值 |
forecast() | 应用构建的时序模型进行预测 | ARIMA模型对象自带的方法 | a,b,c=arima.forecast(num) | 输入参数num为要预测的天数,arima为已创建好的ARIMA模型,a为返回的预测值,b为预测的偏差,c为预测置信区间 |
acorr_ljungbox() | Ljung-Box检验,检验是否为白噪声 | statsmodels.tsa.diagnostic | acorr_ljungbox(data,lags=1) | 输入参数data为时间序列数据,lags为滞后数,返回统计量和p值 |
离群点成因:数据来源于不一样的类、天然变异、数据测量、收集偏差
离群点分类:
分类标准 | 分类名称 |
从数据范围 | 全局离群点和局部离群点 |
从数据类型 | 数值型离群点和分类型离群点 |
从属性个数 | 一维离群点和多维离群点 |
离群点检测方法 | 方法描述 | 方法评估 |
基于统计 | 大部分基于统计的离群点检测方法是:构建一个几率分布模型,并计算对象符合该模型的几率,将具备低几率的对象视为离群点 | 前提是:知道数据服从何种分布,对高维数据,检验效果不好 |
基于邻近度 | 一般可在数据对象间定义邻近性度量,把远离大部分点的对象视为离群点 | 二维、三维的数据可作散点图观察,大数据不适用,对参数选择敏感,具备全局阙值,不能处理具备不一样密度区域的数据集 |
基于密度 | 考虑数据集可能存在不一样密度区域,离群点是在低密度区域中的对象 | 给出对象是离群点的定量度量,即便数据具备不一样的区域很好处理,大数据集不适用,参数选择比较难 |
基于聚类 | 一种利用聚类检测离群点的方法是:丢弃远离其余簇的小簇。首先聚类全部对象,而后评估对象属于簇的程度 | 基于聚类技术来发现离群点可能死高度有效的,聚类算法产生的簇的质量对该算法产生的离群点的质量影响很是大 |
(1)丢弃远离其余簇的小簇,该过程可简化为丢弃小于某个最小阙值的全部簇。
(2)基于原型的聚类,该过程首先聚类全部对象,而后评估对象属于簇的程度,可用对象到它的簇中心的距离来度量属于簇的程度。
对于基于原型的聚类,有两种方法评估对象属于簇的程度(离群点得分)
a:度量对象到簇原型的距离,并用它做为该对象的离群点得分
b:考虑到簇具备不一样的密度,能够度量簇到原型的相对距离,相对距离是点到质心的距离与簇中全部点到质心的距离的中位数之比。
#-*- coding: utf-8 -*- #使用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 = 4, 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()