整合學習 (AdaBoost、Bagging、隨機森林 ) python 預測
首先明確一下回歸與分類的區別:
分類和迴歸的區別在於輸出變數的型別。
定量輸出稱為迴歸,或者說是連續變數預測;
定性輸出稱為分類,或者說是離散變數預測。
舉個例子:
預測明天的氣溫是多少度,這是一個迴歸任務;
預測明天是陰、晴還是雨,就是一個分類任務;
決策樹三種演算法特性對比:
ID3特點:
(1)節點優先選取採用資訊增益作為標準。
(2)容易造成過度擬合(傾向於選擇分類多的節點)
(3)容易處理標稱型資料(主要用於分類),但是很難處理連續型 資料(主要用於迴歸)。
4.5特點:
(1)既能處理標稱型資料,又能連續型資料。為了處理連續型資料,該演算法在相應的節點使用一個屬性的閾值,利用閾值將樣本劃分成兩部分。
(2)能處理缺失了一些屬性的資料。該演算法允許屬性值缺失時被標記為?,屬性值缺失的樣本在計算熵增益時被忽略。
(3)構造完成後可以剪枝。合併相鄰的無法產生大量資訊增益的葉節點,消除過渡匹配問題。
Cart特點:
(1)CART稱為分類決策樹,classification and regression tree,既能處理分類問題,又能處理迴歸問題。
(2)與ID3不能直接處理連續型特徵不同的是,CART使用二元切分,即使用一個屬性閾值對樣本資料進行劃分。劃分的標準除了使用熵增益外,還有基尼純淨度(Gini impurity)和方差縮減(variance reduction)(用於迴歸)。
整合學習(Boosting,Bagging和隨機森林)
整合學習分為2類:
(1)個體學習器間存在強大依賴關係、必須序列生成的序列化方法,代表演算法:Boosting;
(2)個體學習器間不存在依賴關係、可同時生成的並行化方法,代表演算法Bagging和“隨機森林”RF。
1.Boosting是一族可以將若學習器提升為強學習器的演算法,代表演算法為AdaBoost。
該演算法的工作機制:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整,使得先前基學習器做錯的訓練樣本在後續受到更多關注,然後基於調整後的樣本分佈來訓練下一個基學習器。如此反覆進行,直至學習器數目達到事先指定的值T,最終將這T個基學習器進行加權結合。
2.Bagging是並行式整合學習代表方法。
基於“自助取樣法”(bootstrap sampling)。自助取樣法機制:給定包含m個樣本的資料集,我們先隨機取出一個樣本放入取樣集中,再把該樣本放回初始資料集,使得下一次取樣時該樣本還會被採到。這樣,經過m次樣本採集,我們得到包含m個樣本的取樣集。取樣集中,有的樣本出現過很多次,有的沒有出現過。Bagging機制:我們取樣出T個含m個樣本的取樣集。然後基於每個取樣集訓練出一個學習器,再將學習器進行結合。對分類任務使用投票法,對迴歸任務採用平均值法。
3.隨機森林RF:
以決策樹為基學習器構建Bagging整合,進一步在決策樹的訓練過程中引入隨機屬性選擇。傳統決策樹在選擇劃分屬性的時候是在當前節點所有的屬性集合中選出一個左右屬性進行劃分;而在RF中,對基決策樹的每個節點,先從該節點的屬性集合中隨機選擇一個包含k個屬性的子集,然後再從這個子集中選擇一個最優屬性用於劃分。這裡的引數k控制了隨機性的引入程度。如果k=d(全部屬性集),則基決策樹的構建=傳統決策樹構建。如果k=1,基決策樹每個節點隨機選擇一個屬性進行劃分。一般推薦k=log2d。
4.AdaBoost VS Bagging:AdaBoost只適用於二分類任務,Bagging適用於多分類、迴歸等任務。
5.Bagging VS 隨機森林:Bagging中基學習器的“多樣性”通過樣本擾動(對初始訓練集取樣)而獲得;隨機森林中基學習器的“多樣性”不僅來自於樣本擾動,而且還可以通過隨機屬性擾動來獲得。這使得隨機森立的泛化效能可通過個體學習器之間差異程度的增加而進一步提升。隨機森林的使其效能很差,但隨著學習器的增加,效能很快就會變好,且強於Bagging。
迴歸樹:
迴歸樹的演算法:
1. 迴歸樹的生成:基於訓練資料集生成決策樹,儘量大點。
2. 迴歸樹剪枝:用驗證資料集對已生成的樹進行剪枝並選擇最優子樹,這時用損失函式最小作為剪枝的標準。
迴歸是為了處理預測值是連續分佈的情景,其返回值應該是一個具體預測值。迴歸樹的葉子是一個個具體的值,從預測值連續這個意義上嚴格來說,迴歸樹不能稱之為“迴歸演算法”。因為迴歸樹返回的是“一團”資料的均值,而不是具體的、連續的預測值(即訓練資料的標籤值雖然是連續的,但迴歸樹的預測值卻只能是離散的).
隨機森林概念:
森林的一個通俗解釋就是:由一組決策樹構建的複合分類器,它的特點是每個決策樹在樣本域裡使用隨機的特徵屬性進行分類劃分。最後分類時投票每棵分類樹的結論取最高票為最終分類結論。
隨機森林預測程式碼:
import numpy as np
from numpy import *
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score, ShuffleSplit
import pandas as pd
origin_data = pd.read_excel(r"C:\Users\***\Desktop\31天測試資料.xlsx")
data_frame=origin_data
rf=RandomForestRegressor()
rf.fit(data_frame.ix[0:49,0:29],data_frame.ix[:,29:30])
res=rf.predict(data_frame.ix[:,1:30])
#計算平均誤差構造矩陣
minus=array(res)-array(origin_data[[30]])
mape=mean(abs(minus))/mean(array(origin_data[[30]]))
#作圖圖
plt1=plt.plot(range(0,48),res,'r',label='predict data mape={0:0.2f}%'.format(mape*100))
plt2=plt.plot(range(0,48),origin_data[[30]],'b',label='real data')
plt.xlabel("dimension(total 48 dimensions)")
plt.ylabel("value")
plt.legend(loc="lower right")
plt.show()