機器學習:集成學習(Bagging、Pasting)


一、集成學習算法的問題

  • 思路:集成多個算法,讓不同的算法對同一組數據進行分析,得到結果,最終投票決定各個算法公認的最好的結果;
  • 弊端:雖然有很多機器學習的算法,但是從投票的角度看,仍然不夠多;如果想要有效果更好的投票結果,最好有更多的算法參與;(概率論中稱大數定理)

 

  • 方案:創建更多的子模型,集成更多的子模型的意見;
  1. 子模型之間要有差異,不能一致;

 

 

二、如何創建具有差異的子模型

 1)創建思路、子模型特點

  • 思路:每個子模型只使用樣本數據的一部分;(也就是說,如果一共有 500 個樣本數據,每個子模型只看 100 個樣本數據,每個子模型都使用同一個算法)

 

  • 特點
  1. 由於將樣本數據平分成 5 份,每份 100 個樣本數據,每份樣本數據之間有差異,因此所訓練出的 5 個子模型之間也存在差異;
  2. 5 個子模型的准確率低於使用全部樣本數據所訓練出的模型的准確率;
  3. 實際應用中,每個子模型的准確率有高有低,甚至有些子模型的准確率低於 50%;

 

  • 集成的眾多模型中,並不要求子模型有更高的准確率,只要子模型的准確率大於 50%,在集成的模型當中,隨着子模型數量的增加,集成學習的整體的准確率升高
  • 原因分析見下圖:

 

 

 2)怎么分解樣本數據給每個子模型?

  • 放回取樣(Bagging)
  1. 每個子模型從所有的樣本數據中隨機抽取一定數量的樣本,訓練完成后將數據放回樣本數據中,下個子模型再從所有的樣本數據中隨機抽取同樣數量的子模型;
  2. 機器學習領域,放回取樣稱為 Bagging;統計學中,放回取樣稱為 bootstrap;

 

  • 不放回取樣(Pasting)
  • 500 個樣本數據,第一個子模型從 500 個樣本數據中隨機抽取 100 個樣本,第二個子模型從剩余的 400 個樣本中再隨機抽取 100 個樣本;

 

  • 通常采用 Bagging 的方式
  • 原因:

  1. 可以訓練更多的子模型,不受樣本數據量的限制;
  2. 在 train_test_split 時,不那么強烈的依賴隨機;而 Pasting 的方式,會首隨機的影響;
  • Pasting 的隨機問題:Pasting 的方式等同於將 500 個樣本分成 5 份,每份 100 個樣本,怎么分,將對子模型有較大影響,進而對集成系統的准確率有較大影響;

 

 3)實例創建子模型

  • scikit-learn 中默認使用 Bagging 的方式生成子模型;
  • 模擬數據集

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    
    X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
    
    plt.scatter(X[y==0, 0], X[y==0, 1])
    plt.scatter(X[y==1, 0], X[y==1, 1])
    plt.show()

 

  • 使用 Bagging 取樣方式,決策樹算法 DecisionTreeClassifier 集成 500 個子模型

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import BaggingClassifier
    
    bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=200, bootstrap=True)
    
    bagging_clf.fit(X_train, y_train)
    bagging_clf.score(X_test, y_test)
    # 准確率:0.904

     

  • BaggingClassifier() 的參數:

  1. DecisionTreeClassifier():表示需要根據什么算法生產子模型;
  2. n_estimators=500:集成 500 個子模型;
  3. max_samples=100:每個子模型看 100 個樣本數據;
  4. bootstrap=True:表示采用 Bagging 的方式從樣本數據中取樣;(默認方式)
  5. bootstrap=False:表示采用 Pasting 的方式從樣本數據中取樣;

 

 

三、其它

  • 老師指點

  1. 機器學習的過程沒有一定之規,沒有soft永遠比hard好的結論(如果是那樣,我們實現的接口就根本不需要hard這個選項了;
  2. 並不是說子模型數量永遠越多越好,一切都要根據數據而定,對於一組具體的數據,如論是soft還是hard,亦或是子模型數量,都是超參數,在實際情況都需要根據數據進行一定的調節。
  3. 在機器學習的世界里,在訓練階段,並不是准確率越高越好。因為准確率高有可能是過擬合。應該是“越真實越好”
  • 所謂的真實是指結果要能“真實”的反應訓練數據和結果輸出的關系。
  • 在真實的數據中,使用驗證數據集是很重要的:)

 


免責聲明!

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



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