層次聚類和隨機森林(python實現)


層次聚類步驟:

     假設有N個待聚類的樣本,對於層次聚類來說,基本步驟就是:

       1、(初始化)把每個樣本歸為一類,計算每兩個類之間的距離,也就是樣本與樣本之間的相似度;

       2、按一定規則選取符合距離要求的類別,完成類間合並;

       3、重新計算新生成的這個類與各個舊類之間的相似度;

       4、重復2和3直到所有樣本點都歸為一類,結束。

 

隨機森林步驟:

  1. 從原始訓練集中使用Bootstraping方法隨機有放回采樣選出m個樣本,共進行n_tree次采樣,生成n_tree個訓練集
  2. 對於n_tree個訓練集,我們分別訓練n_tree個決策樹模型
  3. 對於單個決策樹模型,假設訓練樣本特征的個數為n,那么每次分裂時根據信息增益/信息增益比/基尼指數選擇最好的特征進行分裂
  4. 每棵樹都一直這樣分裂下去,直到該節點的所有訓練樣例都屬於同一類。在決策樹的分裂過程中不需要剪枝
  5. 將生成的多棵決策樹組成隨機森林。對於分類問題,按多棵樹分類器投票決定最終分類結果;對於回歸問題,由多棵樹預測值的均值決定最終預測結果

代碼實現:

代碼介紹:定義一個Groundwater_Classification 類  ,deal_datesets是處理數據集,test_RandomForestClassifier是隨機森林處理,Hcluster是層次聚類部分代碼

      self.x_train是訓練數據特征也就是特征  self.y_train是訓練的標記也就是label,self.x_test是測試的特征

import scipy.cluster.hierarchy as sch
import matplotlib.pylab as plt
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
class Groundwater_Classification():
    def __init__(self, num, n_estimators = 100,n_cluster = 8):
        self.x_train = None
        self.x_test = None
        self.y_train = None
        self.num = num
        self.n_estimators = n_estimators
        self.n_cluster = n_cluster

    # 處理數據集
    def deal_datasets(self):
        pd1 = pd.read_csv("../second1_17.csv", header=None, sep=" ")
        j = 0
        gap = self.num
        l = []
        for i in range(10):
            h = j + gap
            x1 = pd1.iloc[:, j:h]
            l.append(x1)
            j += 1440
        self.x_train = pd.concat(l, axis=1)
    def test_RandomForestClassifier(self):
        # 隨機森林進行預測
        rf = RandomForestClassifier(n_estimators=500)
        rf.fit(self.x_train, self.y_train)
        l = rf.predict_proba(self.x_train)
        print("隨機森林訓練數據准確率:", rf.score(self.x_train, self.y_train))
        print("隨機森林預測測試數據概率",l)
    def Hcluster(self):
        # 1. 層次聚類
        # 生成點與點之間的距離矩陣,這里用的歐氏距離:
        disMat = sch.distance.pdist(self.x_train, 'euclidean')
        # 進行層次聚類:
        Z = sch.linkage(disMat, method='average')
        # 將層級聚類結果以樹狀圖表示出來並保存為plot_dendrogram.png
        P = sch.dendrogram(Z)
        plt.savefig('plot_dendrogram_{}.png'.format(self.num))
        # 根據linkage matrix Z得到聚類結果:
        cluster = sch.fcluster(Z, t=1, criterion='distance')

        self.y_train = cluster
        print("Original cluster by hierarchy clustering:\n", cluster)

# for i in range(1,11):
#     print("num = ",i)
gc = Groundwater_Classification(num=720, n_estimators=500,n_cluster=8)
gc.deal_datasets()
gc.Hcluster()
gc.test_RandomForestClassifier()

 

上圖是層次聚類的結果,縱坐標是距離,橫坐標是樣本標號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM