機器學習-Scikit-Learn與回歸樹


 

回歸算法原理

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)

 

結果如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM