python分類預測模型的特色

python分類預測模型的特色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-Means K-均值聚類也稱爲快速聚類法,在最小化偏差函數的基礎上家境數據劃分爲預訂的類數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(ei,x);簇與簇之間的距離剋用簇中心的距離d(ei,ej)
        • 歐幾里得距離:
          • d(i,j) = ((xi1 - xj1)2 + (xi2 - xj2)2 + ... + (xip - xjp)2)1/2
        • 曼哈頓距離:
          • d(i,j) = |xi1 - xj1| + |xi1 - xj1| + ... + |xip - xjp|
        • 閔可夫斯基距離:
          • d(i,j) = ((|xi1 - xj1|)q + (|xi2 - xj2|)q + ... + (|xip - xjp|)q)1/2
        • q爲正整數, q=1時,即爲曼哈頓距離,;q=2時即爲歐幾里得距離
      • 目標函數
        • 使用偏差平方和SSE做爲度量聚類質量的目標函數,對於兩種不一樣的聚類結果,訓着偏差平方和較小的分類結果.
        • 連續屬性的SSE計算公式爲:
          • SSE = ∑Ki=1x€Eidist(ei, x)2
        • 文檔數據的SSE計算公式爲:
          • SE = ∑Ki=1x€Eicos(ei, x)2
        • 簇Ei的聚類中心ei計算公式爲
          • ei = 1/nix€Eix
        • 符號
          含義
          符號
          含義
          k 聚類簇的個數 ei 簇Ei的聚類中心
          Ei 第i個簇 ni 第i個簇中樣本的個數
          x 對象(樣本)

 

        • 消費行爲數據:
      • ID
        R(最近一次消費時間間隔)
        F(消費頻率)
        M(消費總金額)
        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∑kmax| xkΩ yi |
      • 其中,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 + α2)pr / α2ß + r
      • 其中, p = R / R + M, r = R / (R + D)
      • 實際上RI方法就是吧準確率P和召回率r看的同等重要,事實上,有時候咱們可能須要某一特性更多一點,這時候就適合使用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()
相關文章
相關標籤/搜索