Bootstrapping: 名字來自成語「pull up by your own bootstraps」,意思就是依靠你本身的資源,稱爲自助法,它是一種有放回的抽樣方法,它是非參數統計中一種重要的估計統計量方差進而進行區間估計的統計方法。其核心思想和基本步驟以下:
html
(1)採用重抽樣技術從原始樣本中抽取必定數量(本身給定)的樣本,此過程容許重複抽樣。
(2)根據抽出的樣本計算給定的統計量T。
(3)重複上述N次(通常大於1000),獲得N個統計量T。
(4)計算上述N個統計量T的樣本方差,獲得統計量的方差。web
應該說Bootstrap是現代統計學較爲流行的一種統計方法,在小樣本時效果很好。經過方差的估計能夠構造置信區間等,其運用範圍獲得進一步延伸。算法
裝袋算法至關於多個專家投票表決,對於屢次測試,每一個樣本返回的是屢次預測結果較多的那個。bootstrap
裝袋算法描述api
模型生成
令n爲訓練數據的實例數量
對於t次循環中的每一次
從訓練數據中採樣n個實例
將學習應用於所採樣本
保存結果模型
分類
對於t個模型的每個
使用模型對實例進行預測
返回被預測次數最多的一個
bagging:bootstrap aggregating的縮寫。讓該學習算法訓練多輪,每輪的訓練集由從初始的訓練集中隨機取出的n個訓練樣本組成,某個初始訓練樣本在某輪訓練集中能夠出現屢次或根本不出現,訓練以後可獲得一個預測函數序列網絡
最終的預測函數H對分類問題採用投票方式,對迴歸問題採用簡單平均方法對新示例進行判別。app
[訓練R個分類器f_i,分類器之間其餘相同就是參數不一樣。其中f_i是經過從訓練集合中(N篇文檔)隨機取(取後放回)N次文檔構成的訓練集合訓練獲得的。對於新文檔d,用這R個分類器去分類,獲得的最多的那個類別做爲d的最終類別。]框架
使用scikit-learn測試bagging方法dom
from sklearn.ensemble import BaggingClassifier from sklearn.neighbors import KNeighborsClassifier bagging = BaggingClassifier(KNeighborsClassifier(), ... max_samples=0.5, max_features=0.5)
提高算法描述機器學習
模型生成 賦予每一個訓練實例相同的權值 t次循環中的每一次: 將學習算法應用於加了權的數據集上並保存結果模型 計算模型在加了權的數據上的偏差e並保存這個偏差 結果e等於0或者大於等於0.5: 終止模型 對於數據集中的每一個實例: 若是模型將實例正確分類 將實例的權值乘以e/(1-e) 將全部的實例權重進行正常化 分類 賦予全部類權重爲0 對於t(或小於t)個模型中的每個: 給模型預測的類加權 -log(e/(1-e)) 返回權重最高的類
這個模型提供了一種巧妙的方法生成一系列互補型的專家。
boosting: 其中主要的是AdaBoost(Adaptive boosting,自適應boosting)。初始化時對每個訓練例賦相等的權重1/N,而後用該學算法對訓練集訓練t輪,每次訓練後,對訓練失敗的訓練例賦以較大的權重,也就是讓學習算法在後續的學習中集中對比較難的訓練例進行學習,從而獲得一個預測函數序列h1,⋯,hmh1,⋯,hm , 其中h_i也有必定的權重,預測效果好的預測函數權重較大,反之較小。最終的預測函數H對分類問題採用有權重的投票方式,對迴歸問題採用加權平均的方法對新示例進行判別。
提高算法理想狀態是這些模型對於其餘模型來講是一個補充,每一個模型是這個領域的一個專家,而其餘模型在這部分卻不能表現很好,就像執行官同樣要尋覓那些技能和經驗互補的顧問,而不是重複的。這與裝袋算法有所區分。
bagging與boosting的區別:
兩者的主要區別是取樣方式不一樣。bagging採用均勻取樣,而Boosting根據錯誤率來取樣,所以boosting的分類精度要優於Bagging。bagging的訓練集的選擇是隨機的,各輪訓練集之間相互獨立,而boostlng的各輪訓練集的選擇與前面各輪的學習結果有關;bagging的各個預測函數沒有權重,而boosting是有權重的;bagging的各個預測函數能夠並行生成,而boosting的各個預測函數只能順序生成。對於象神經網絡這樣極爲耗時的學習方法。bagging可經過並行訓練節省大量時間開銷。
bagging和boosting均可以有效地提升分類的準確性。在大多數數據集中,boosting的準確性比bagging高。在有些數據集中,boosting會引發退化— Overfit。
Boosting思想的一種改進型AdaBoost方法在郵件過濾、文本分類方面都有很好的性能。
Gradient boosting(又叫Mart, Treenet):Boosting是一種思想,Gradient Boosting是一種實現Boosting的方法,它主要的思想是,每一次創建模型是在以前創建模型損失函數的梯度降低方向。損失函數(loss function)描述的是模型的不靠譜程度,損失函數越大,則說明模型越容易出錯。若是咱們的模型可以讓損失函數持續的降低,則說明咱們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度(Gradient)的方向上降低。
使用scikit-learn測試adaboost算法
from sklearn.cross_validation import cross_val_score from sklearn.datasets import load_iris from sklearn.ensemble import AdaBoostClassifier iris = load_iris() clf = AdaBoostClassifier(n_estimators=100) scores = cross_val_score(clf, iris.data, iris.target) scores.mean() 0.9...
Random Forest: 隨機森林,顧名思義,是用隨機的方式創建一個森林,森林裏面有不少的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在獲得森林以後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類算法),而後看看哪一類被選擇最多,就預測這個樣本爲那一類。 在創建每一棵決策樹的過程當中,有兩點須要注意——採樣與徹底分裂。首先是兩個隨機採樣的過程,random forest對輸入的數據要進行行和列的採樣。對於行採樣,採用有放回的方式,也就是在採樣獲得的樣本集合中,可能有重複的樣本。假設輸入樣本爲N個,那麼採樣的樣本也爲N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是所有的樣本,使得相對不容易出現over-fitting。而後進行列採樣,從M個feature中,選擇m個(m << M)。以後就是對採樣以後的數據使用徹底分裂的方式創建出決策樹,這樣決策樹的某一個葉子節點要麼是沒法繼續分裂的,要麼裏面的全部樣本的都是指向的同一個分類。通常不少的決策樹算法都一個重要的步驟——剪枝,但隨機森林不這樣作,因爲以前的兩個隨機採樣的過程保證了隨機性,因此就算不剪枝,也不會出現over-fitting。 按這種算法獲得的隨機森林中的每一棵都是很弱的,可是你們組合起來就很厲害了。能夠這樣比喻隨機森林算法:每一棵決策樹就是一個精通於某一個窄領域的專家(由於咱們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了不少個精通不一樣領域的專家,對一個新的問題(新的輸入數據),能夠用不一樣的角度去看待它,最終由各個專家,投票獲得結果。
Random forest與bagging的區別:
(1)Random forest是選與輸入樣本的數目相同多的次數(可能一個樣本會被選取屢次,同時也會形成一些樣本不會被選取到),而bagging通常選取比輸入樣本的數目少的樣本;
(2)bagging是用所有特徵來獲得分類器,而Random forest是須要從所有特徵中選取其中的一部分來訓練獲得分類器; 通常Random forest效果比bagging效果好!
使用scikit-learn測試隨機森林算法
from sklearn.ensemble import RandomForestClassifier X = [[0, 0], [1, 1]] Y = [0, 1] clf = RandomForestClassifier(n_estimators=10) clf = clf.fit(X, Y)
梯度提高樹或者梯度提高迴歸樹(GBRT)是任意一個不一樣損失函數的泛化。GBRT是一個靈敏的而且高效程序,能夠用在迴歸和分類中。梯度提高樹模型在許多領域中都有使用,如web搜索排行榜和社會生態學中。它主要的思想是,每一次創建模型是在以前創建模型損失函數的梯度降低方向。這句話有一點拗口,損失函數(loss function)描述的是模型的不靠譜程度,損失函數越大,則說明模型越容易出錯(其實這裏有一個方差、誤差均衡的問題,可是這裏就假設損失函數越大,模型越容易出錯)。若是咱們的模型可以讓損失函數持續的降低,則說明咱們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度(Gradient)的方向上降低。
GRBT的優點:
Boosting主要是一種思想,表示「知錯就改」。而Gradient Boosting是在這個思想下的一種函數(也能夠說是模型)的優化的方法,首先將函數分解爲可加的形式(其實全部的函數都是可加的,只是是否好放在這個框架中,以及最終的效果如何)。而後進行m次迭代,經過使得損失函數在梯度方向上減小,最終獲得一個優秀的模型。值得一提的是,每次模型在梯度方向上的減小的部分,能夠認爲是一個「小」的或者「弱」的模型,最終咱們會經過加權(也就是每次在梯度方向上降低的距離)的方式將這些「弱」的模型合併起來,造成一個更好的模型。
參考:http://www.csuldw.com/2015/07/22/2015-07-22%20%20ensemble/