天天看點

內建學習 (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()
           

繼續閱讀