python分类预测模型的特点

  • SVM强大的模型,可以用来回归,预测,分类等,而根据选取不同的和函数,模型可以是线性的/非线性的sklearn.svm
    决策树基于"分类讨论,逐步细化"思想的分类模型,模型直观,易解释sklearn.tree
    朴素贝叶斯基于概率思想的简单有效的分类模型,能够给出容易理解的概率解释sklearn.naive_bayes
    神经网络具有强大的拟合能力,可疑用于拟合,分类等,它有多个增强版本,如递神经网络,卷积神经网络,自编吗器等,这些是深度学习的模型基础Keras
    逻辑回归比较基础的线性分类模型,很多时候是简单有效的选择sklearn.linear_model
    随机森林思想跟决策树类似,精度通常比决策树要高,缺点是由于随机性, 丧失了决策树的可解释性sklearn.ensemble
  • python建模的步骤:
    1. 建立一个对象(这个对象是空白的,需要进一步训练)
    2. 然后,我们要设置模型的参数
    3. 接着就是通过fit()方法对模型进行训练
    4. 最后通过predict()方法预测结果
    5. 对模型的评估score()方法等
  • 聚类分析
    • 常用聚类分析算法
    • 与分类不同,聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法.与分类模型需要使用有类标记样本构成的训练数据不同,聚类模型可疑建立在吴磊标记的数据上,是一种非监督的学习算法.聚类的输入是一组为被标记的样本,聚类根据数据自身距离或相似度将其划分为若干组,划分的原则是组内距离最小化而组件距离最大化.
    • 划分(分裂)方法K-Means算法(K-均值),K-MEDOIDS算法(K-中心点),CLARANS算法(基于选择的算法)
      层次分析方法BIRCH算法(平衡迭代规约和聚类),CURE算法(代表点聚类),CHAMLEON算法
      基于密度的方法DBSCAN算法(基于密度连接区域).DENCLUE算法(密度分布函数),OPTICS算法(对象识别排序)
      基于网络的方法STING(统计信息网络),CLIOUE算法(聚类高维空间),WAVE-CLUSTER算法(小波变换)
      基于模型的方法

      统计学方法,神经网络方法

    • 聚类分析的算法
      • K-MeansK-均值聚类也称为快速聚类法,在最小化误差函数的基础上家境数据划分为预订的类数K,该算法原理简单并便于处理处理数据
        K-中心点K-均值算法对孤立点的敏感性, K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心
        系统聚类系统聚类也称为多层次聚类,分类的单位由高到低呈树形结构,且所处的为孩子越低,其包含的对象就越少,但这些对象间的共同特征越多,该聚类的方法只适合小数据量的时候使用,数据量大的时候速度会非常快
    • K-Means聚类算法
      •  K-Means算法十典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.
      • 算法过程
        1. 从N个样本书中随机选取K个对象作为初始的聚类中心
        2. 分别计算每个样本到各个聚类中心的距离,将对象分配到聚类中
        3. 所有对象分配完成后,重新计算K个聚类中心.
        4. 与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化转第2步, 否则转第5步
        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对象(样本)
        • 消费行为数据:
      • 1374579
        2353616
        32510394
        4522111
        5367521
        6415225
        7563118
        8375793
        9542111
        105181086
      • 采用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表示被聚类集合对象的总数
    • RI评价法
      • 实际上,这是一种用排列组合原理来对聚类进行评价的手段,RI评价公式如下.
        • RI = R + W / R + M + D + W
      • 其中,R是指被聚在一类两个对象被正确分类了,w是指不应该被聚在一类的两个对象被正确分开.M是指不应该放在一起的对象被错误的放在一类,D是指不应该分开的对象被错误的分开了.
    • F指评价法
      • 这是基于上述RI方法衍生出的一个方法,F评价公式如下:
        • Fa = (I + α)pr / αß + r
      • 其中, p = R / R + M, r = R / (R + D)
      • 实际上RI方法就是吧准确率P和召回率r看的同等重要,事实上,有时候我们可能需要某一特性更多一点,这时候就适合使用F值方法.
    • python主要聚类分析算法:
      • python的聚类相关的算法主要在Scikit-Learn中, python里面实现的聚类主要包括K-Means聚类,层次聚类, FCM以及神经网络聚类,
      • KMeansK均值聚类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()
01-12 12:02