
8.3 從網上下載下傳或自己程式設計實作 AdaBoost,以不剪枝抉策樹為基學習器,在西瓜資料集 3.0α 上訓練一個 AdaBoost 內建,并與圖 8.4進行比較。
答:
代碼在:
https://github.com/han1057578619/MachineLearning_Zhouzhihua_ProblemSets/tree/master/ch8--%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0這裡題目有點問題,如果以不剪枝決策樹為基學習器,可以生成一個完美符合資料的決策樹,此時AdaBoost就沒意義了,因為第一顆樹錯誤率就為0了,樣本權重也不會發生改變。
所有這裡代碼是限定樹的深度為2,但訓練到第四顆樹,錯誤率就已經到0了,下圖給出來的決策邊界,其實基本上就是第四顆樹的決策了,因為錯誤率為0,其權重太大。
8.4 GradientBoosting [Friedman, 2001] 是一種常用的 Boosting 算法,試析其與 AdaBoost 的異同.
這個問題,網上已經有很多總結了:
Gradient Boosting和其它Boosting算法一樣,通過将表現一般的數個模型(通常是深度固定的決策樹)組合在一起來內建一個表現較好的模型。抽象地說,模型的訓練過程是對一任意可導目标函數的優化過程。通過反複地選擇一個指向負梯度方向的函數,該算法可被看做在函數空間裡對目标函數進行優化。是以可以說Gradient Boosting = Gradient Descent + Boosting。
和AdaBoost一樣,Gradient Boosting也是重複選擇一個表現一般的模型并且每次基于先前模型的表現進行調整。不同的是,AdaBoost是通過提升錯分資料點的權重來定位模型的不足而Gradient Boosting是通過算梯度(gradient)來定位模型的不足。是以相比AdaBoost, Gradient Boosting可以使用更多種類的目标函數。
參考:機器學習算法中GBDT與Adaboost的差別與聯系是什麼?
8.5 試程式設計實作 Bagging,以決策樹樁為基學習器,在西瓜資料集 3.0α 上訓練一個 Bagging 集戚,井與圖 8.6 進行比較.
代碼在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets
以決策樹樁作為Bagging的基學習器,效果不太好。嘗試了下,設定基學習器數量為21時算是拟合最好的,決策邊界如下:
8.6 試析 Bagging 通常為何難以提升樸素貝葉斯分類器的性能.
書中P177和P179提到過:
從偏差—方差分解的角度看, Boosting 主要關住降低偏差,是以 Boosting能基于泛化性能相當弱的學習器建構出很強的內建.
從偏差—方差分解的角度看, Bagging 主要關注降低方差,是以它在不剪枝決策樹、神經網絡等易受樣本擾動的學習器上效用更為明顯.
樸素貝葉斯中假設各特征互相獨立,已經是很簡化模型,其誤差主要是在于偏差,沒有方差可降。
ps.同樣道理,這也是為什麼8.5中,以決策樹樁為基學習器的Bagging時,效果很差的原因;決策樹樁同樣是高偏差低方差的模型。
個人了解:
- 方差大(偏差低)的模型往往是因為對訓練資料拟合得過好,模型比較複雜,輸入資料的一點點變動都會導緻輸出結果有較大的差異,它描述的是模型輸出的預測值相比于真實值的離散程度,方差越大,越離散,是以為什麼Bagging适合以不剪枝決策樹、神經網絡這些容易過拟合的模型為基學習器;
- 偏差大(方差低)的模型則相反,往往因為對訓練資料拟合得不夠,模型比較簡單,輸入資料發生變化并不會導緻輸出結果有多大改變,它描述的是預測值和和真實值直接的差距,偏差越大,越偏離真實值。
8.7 試析随機森林為何比決策樹 Bagging 內建的訓練速度更快.
決策樹的生成過程中,最耗時的就是搜尋最優切分屬性;随機森林在決策樹訓練過程中引入了随機屬性選擇,大大減少了此過程的計算量;因而随機森林比普通決策樹Bagging訓練速度要快。