日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sklearn综合示例7:集成学习与随机森林

發布時間:2024/1/23 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sklearn综合示例7:集成学习与随机森林 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假設你創建了一個包含1000個分類器的集成,每個分類器都只有51%的概率是正確的(幾乎不比隨機猜測強多少)。如果你以大多數投票的類別作為預測結果,可以期待的準確率高達75%。但是,這基于的前提是所有的分類器都是完全獨立的,彼此的錯誤毫不相關。顯然這是不可能的,因為它們都是在相同的數據上訓練的,很可能會犯相同的錯誤,所以也會有很多次大多數投給了錯誤的類別,導致集成的準確率有所降低。

當預測器盡可能互相獨立時,集成方法的效果最優。獲得多種分類器的方法之一就是使用不同的算法進行訓練。這會增加它們犯不同類型錯誤的機會,從而提升集成的準確率。

import numpy as np import pandas as pd import sklearn

1、投票分類器

我們使用多個模型對同一個事件進行預測,然后根據各個分類器的預測結果投票決定最終的分類結果。

from sklearn.ensemble import RandomForestClassifier, VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.datasets import make_moonsX, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)log_clf = LogisticRegression() rndf_clf = RandomForestClassifier() svm_clf = SVC()vot_clf = VotingClassifier(estimators=[('lr',log_clf),('rf',rndf_clf),('svc',svm_clf)],voting='hard' )from sklearn.metrics import accuracy_score for clf in (log_clf, rndf_clf, svm_clf, vot_clf):clf.fit(X_train, y_train)y_pred = clf.predict(X_test)print(clf.__class__.__name__, accuracy_score(y_test, y_pred)) LogisticRegression 0.864 RandomForestClassifier 0.888 SVC 0.896 VotingClassifier 0.904

可以看出來,投票分類器略優于其它單個分類器。

如果所有分類器都能夠估算出類別的概率(即有predict_proba()方法),那么你可以將概率在所有單個分類器上平均,然后讓ScikitLearn給出平均概率最高的類別作為預測。這被稱為軟投票法。通常來說,它比硬投票法的表現更優,因為它給予那些高度自信的投票更高的權重。而所有你需要做的就是用voting="soft"代替voting=“hard”,并確保所有分類器都可以估算出概率。默認情況下,SVC類是不行的,所以你需要將其超參數probability設置為True(這會導致SVC使用交叉驗證來估算類別概率,減慢訓練速度,并會添加predict_proba()方法)。

2、bagging與pasting

前面提到,獲得不同種類分類器的方法之一是使用不同的訓練算法。還有另一種方法是每個預測器使用的算法相同,但是在不同的訓練集隨機子集上進行訓練。采樣時如果將樣本放回,這種方法叫作bagging(bootstrap aggregating的縮寫,也叫自舉匯聚法)。采樣時樣本不放回,這種方法則叫作pasting。

換句話說,bagging和pasting都允許訓練實例在多個預測器中被多次采樣,但是只有bagging允許訓練實例被同一個預測器多次采樣。

一旦預測器訓練完成,集成就可以通過簡單地聚合所有預測器的預測來對新實例做出預測。聚合函數通常是統計法(即最多數的預測與硬投票分類器一樣)用于分類,或是平均法用于回歸。每個預測器單獨的偏差都高于在原始訓練集上訓練的偏差,但是通過聚合,同時降低了偏差和方差。總體來說,最終結果是,與直接在原始訓練集上訓練的單個預測器相比,集成的偏差相近,但是方差更低。

  • 你可以通過不同的CPU內核甚至不同的服務器并行地訓練預測器。類似地,預測也可以并行。參數n_jobs用來指示ScikitLearn用多少CPU內核進行訓練和預測(1表示讓ScikitLearn使用所有可用內核)
  • 這是一個bagging的示例,如果你想使用pasting,只需要設置bootstrap=False即可
from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_split from sklearn.datasets import make_moonsX, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,max_samples=100, bootstrap=True, n_jobs=-1 ) bag_clf.fit(X_train, y_train) y_pred = bag_clf.predict(X_test) print(accuracy_score(y_test, y_pred)) 0.936

如果基本分類器可以估計類別概率(如果它具有predict_proba()方法),則BaggingClassifier自動執行軟投票而不是硬投票,在決策樹分類器中就是這種情況。

包外評估

對于任意給定的預測器,使用bagging,有些實例可能會被采樣多次,而有些實例則可能根本不被采樣。BaggingClassifier默認采樣m個訓練實例,然后放回樣本(bootstrap=True),m是訓練集的大小。這意味著對每個預測器來說,平均只對63%的訓練實例進行采樣。剩余37%未被采樣的訓練實例稱為包外(oob)實例。

由于預測器在訓練過程中從未看到oob實例,因此可以在這些實例上進行評估,而無須單獨的驗證集。你可以通過平均每個預測器的oob評估來評估整體。在ScikitLearn中,創建BaggingClassifier時,設置oob_score=True就可以請求在訓練結束后自動進行包外評估。

from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_split from sklearn.datasets import make_moonsX, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,oob_score=True, bootstrap=True, n_jobs=-1 ) bag_clf.fit(X_train, y_train) y_pred = bag_clf.predict(X_test) print(accuracy_score(y_test, y_pred)) 0.904

3、隨機補丁和隨機子空間

BaggingClassifier類也支持對特征進行采樣。采樣由兩個超參數控制:max_features和bootstrap_features。它們的工作方式與max_samples和bootstrap相同,但用于特征采樣而不是實例采樣。因此,每個預測器將用輸入特征的隨機子集進行訓練。

這對于處理高維輸入(例如圖像)特別有用。對訓練實例和特征都進行抽樣,這稱為隨機補丁方法。而保留所有訓練實例(即bootstrap=False并且max_samples=1.0)但是對特征進行抽樣(即bootstrap_features=True并且/或max_features<1.0),這被稱為隨機子空間法。

對特征抽樣給預測器帶來更大的多樣性,所以以略高一點的偏差換取了更低的方差。

4、隨機森林

隨機森林大致與上面的BaggingClassifier相同。

除少數例外,RandomForestClassifier具有DecisionTreeClassifier的所有超參數(以控制樹的生長方式),以及BaggingClassifier的所有超參數來控制集成本身。

隨機森林在樹的生長上引入了更多的隨機性:分裂節點時不再是搜索最好的特征(見第6章),而是在一個隨機生成的特征子集里搜索最好的特征。這導致決策樹具有更大的多樣性,(再一次)用更高的偏差換取更低的方差,總之,還是產生了一個整體性能更優的模型。

from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_split from sklearn.datasets import make_moonsX, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)rndf_clf = RandomForestClassifier(n_estimators=500,oob_score=True, bootstrap=True, n_jobs=-1, max_leaf_nodes=16)rndf_clf.fit(X_train, y_train) y_pred = rndf_clf.predict(X_test) print(accuracy_score(y_test, y_pred)) 0.912

特征重要性

隨機森林的另一個好特性是它們使測量每個特征的相對重要性變得容易。ScikitLearn通過查看使用該特征的樹節點平均(在森林中的所有樹上)減少不純度的程度來衡量該特征的重要性。更準確地說,它是一個加權平均值,其中每個節點的權重等于與其關聯的訓練樣本的數量。

ScikitLearn會在訓練后為每個特征自動計算該分數,然后對結果進行縮放以使所有重要性的總和等于1。你可以使用feature_importances_變量來訪問結果。例如,以下代碼在鳶尾花數據集上訓練了RandomForestClassifier,并輸出每個特征的重要性。看起來最重要的特征是花瓣長度(47%)和寬度(42%),而花萼的長度和寬度則相對不那么重要。

from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris()rndf_clf = RandomForestClassifier() rndf_clf.fit(iris['data'], iris['target']) for name,score in zip(iris["feature_names"],rndf_clf.feature_importances_):print(name, score) sepal length (cm) 0.0916662781753619 sepal width (cm) 0.017065083772560878 petal length (cm) 0.4729672623846955 petal width (cm) 0.41830137566738174

5、提升法之AdaBoost

本部分只介紹了基本的原理,更關注的是其實現。詳細的理論請參考其它文章。

提升法(boosting,最初被稱為假設提升)是指可以將幾個弱學習器結合成一個強學習器的任意集成方法。大多數提升法的總體思路是循環訓練預測器,每一次都對其前序做出一些改正。可用的提升法有很多,但目前最流行的方法是AdaBoost(AdaptiveBoosting的簡稱)和梯度提升。

新預測器對其前序進行糾正的方法之一就是更多地關注前序欠擬合的訓練實例,從而使新的預測器不斷地越來越專注于難纏的問題,這就是AdaBoost使用的技術。

例如,當訓練AdaBoost分類器時,該算法首先訓練一個基礎分類器(例如決策樹),并使用它對訓練集進行預測。然后,該算法會增加分類錯誤的訓練實例的相對權重。然后,它使用更新后的權重訓練第二個分類器,并再次對訓練集進行預測,更新實例權重,以此類推

這種依序學習技術有一個重要的缺陷就是無法并行(哪怕只是一部分),因為每個預測器只能在前一個預測器訓練完成并評估之后才能開始訓練。因此,在擴展方面,它的表現不如bagging和pasting方法。

from sklearn.ensemble import AdaBoostClassifier from sklearn.datasets import make_moons from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_splitX, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200,algorithm="SAMME.R", learning_rate=0.5, random_state=42) ada_clf.fit(X_train, y_train)y_pred = ada_clf.predict(X_test) print(accuracy_score(y_test, y_pred)) 0.896

6、提升法之梯度提升:GBDT xgboost

與AdaBoost一樣,梯度提升也是逐步在集成中添加預測器,每一個都對其前序做出改正。不同之處在于,它不是像AdaBoost那樣在每個迭代中調整實例權重,而是讓新的預測器針對前一個預測器的殘差進行擬合。

詳見GBDT&xgboost相關文章。

7、堆疊法

本章我們要討論的最后一個集成方法叫作堆疊法(stacking),又稱層疊泛化法。它基于一個簡單的想法:與其使用一些簡單的函數(比如硬投票)來聚合集成中所有預測器的預測,我們為什么不訓練一個模型來執行這個聚合呢?圖示顯示了在新實例上執行回歸任務的這樣一個集成。底部的三個預測器分別預測了不同的值,然后最終的預測器(稱為混合器或元學習器)將這些預測作為輸入,進行最終預測。

訓練混合器的常用方法是使用留存集。我們看看它是如何工作的。首先,將訓練集分為兩個子集,第一個子集用來訓練第一層的預測器。

然后,用第一層的預測器在第二個(留存)子集上進行預測)。因為預測器在訓練時從未見過這些實例,所以可以確保預測是“干凈的”。那么現在對于留存集中的每個實例都有了三個預測值。我們可以使用這些預測值作為輸入特征,創建一個新的訓練集(新的訓練集有三個維度),并保留目標值。在這個新的訓練集上訓練混合器,讓它學習根據第一層的預測來預測目標值。

事實上,通過這種方法可以訓練多種不同的混合器(例如,一個使用線性回歸,另一個使用隨機森林回歸,等等)。于是我們可以得到一個混合器層。訣竅在于將訓練集分為三個子集:第一個用來訓練第一層,第二個用來創造訓練第二層的新訓練集(使用第一層的預測),而第三個用來創造訓練第三層的新訓練集(使用第二層的預測)。一旦訓練完成,我們可以按照順序遍歷每層來對新實例進行預測,

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的sklearn综合示例7:集成学习与随机森林的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。