回歸算法原理
CART(Calssification and Regression Tree)算法是目前決策樹算法中最為成熟的一類算法,應用范圍也比較廣泛。它即可用於分類,也可用於預測。
西方預測理論一般都是基於回歸的,CART是一種通過決策樹方法實現回歸的算法,它有很多其他全局回歸算法不具有的特性。
在創建回歸模型時,樣本的取值分為觀察值和輸出值兩種,觀察值和輸出值都是連續的,不像分類函數那樣有分類標簽,只有根據數據集的數據特征來創建一個預測的模型,反映曲線的變化趨勢。在預測中,CART使用最小剩余方差(Squared Residuals Minimization)來判定回歸樹的最優划分,這個准則期望划分之后的子樹與樣本點的誤差方差最小。這樣決策樹將數據集切分成很多子模型數據,然后利用線性回歸技術來建模。如果每次切分后的數據子集仍然難以擬合,就繼續切分。在這種切分方式下創建出的預測樹,每個葉子節點都是一個線性回歸模型。這些線性回歸模型反映了樣本集合(觀測集合)中蘊含的模式,也被稱為模型書。因此,CART不僅支持整體預測,也支持局部模式的預測,並有能力從整體中找到模式,或根據模式組合成一個整體。整體與模式之間的相互結合,對於預測分析有重要的價值。
CART算法的流程:
(1)決策樹主函數:決策樹的主函數是一個遞歸函數。該函數的主要功能是按照CART的規則生長出決策樹的各個分支節點,並根據終止條件結束算法。
a.輸入需要分類的數據集和類別標簽。
b.使用最小剩余方差判定回歸樹的最優划分,並創建特征的划分節點--最小剩余方差子函數。
c.在划分節點划分數據集為兩部分--二分數據集子函數
d.根據二分數據的結果構建出新的左右節點,作為樹生長出的兩個分支。
e.檢驗是否符合遞歸的終止條件
f.將划分的新節點包含的數據集和類別標簽作為輸入,遞歸執行上述步驟。
(2)使用最小剩余方差子函數,計算數據集各列的最優划分方差、划分列、划分值。
(3)二分數據集:根據給定的分格列和分隔值將數據集一分為二,分別返回。
(4)剪枝策略:使用先剪枝和后剪枝策略對計算出的決策樹進行剪枝。
最小剩余方差法
在回歸樹種,數據集均為連續性的。連續數據的處理方法與離散數據不同,離散數據是按每個特征的取值來划分,而連續特征則要計算出最優划分點。但在連續數據交集上計算線性相關度非常簡單,算法思想來源於最小二乘法。
CART選擇最優划分節點的方法--最小剩余方差法。
首先求取划分數據列的均值和總方差。總方差的計算方法有兩種
1.求取均值std,計算每個數據點與std的方差,然后將n個點求和。
2.求取方差var,然后var_sum = var * n, n為數據集數據數目
每次最佳分支特征的選取過程如下:
1.先令最佳方差為無限大:bestVar = inf.
2.依次遍歷所有特征列及每個特征列的所有樣本點(這是一個二重循環),在每個樣本點上二分數據集。
3.計算二分數據集后的總方差currentVar(划分后左、右數據集的總方差之和)。如果currentVar < bestVar,則bestVar = currentVar.
4.返回計算的最優分支特征列、分支特征值(連續特征則為划分點的值),以及左右分支子數據集到主程序。
模型樹
使用CART進行預測是把葉子節點設定為一系列的分段線性函數,這些分段線性函數是對原數據曲線的一種模擬,每個線性函數都被稱為一顆模型樹。
模型樹的優點如下:
1.一般而言,樣本總體的重復性不會很高,但局部模式經常重復,也就是我們所說的歷史不會簡單的重復,但會重演。模型比總體對未來的預測而言更有用。
2.模型給出了數據的范圍,它可能是一個時間范圍,也可能是一個空間范圍;而且模型還給出了變化的趨勢,可以是曲線,也可以是直線,這依賴於使用的回歸算法。這些因素使模型具有很強的可解釋性。
3.傳統的回歸方法,無論是線性回歸還是非線性回歸,都不如模型樹包含的信息豐富,因此模型樹具有更高的預測准確度。
剪枝策略
因為使用了連續性數據,CART可以生長出大量的分支樹,為了避免過擬合的問題,預測樹采用了剪枝的方法。剪枝方法有很多,主流的方法有兩種:先剪枝和后剪枝。
先剪枝給出一個預定義的划分閾值,當節點的划分子集某個標准低於預定義的閾值時,子集划分將終止。但是選取適當的閾值比較困難,過高會導致過擬合,而過低會導致欠擬合,因此需要人工反復地訓練樣本才能得到很好的效果。優勢:由於不必生成整棵決策樹,且算法簡單、效率高,適合大規模問題的粗略估計。
后剪枝,也稱為悲觀剪枝。后剪枝是指在完全生成的決策樹上,根據一定的規則標准,剪掉樹中不具備一般代表性的子樹,使用葉子節點取而代之,進而形成一課規模較小的新樹。后剪枝遞歸估算每個內部節點所覆蓋樣本節點的誤判率,也就是計算決策樹內部節點的誤判率。如果內部節點的誤判率低於這個值,就將其變成葉子節點,該葉子節點的類別標簽由原內部節點的最優葉子節點所決定。
代碼實現:sklearn-CART預測
# cart決策樹 import matplotlib.pyplot as plt from numpy import * from sklearn.tree import DecisionTreeClassifier # 加載數據集 def loadDataSet(fileName): X = []; Y = [] fr = open(fileName, 'r') content = fr.read() fr.close() rowlist = content.splitlines() # 按行轉換為一維表 recordlist = array([row.split("\t") for row in rowlist if row.strip()]) for line in recordlist: line = array(line) X.append(float(line[0])) Y.append(float(line[-1])) return X, Y def plotfigure(X, X_test, y, yp): plt.figure() plt.scatter(X, y, c = "k", label = "data") plt.plot(X_test, yp, c = "r", label = "max_depth=5", linewidth = 2) plt.xlabel("data") plt.ylabel("target") plt.title("Decision Tree Regression") plt.legend() plt.show() x = linspace(-5, 5, 200) # test1 siny = sin(x) # 給出y與x的基本關系 X = mat(x).T y = siny * 1000 + random.rand(1, len(siny)) * 1.5 * 1000 # 加入噪聲的點集 y = y.tolist()[0] y = array(y, dtype=int) print(y) clf = DecisionTreeClassifier(max_depth=4) # max_depth選取最大的樹深度,類似先剪枝 clf.fit(X, y) # predict X_test = arange(-5.0, 5.0, 0.05)[:, newaxis] yp = clf.predict(X_test) plotfigure(array(X), array(X_test), y, yp)
結果如下