python分类预测模型的特点
SVM 强大的模型,可以用来回归,预测,分类等,而根据选取不同的和函数,模型可以是线性的/非线性的 sklearn.svm 决策树 基于"分类讨论,逐步细化"思想的分类模型,模型直观,易解释 sklearn.tree 朴素贝叶斯 基于概率思想的简单有效的分类模型,能够给出容易理解的概率解释 sklearn.naive_bayes 神经网络 具有强大的拟合能力,可疑用于拟合,分类等,它有多个增强版本,如递神经网络,卷积神经网络,自编吗器等,这些是深度学习的模型基础 Keras 逻辑回归 比较基础的线性分类模型,很多时候是简单有效的选择 sklearn.linear_model 随机森林 思想跟决策树类似,精度通常比决策树要高,缺点是由于随机性, 丧失了决策树的可解释性 sklearn.ensemble - python建模的步骤:
- 建立一个对象(这个对象是空白的,需要进一步训练)
- 然后,我们要设置模型的参数
- 接着就是通过fit()方法对模型进行训练
- 最后通过predict()方法预测结果
- 对模型的评估score()方法等
- 聚类分析
- 常用聚类分析算法
- 与分类不同,聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法.与分类模型需要使用有类标记样本构成的训练数据不同,聚类模型可疑建立在吴磊标记的数据上,是一种非监督的学习算法.聚类的输入是一组为被标记的样本,聚类根据数据自身距离或相似度将其划分为若干组,划分的原则是组内距离最小化而组件距离最大化.
划分(分裂)方法 K-Means算法(K-均值),K-MEDOIDS算法(K-中心点),CLARANS算法(基于选择的算法) 层次分析方法 BIRCH算法(平衡迭代规约和聚类),CURE算法(代表点聚类),CHAMLEON算法 基于密度的方法 DBSCAN算法(基于密度连接区域).DENCLUE算法(密度分布函数),OPTICS算法(对象识别排序) 基于网络的方法 STING(统计信息网络),CLIOUE算法(聚类高维空间),WAVE-CLUSTER算法(小波变换) 基于模型的方法 统计学方法,神经网络方法
- 聚类分析的算法
K-Means K-均值聚类也称为快速聚类法,在最小化误差函数的基础上家境数据划分为预订的类数K,该算法原理简单并便于处理处理数据 K-中心点 K-均值算法对孤立点的敏感性, K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心 系统聚类 系统聚类也称为多层次聚类,分类的单位由高到低呈树形结构,且所处的为孩子越低,其包含的对象就越少,但这些对象间的共同特征越多,该聚类的方法只适合小数据量的时候使用,数据量大的时候速度会非常快
- K-Means聚类算法
- K-Means算法十典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.
- 算法过程
- 从N个样本书中随机选取K个对象作为初始的聚类中心
- 分别计算每个样本到各个聚类中心的距离,将对象分配到聚类中
- 所有对象分配完成后,重新计算K个聚类中心.
- 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化转第2步, 否则转第5步
- 当质心不发生变化时停止输出聚类结果
- 聚类的结果可能依赖初始聚类中心的随机选择,可能使得结果严重偏离全局最优分类,实践中,为了得到较好的效果,通常选择不同的初始聚类中心,多次运行K-Means算法,在所有对象分配完成后,重新计算K个聚类中心时,对于连续数据,聚类中心取簇的均值,但是当样本的某些属性是分类变量时,均值可能无定义,可疑使用K-众数方法
- 数据类型与相似性的度量
- 连续属性
- 对于连续属性,要先对个属性值进行零 - 均值规范, 再进行距离的计算.在K-Means聚类算法中,一般需要度量样本之间的距离,样本与簇之间的距离以及簇与簇之间的距离
- 度量样本之间的相似性最常用的是欧几里得距离,曼哈顿距离和闵可夫斯基距离;样本与簇之间的距离可以用样本到簇中心的距离d(e,x);簇与簇之间的距离剋用簇中心的距离d(e,e)
- 欧几里得距离:
- d(i,j) = ((x - x) + (x - x) + ... + (x - x))
- 曼哈顿距离:
- d(i,j) = |x - x| + |x - x| + ... + |x - x|
- 闵可夫斯基距离:
- d(i,j) = ((|x - x|) + (|x - x|) + ... + (|x - x|))
- q为正整数, q=1时,即为曼哈顿距离,;q=2时即为欧几里得距离
- 目标函数
- 使用误差平方和SSE作为度量聚类质量的目标函数,对于两种不同的聚类结果,训着误差平方和较小的分类结果.
- 连续属性的SSE计算公式为:
- SSE = ∑∑dist(e, x)
- 文档数据的SSE计算公式为:
- SE = ∑∑cos(e, x)
- 簇Ei的聚类中心ei计算公式为
- ei = 1/n∑x
k 聚类簇的个数 e 簇E的聚类中心 E 第i个簇 n 第i个簇中样本的个数 x 对象(样本)
- 消费行为数据:
1 37 4 579 2 35 3 616 3 25 10 394 4 52 2 111 5 36 7 521 6 41 5 225 7 56 3 118 8 37 5 793 9 54 2 111 10 5 18 1086 - 采用K-Means聚类算法,设定聚类个数K为3,最大迭代次数为500次,距离函数取欧式距离
import pandas as pd k = 3 # 聚类的类别 iteration = 500 # 聚类最大循环次数 data = pd.read_csv("sales_bak.csv",sep=",",header=None, names=["ID", "R", "F", "M"]) 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 # 统计各个类别的数目 r2 = pd.DataFrame(model.cluster_centers_) # 找到聚类中心 r = pd.concat([r2,r1], axis=1) # 横向连接(0时纵向),得到聚类中心对应的类别下的数目 r.columns = list(data.column) + [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("sales.xlxs")
- 事实上,Scikit-Learn中的K-Means算法仅仅支持欧式距离,原因在于采用其他的距离并不一定能够保证算法的收敛性
- 然后用pandas和Matplotlib绘制的不同客户分群的概率密度函数图,通过这些图能直观的比较不同客户群的价值
- 聚类分析算法评价
- 聚类分析仅根据样本数据本身将样本分组,其目标时实现组内的对象相互之间时相似的(相关的),而不同组中的对象时不同的(不相关),组内的相似性越大,组间差别越大,聚类效果就越好
- purity评价法
- purity方法时极为简单的一种聚类评价方法,只需计算正确聚类占总数的比例
- purity(x,y) = 1/n∑max| xΩ y |
- 其中,x = (x1, x2, ... xk)时聚类的集合.xk表示第k个聚类的集合.y=(y1,y2,...yk)表示需要被聚类的集合,yi表示第i个聚类对象.n表示被聚类集合对象的总数
- purity方法时极为简单的一种聚类评价方法,只需计算正确聚类占总数的比例
- RI评价法
- 实际上,这是一种用排列组合原理来对聚类进行评价的手段,RI评价公式如下.
- RI = R + W / R + M + D + W
- 其中,R是指被聚在一类两个对象被正确分类了,w是指不应该被聚在一类的两个对象被正确分开.M是指不应该放在一起的对象被错误的放在一类,D是指不应该分开的对象被错误的分开了.
- 实际上,这是一种用排列组合原理来对聚类进行评价的手段,RI评价公式如下.
- F指评价法
- 这是基于上述RI方法衍生出的一个方法,F评价公式如下:
- Fa = (I + α)pr / αß + r
- 其中, p = R / R + M, r = R / (R + D)
- 实际上RI方法就是吧准确率P和召回率r看的同等重要,事实上,有时候我们可能需要某一特性更多一点,这时候就适合使用F值方法.
- 这是基于上述RI方法衍生出的一个方法,F评价公式如下:
- python主要聚类分析算法:
- python的聚类相关的算法主要在Scikit-Learn中, python里面实现的聚类主要包括K-Means聚类,层次聚类, FCM以及神经网络聚类,
KMeans K均值聚类 sklearn.cluster AffinityPropahation 吸引力传播聚类,2007年提出,几乎优于所有的其他方法,不需要指定聚类数,单运行效率较低 sklearn.cluster MeanShift 均值漂移聚类 sklearn.cluster SpectralClustring 谱聚类,具有效果比k均值好,速度比K均值快等特点 sklearn.cluster AgglomerativeClustering 层次聚类,给出一棵聚类层次树 sklearn.cluster DBSCAN 具有噪声的基于密度的聚类方法 sklearn.cluster BIRCH 综合的层次聚类算法,可以处理大规模数据的聚类 sklearn.cluster
- 这些不同模型的使用方法是大同小异的,都是基本先使用对应的函数建立模型,然后用.fit()方法来训练模型,训练好之后,就可以用.label_方法给出样本数据的标签,或者用.predict()方法预测新的输入标签.
- 此外,Scipy库也提供了一个聚类子库scipy.cluster,里边提供了一些聚类算法,如层次聚类等,但没有Scikit-Learn那么完善和丰富.scipy.cluster的好处黑丝它的函数名和功能基本根python时一一对应的,如层次聚类的linkage,dendrogram等,因此已经熟悉python的朋友,可疑尝试使用Scipy提供的聚类库.
# -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding("utf-8") """ 使用神经网络算法预测销量高低 """ from sklearn.manifold import TSNE import pandas as pd k = 3 # 聚类的类别 iteration = 500 # 聚类最大循环次数 data = pd.read_csv("sales_bak.csv", sep="\t",header=None, names=["a", "b", "c"]) # 读取csv中的数据 data_zs = 1.0 * (data - data.mean()) / data.std() # 数据标准化 tsne = TSNE() # 实例化一个TENS空白的对象 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['zxes.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()