機器學習中的決策樹
現代機器學習算法正在改變我們的日常生活。例如,像BERT這樣的大型語言模型正在為谷歌搜索提供支持,GPT-3正在為許多高級語言應用程序提供支持。
另一方面,今天構建復雜的機器學習算法比以往任何時候都容易得多。然而,無論機器學習算法有多么復雜,都屬于把它們歸納為以下學習類別之一:
監督學習
無監督學習
半監督學習
強化學習
其實,決策樹算是最古老的有監督的機器學習算法之一,可以解決廣泛的現實問題。研究表明,決策樹算法的最早發明可以追溯到1963年。
接下來,讓我們深入研究一下這個算法的細節,看看為什么這類算法今天仍然廣為流行。
什么是決策樹?
決策樹算法是一種流行的有監督機器學習算法,因為它處理復雜數據集的方法相對簡單得多。決策樹的名字來源于它們與“樹”這種結構的相似性;樹結構包括以節點和邊緣形式存在的根、枝和葉等幾個組成部分。它們用于決策分析,很像一個基于if-else的決策流程圖,這些決策會產生所需的預測。決策樹能夠學習這些if-else決策規則,從而拆分數據集,最后生成樹狀數據模型。
決策樹在分類問題的離散結果預測和回歸問題的連續數值結果預測中得到了應用。多年來科學家們開發出了許多不同的算法,如CART、C4.5和ensemble算法,如隨機森林和梯度增強樹等。
剖析決策樹的各個組成部分
決策樹算法的目標是預測輸入數據集的結果。樹的數據集共劃分為三種形式:屬性、屬性的值和要預測的種類。與任何監督學習算法一樣,數據集被劃分為訓練集和測試集兩種類型。其中,訓練集定義了算法學習并應用于測試集的決策規則。
在聚集介紹決策樹算法的步驟之前,讓我們先來了解一下決策樹的組成部分:
根節點:它是決策樹頂部的起始節點,包含所有屬性值。根節點根據算法學習到的決策規則分成決策節點。
分支:分支是對應于屬性值的節點之間的連接器。在二進制拆分中,分支表示真路徑和假路徑。
決策節點/內部節點:內部節點是根節點和葉節點之間的決策節點,對應于決策規則及其答案路徑。節點表示問題,分支顯示基于這些問題的相關答案的路徑。
葉節點:葉節點是表示目標預測的終端節點。這些節點不會進一步分裂。
以下是決策樹及其上述組件的可視化表示,決策樹算法經過以下步驟以達到所需的預測:
算法從具有所有屬性值的根節點開始。
根節點根據算法從訓練集中學習到的決策規則分成決策節點。
基于問題及其答案路徑,通過分支/邊緣傳遞內部決策節點。
繼續前面的步驟,直到到達葉節點或使用了所有屬性。
為了在每個節點上選擇最佳屬性,將根據以下兩個屬性選擇度量之一進行拆分:
??基尼系數??(Gini index)測量基尼不純度(Gini Impurity),以指示算法對隨機類別標簽進行錯誤分類的可能性。
??信息增益??測量分割后熵的改善,以避免預測類的50/50分割。熵是給定數據樣本中不純度的數學度量。決策樹中的混沌狀態由接近50/50的劃分表示。
使用決策樹算法的花卉分類案例
在了解了上述基礎知識后,接下來讓我們著手實現一個應用案例。在本文中,我們將使用Scikit學習庫在Python中實現決策樹分類模型。
關于數據集的簡單說明
本教程的數據集是一個鳶尾花數據集。Scikit開源庫中已經內置了這個數據集,所以不需要開發人員再從外部加載它。該數據集共包括四個鳶尾屬性及相應的屬性值,這些屬性將被輸入到模型中,以便預測三種類型的鳶尾花之一。
數據集中的屬性/特征:萼片長度、萼片寬度、花瓣長度、花瓣寬度。
數據集中的預測標簽/花卉類型:Setosis、Versicolor、Virginica。
接下來,將給出決策樹分類器基于python語言實現的分步代碼說明。
導入庫
首先,通過下面的一段代碼導入執行決策樹實現所需的庫。
import pandas as pdimport numpy as npfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifier
加載鳶尾花(Iris)數據集
以下代碼展示了使用load_iris函數加載存儲到data_set變量中的sklearn.dataset庫中的鳶尾花數據集。接下來的兩行代碼將實現打印鳶尾花類型和特征信息。
data_set = load_iris()print('Iris plant classes to predict: ', data_set.target_names)print('Four features of iris plant: ', data_set.feature_names)
分離屬性和標簽
下面的代碼行實現了將花的特性和類型信息分離開來,并將它們存儲在相應的變量中。其中,shape[0]函數負責確定存儲在X_att變量中的屬性數;數據集中的屬性值總數為150。
#提取花的特性和類型信息X_att = data_set.datay_label = data_set.targetprint('數據集中總的樣本數:', X_att.shape[0])
其實,我們還可以創建一個可視化表格來展示數據集中的一部分屬性值,方法是將X_att變量中的值添加到panda庫中的DataFrame函數中即可。
data_view=pd.DataFrame({ 'sepal length':X_att[:,0], 'sepal width':X_att[:,1], 'petal length':X_att[:,2], 'petal width':X_att[:,3], 'species':y_label})data_view.head()
拆分數據集
以下代碼展示了使用train_test_split函數將數據集拆分為訓練集和測試集兩部分。其中,此函數中的random_state參數用于為函數提供隨機種子,以便在每次執行時為給定數據集提供相同的結果;test_size表示測試集的大小;0.25表示拆分后測試數據占25%而訓練數據占75%。
#數據集拆分為訓練集和測試集兩部分X_att_train, X_att_test, y_label_train, y_label_test = train_test_split(X_att, y_label, random_state = 42, test_size = 0.25)
應用決策樹分類函數
下面的代碼通過使用DecisionTreeClassifier函數創建一個??分類模型??來實現一棵決策樹,分類標準設置為“entropy”方式。該標準能夠將屬性選擇度量設置為信息增益(Information gain)。然后,代碼將模型與我們的屬性和標簽訓練集相匹配。
#應用決策樹分類器clf_dt = DecisionTreeClassifier(criterion = 'entropy')clf_dt.fit(X_att_train, y_label_train)
計算模型精度
下面的代碼負責計算并打印決策樹分類模型在訓練集和測試集上的準確性。為了計算準確度分數,我們使用了predict函數。測試結果是:訓練集和測試集的準確率分別為100%和94.7%。
print('Training data accuracy: ', accuracy_score(y_true=y_label_train, y_pred=clf_dt.predict(X_att_train)))print('Test data accuracy: ', accuracy_score(y_true=y_label_test, y_pred=clf_dt.predict(X_att_test)))
真實世界中的決策樹應用程序
當今社會,機器學習決策樹在許多行業的決策過程中都得到廣泛應用。其中,決策樹的最常見應用首先是在金融和營銷部門,例如可用于如下一些子領域:
貸款批準
支出管理
客戶流失預測
新產品的可行性分析,等等。
如何改進決策樹?
作為本文決策樹主題討論的總結,我們有充分的理由安全地假設:決策樹的可解釋性仍然很受歡迎。決策樹之所以容易理解,是因為它們可以被人類以可視化方式展現并便于解釋。因此,它們是解決機器學習問題的直觀方法,同時也能夠確保結果是可解釋的。機器學習中的可解釋性是我們過去討論過的一個小話題,它也與即將到來的人工智能倫理主題存在密切聯系。
與任何其他機器學習算法一樣,決策樹自然也可以加以改進,以避免過度擬合和出現過于偏向于優勢預測類別。剪枝和ensembling技術是克服決策樹算法缺點方案最常采用的方法。決策樹盡管存在這些缺點,但仍然是決策分析算法的基礎,并將在機器學習領域始終保持重要位置。