scikit-learn学习笔记(六)Decision Trees(决策树)
決策樹(DTS)是一種非參數(shù)監(jiān)督學習用于方法分類和回歸。目標是創(chuàng)建一個模型,通過學習從數(shù)據(jù)特征推斷的簡單決策規(guī)則來預測目標變量的值。
例如,在下面的示例中,決策樹從數(shù)據(jù)中學習,以一組if-then-else決策規(guī)則近似正弦曲線。樹越深,決策規(guī)則和鉗工模型越復雜。
決策樹的一些優(yōu)點是:
- 簡單的理解和解釋。樹木可視化。
- 需要很少的數(shù)據(jù)準備。其他技術(shù)通常需要數(shù)據(jù)歸一化,需要創(chuàng)建虛擬變量,并刪除空值。請注意,此模塊不支持缺少值。
- 使用樹的成本(即,預測數(shù)據(jù))在用于訓練樹的數(shù)據(jù)點的數(shù)量上是對數(shù)的。
- 能夠處理數(shù)字和分類數(shù)據(jù)。其他技術(shù)通常專門用于分析只有一種變量類型的數(shù)據(jù)集。有關(guān)更多信息,請參閱算法。
- 能夠處理多輸出問題。
- 使用白盒模型。如果給定的情況在模型中可以觀察到,那么條件的解釋很容易用布爾邏輯來解釋。相比之下,在黑盒子模型(例如,在人造神經(jīng)網(wǎng)絡(luò)中),結(jié)果可能更難解釋。
- 可以使用統(tǒng)計測試驗證模型。這樣可以說明模型的可靠性。
- 即使其假設(shè)被數(shù)據(jù)生成的真實模型有些違反,表現(xiàn)良好。
決策樹的缺點包括:
- 決策樹學習者可以創(chuàng)建不能很好地推廣數(shù)據(jù)的過于復雜的樹。這被稱為過擬合。修剪(不支持當前)的機制,設(shè)置葉節(jié)點所需的最小樣本數(shù)或設(shè)置樹的最大深度是避免此問題的必要條件。
- 決策樹可能不穩(wěn)定,因為數(shù)據(jù)的小變化可能會導致完全不同的樹生成。通過使用合奏中的決策樹來減輕這個問題。
- 在最優(yōu)性的幾個方面甚至簡單的概念中,學習最優(yōu)決策樹的問題已知是NP完整的。因此,實際的決策樹學習算法基于啟發(fā)式算法,例如在每個節(jié)點進行局部最優(yōu)決策的貪心算法。這樣的算法不能保證返回全局最優(yōu)決策樹。這可以通過在綜合學習者中訓練多個樹木來緩解,其中特征和樣本隨機抽樣取代。
- 有一些難以學習的概念,因為決策樹不能很容易地表達它們,例如XOR,奇偶校驗或復用器問題。
- 如果某些類占主導地位,決策樹學習者會創(chuàng)造有偏見的樹木。因此,建議在擬合之前平衡數(shù)據(jù)集與決策樹。
?
分類?
DecisionTreeClassifier?是能夠?qū)?shù)據(jù)集執(zhí)行多類分類的類。
與其他分類器一樣,DecisionTreeClassifier將輸入兩個數(shù)組:數(shù)組X,稀疏或密集,大小為[n_samples,n_features],保存訓練樣本,以及整數(shù)值的數(shù)組Y,大小[n_samples],持有類標簽 訓練樣本:
| >>> from sklearn import tree >>> X = [[0, 0], [1, 1]] >>> Y = [0, 1] >>> clf = tree.DecisionTreeClassifier() >>> clf = clf.fit(X, Y) |
安裝后,可以使用該模型來預測樣品類別:
| >>> clf.predict([[2., 2.]]) array([1]) |
或者,可以預測每個類的概率,這是葉中相同類的訓練樣本的分數(shù):
| >>> clf.predict_proba([[2., 2.]]) array([[ 0.,? 1.]]) |
DecisionTreeClassifier?能夠二進制(其中標簽是[-1,1])分類和多類(其中標簽是[0,...,K-1])分類。
使用Iris數(shù)據(jù)集,我們可以構(gòu)造一個樹,如下所示:
| >>> from sklearn.datasets import load_iris >>> from sklearn import tree >>> iris = load_iris() >>> clf = tree.DecisionTreeClassifier() >>> clf = clf.fit(iris.data, iris.target) |
經(jīng)過訓練,我們可以使用導出器以Graphviz格式導出樹export_graphviz?。以下是在整個虹膜數(shù)據(jù)集上訓練的樹的示例導出:
| >>> with open("iris.dot", 'w') as f: ...???? f = tree.export_graphviz(clf, out_file=f) |
然后我們可以使用的Graphviz的dot工具來創(chuàng)建一個PDF文件(或任何其他支持的文件類型):?dot?-Tpdf?iris.dot?-o?iris.pdf
| >>> import os >>> os.unlink('iris.dot') |
或者,如果我們安裝了Python模塊pydotplus,我們可以直接在Python中生成PDF文件(或任何其他支持的文件類型):
| >>> import pydotplus >>> dot_data = tree.export_graphviz(clf, out_file=None) >>> graph = pydotplus.graph_from_dot_data(dot_data) >>> graph.write_pdf("iris.pdf") |
export_graphviz出口也支持多種美學選項,包括可以通過類著色節(jié)點(或值回歸)和如果需要的話使用顯式的變量和類名稱。IPython筆記本還可以使用Image()函數(shù)內(nèi)聯(lián)渲染這些圖:
| >>> from IPython.display import Image? >>> dot_data = tree.export_graphviz(clf, out_file=None, ?????????????????????????feature_names=iris.feature_names,? ?????????????????????????class_names=iris.target_names,? ?????????????????????????filled=True, rounded=True,? ?????????????????????????special_characters=True)? >>> graph = pydotplus.graph_from_dot_data(dot_data)? >>> Image(graph.create_png()) |
安裝后,可以使用該模型來預測樣品類別:
| >>> clf.predict(iris.data[:1, :]) array([0]) |
或者,可以預測每個類的概率,這是葉中相同類的訓練樣本的分數(shù):
| >>> clf.predict_proba(iris.data[:1, :]) array([[ 1.,? 0.,? 0.]]) |
回歸
決策樹也可以應(yīng)用于回歸問題,使用?DecisionTreeRegressor類。
如在分類設(shè)置中,擬合方法將作為參數(shù)數(shù)組X和y,只有在這種情況下,y預期具有浮點值而不是整數(shù)值:
>>> from sklearn import tree >>> X = [[0, 0], [2, 2]] >>> y = [0.5, 2.5] >>> clf = tree.DecisionTreeRegressor() >>> clf = clf.fit(X, y) >>> clf.predict([[1, 1]]) array([ 0.5])復雜性
一般來說,構(gòu)建平衡二叉樹的運行時間成本是?查詢時間?。雖然樹構(gòu)造算法試圖產(chǎn)生平衡的樹,但它們并不總是平衡的。假設(shè)子樹保持近似平衡,每個節(jié)點的成本包括搜索,以找到提供熵最大減少的特征。這在每個節(jié)點都有成本?,從而導致整個樹上的總成本(通過將每個節(jié)點的成本相加)?。
Scikit-learning為決策樹的構(gòu)建提供了更有效的實施。一個天真的實現(xiàn)(如上所述)將重新計算沿著給定特征的每個新分割點的類標簽直方圖(用于分類)或平均值(用于回歸)。在所有相關(guān)樣本上預定特征,并保留正在運行的標簽數(shù)量,將降低每個節(jié)點的復雜度,從而導致總成本。這是所有基于樹的算法的選項。默認情況下,它會打開梯度提升,一般來說,訓練更快,但關(guān)閉所有其他算法,因為它傾向于減緩訓練深度樹上的訓練。
實用竅門
- 決策樹傾向于對具有大量特征的數(shù)據(jù)進行過度整合。獲取正確的樣本比例數(shù)量是很重要的,因為在高維空間中具有少量樣本的樹很可能會過度使用。
- 考慮事先進行降維(PCA,?ICA或特征選擇),使您的樹更好地找到具有歧視性的特征。
- 通過使用該export?功能可視化您正在訓練的樹。使用max_depth=3作為初始樹深度以獲取樹是如何配合你的數(shù)據(jù)的感覺,再增加深度。
- 請記住,填充樹的樣本數(shù)量是樹生長到的每個附加級別的兩倍。使用max_depth控制樹的大小,以防止過度擬合。
- 使用min_samples_split或min_samples_leaf控制葉節(jié)點的樣本數(shù)。一個非常小的數(shù)字通常意味著樹將被超配,而大量將阻止樹學習數(shù)據(jù)。嘗試min_samples_leaf=5作為初始值。如果樣本大小變化很大,則浮點數(shù)可以用作這兩個參數(shù)中的百分比。兩者之間的主要區(qū)別在于min_samples_leaf保證葉片中最少的樣本數(shù)量,同時min_samples_split可以創(chuàng)建任意小的葉子,盡管min_samples_split在文獻中更為常見。
- 在訓練前平衡您的數(shù)據(jù)集,以防止樹木偏向于主導階層。可以通過從每個類中抽取相等數(shù)量的樣本,或者優(yōu)選地通過將每個類的樣本權(quán)重(sample_weight)的和歸一化為相同的值來進行類平衡。還要注意的是,基于權(quán)重的預修剪標準,比如min_weight_fraction_leaf不了解樣本權(quán)重的標準,對主導類別的偏向偏小min_samples_leaf。
- 如果樣本被加權(quán),則使用基于重量的預剪枝準則來優(yōu)化樹結(jié)構(gòu)將更容易,例如min_weight_fraction_leaf確保葉節(jié)點至少包含樣本權(quán)重總和的一小部分。
- 所有決策樹都在np.float32內(nèi)部使用陣列。如果培訓數(shù)據(jù)不是這種格式,將會生成數(shù)據(jù)集的副本。
- 如果輸入矩陣X非常稀疏,則在調(diào)用預測csc_matrix之前,建議在調(diào)用擬合和稀疏csr_matrix之前將其轉(zhuǎn)換為稀疏?。當特征在大多數(shù)樣本中具有零值時,與密集矩陣相比,訓練時間可以比稀疏矩陣輸入快幾個數(shù)量級。
樹算法:ID3,C4.5,C5.0和?CART
所有各種決策樹算法是什么,它們之間有什么不同?哪一個在scikit學習中實現(xiàn)?
ID3(Iterative Dichotomiser 3)是由羅斯奎因蘭(Ros Quinlan)于1986年開發(fā)的。該算法創(chuàng)建一個多路樹,找到每個節(jié)點(即以貪婪的方式)分類特征,這將產(chǎn)生分類目標的最大信息增益。樹生長到最大尺寸,然后通常應(yīng)用修剪步驟,以提高樹的概括性來看待數(shù)據(jù)的能力。
C4.5是ID3的后繼者,并通過動態(tài)定義將連續(xù)屬性值分割成一組離散的間隔的離散屬性(基于數(shù)字變量),消除了特征必須是分類的限制。C4.5將訓練好的樹(即ID3算法的輸出)轉(zhuǎn)換成if-then規(guī)則的集合。然后評估每個規(guī)則的這些準確性以確定應(yīng)用它們的順序。如果規(guī)則的準確性沒有改善,則通過刪除規(guī)則的前提條件來完成修剪。
C5.0是Quinlan根據(jù)專有許可證發(fā)布的最新版本。它使用更少的內(nèi)存,并建立比C4.5更小的規(guī)則集,同時更準確。
CART(分類和回歸樹)與C4.5非常相似,但它不同之處在于它支持數(shù)值目標變量(回歸),并且不計算規(guī)則集。CART使用在每個節(jié)點產(chǎn)生最大信息增益的特征和閾值來構(gòu)造二叉樹。
scikit-learn使用CART算法的優(yōu)化版本。
?數(shù)學公式
給定訓練向量i = 1,...,l和標簽向量?,決策樹遞歸地分割空間,使得具有相同標簽的樣本被分組在一起。
讓節(jié)點上的數(shù)據(jù)表示。對于每個候選分割由特征和閾值,將數(shù)據(jù)劃分為?與子集
在雜質(zhì)用的雜質(zhì)函數(shù)被計算?,這取決于任務(wù)的選擇正在解決(分類或回歸)
選擇最小化雜質(zhì)的參數(shù)
遞歸的子集,并?直至達到所允許的最大深度,?或。
分類標準
如果一個目標是采用值0,1,...,K-1的分類結(jié)果,對于節(jié)點,表示具有?觀察的區(qū)域,
是節(jié)點中k類觀測的比例?
雜質(zhì)的常見措施是基尼
交叉熵
和錯誤分類
回歸標準
如果目標是連續(xù)值,則對于表示具有觀測值的區(qū)域的節(jié)點,最小化的共同標準是均方誤差
總結(jié)
以上是生活随笔為你收集整理的scikit-learn学习笔记(六)Decision Trees(决策树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新一代大数据处理引擎 Apache Fl
- 下一篇: 朴素贝叶斯方法(Naive Bayes)