每一個機器學習算法有其自身的優點和實現的理由。決策樹算法就是其中一種應用廣泛的算法。決策樹是一種上下顛倒的樹,它根據數據中存在的條件做出決策。現在問題來了,為什麼是決策樹?為什麼不是其他算法呢?答案很簡單,因為當數據基本上是分類的,並且取決於條件時,決策樹會給我們驚人的結果。仍然困惑嗎?讓我們來簡單地說明這一點。讓我們以一個數據集為例,假設我們正在使用一個決策樹來構建我們的最終模型。在內部,算法會做出一個決策樹就像下麵給出的那樣。
在上述樹的表示中,諸如工資、辦公地點和設施等條件繼續分裂成分支,直到決定一個人是應該接受還是拒絕這份工作。這些條件被稱為內部節點,它們分裂後得到一個決定,這個決定被稱為葉。
兩種決策樹
- 分類
- 回歸
當數據的結果本質上是離散的或分類的,如班級中學生的存在或缺席,一個人的死亡或幸存,貸款的批準等,分類樹應用於數據,但當數據的結果本質上是連續的,如價格,人的年齡,在酒店的停留時間等。
假設
盡管決策樹非常簡單,但它仍然包含如下假設:
- 連續變量的離散化是必需的
- 用於訓練的數據應該被視為根數據
- 記錄的分發是基於屬性值以遞歸的方式完成的。
決策樹中的算法
不同編程語言的不同庫使用特定的默認算法來構建決策樹,但數據科學家很難理解所使用算法之間的差異。這裏我們將討論這些算法。
- ID3
ID3將整個集合S作為根節點生成樹。然後對每個屬性進行迭代,並將數據分成稱為子集的片段,以計算該屬性的熵或信息增益。分裂後,算法利用每個子集,將之前未取的屬性放入迭代的子集中。這並不是一種理想的算法,因為它通常會對數據進行過擬合,並且對於連續變量,拆分數據會很耗時。
2.C4.5
與ID3相比,它是相當先進的,因為它考慮的數據是分類樣本。根據歸一化的信息增益進行分割,以信息增益最高的特征進行決策。與ID3不同的是,它可以非常有效地處理連續和離散屬性,並且在構建樹之後,它通過刪除所有重要性較低的分支來進行修剪。
3.車
CART可以執行分類和回歸任務,它們通過考慮基尼指數來創建決策點,不像ID3或C4.5使用信息增益和增益比進行分割。對於分割,CART采用貪心算法,其目標僅是降低代價函數。分類時,使用基尼指數等代價函數來表示葉節點的純度。對於回歸,算法選擇和平方誤差作為代價函數,找出最佳預測。
4.CHAID
CHAID或卡方自動交互檢測器是一種可以處理任何類型變量的過程,無論是名義變量、序數變量還是連續變量。在回歸樹中使用f檢驗,在分類樹中使用卡方檢驗。在這種分析中,連續預測因子被分成相等數量的觀察值,直到得到一個結果。與其他算法相比,它在實際問題中的應用和采用非常少。
5.火星
MARS(多元自適應回歸樣條曲線)是一種專門用於數據基本上是非線性的回歸問題的分析方法。
應用程序
作為決策樹它們本質上非常簡單,任何高級管理人員都可以很容易地解釋,它們被廣泛應用於各行各業和學科,如
- 在醫療保健行業
在醫療保健行業,決策樹可以根據年齡、體重、性別等因素判斷患者是否患有某種疾病。其他應用,如根據成分、生產周期等因素來決定藥物的效果。此外,在診斷醫療報告時,決策樹可能非常有效。
上麵的流程圖代表了一個決策樹,它決定了在進行手術或開了藥之後是否有治愈的可能
2.在銀行業。
一個人是否有資格獲得貸款可以根據他的經濟狀況、家庭成員、工資等在決策樹上決定。其他的應用可能包括信用卡欺詐、銀行計劃和優惠、貸款違約等,這些都可以通過使用適當的決策樹來防止。
上麵的樹表示一個人是否可以根據他的財務狀況獲得貸款的決定。
3.在教育部門
在高等院校,學生的入圍名單可以根據他的成績、出勤率、綜合成績等來決定。決策樹還可以決定大學現有教師的整體提升策略。
上麵的樹根據學生之前的編程興趣來決定他是否會喜歡這門課。
在許多其他應用中,決策樹也可以作為解決問題的策略,盡管它有某些缺陷。
決策樹的優點和缺點
決策樹的優點
- 決策樹模型具有很強的解釋性,可以很容易地向高級管理人員和涉眾表示。
- 不需要數據預處理,如規範化和縮放,這減少了構建模型的工作量。
- 決策樹算法既可以處理類別數據又可以處理數值數據,與其他算法相比效率更高。
- 數據中任何缺失的值都不會影響決策樹,這就是為什麼它被認為是一種靈活的算法。
這些都是優點。但是等等。在現實世界的場景中,決策樹也缺乏某些東西,這確實是一個缺點。有些是
- 當涉及到回歸時,決策樹工作得很糟糕,因為如果數據有太多的變化,它就不能執行。
- 決策樹有時是不穩定的,不可靠的,因為數據的改變會導致決策樹進入一個糟糕的結構,這可能會影響模型的準確性。
- 如果數據沒有適當的離散化,那麼決策樹算法會給出不準確的結果,與其他算法相比,其性能會很差。
- 如果結果是相關聯的,計算就會變得複雜,而且在訓練模型時可能會消耗時間。
決策過程
決策樹在開始之前通常將整個數據視為根。然後,在特定的條件下,它開始通過分支或內部節點進行分裂,並做出決策,直到產生作為葉的結果。唯一需要知道的重要事情是,它減少了屬性中的雜質,同時在構建樹時獲取信息以實現正確的結果。
由於算法本質上很簡單,它還包含一些對數據科學家來說非常重要的參數,因為這些參數決定了決策樹在模型最終構建過程中的表現。
- 熵
它被定義為數據中存在雜質的度量。當樣本達到同質性時,熵幾乎為零,但當樣本被等分時,熵為一。熵的最小值使模型在預測方麵更好,因為它能更好地隔離類。熵的計算公式如下
這裏n是類的數量。熵趨向於在中間最大,值接近1,在末端最小,值接近0。
2.信息增益
它是一種用於泛化數據集中的雜質即熵的度量。信息增益越高,熵值越低。發生概率低的事件具有較低的熵和較高的信息,而發生概率高的事件具有較高的熵和較低的信息。計算方法為
信息增益=父母熵-和(加權% *孩子熵)
加權% =特定子節點的觀察數/總和(觀察總數
子節點)
3.基尼
它是一種錯誤分類的度量方法,當數據包含多類標簽時使用。基尼與熵相似,但計算速度比熵快得多。CART(分類和回歸樹)等算法使用基尼作為雜質參數。
4.方差的減少
當決策樹用於回歸並且輸出是連續的時,方差的減少是自然的。該算法基本上是通過方差公式對總體進行分割。
隻有當方差減小到最小值時,才選擇分裂準則。方差由基本公式計算
其中X杠是平均值,X是實際平均值,n是數值的個數。
決策樹麵臨的挑戰
決策樹可以在所有類型的分類或回歸問題中實現,但盡管有這樣的靈活性,它隻有在數據包含類別變量且它們主要依賴於條件時才能發揮最佳效果。
過度擬合
當分支涉及到重要性很低的特征時,也可能存在過擬合的可能性。有兩種方法可以避免過擬合
- 修剪
剪枝是一種將那些認為不重要的特征的枝幹砍掉的過程。它要麼從根開始,要麼從葉開始,從那裏刪除具有最流行類的節點。其他方法包括添加一個參數,以根據子樹的大小決定刪除節點。這種方法被簡單地稱為後修剪。另一方麵,預修剪是一種通過考慮更小的樣本而產生葉子來阻止樹做出決策的方法。顧名思義,應該在早期階段進行,以避免過擬合。
2.集成法或套袋增效法
采用類似隨機森林的集成方法,通過重複對訓練數據進行重采樣,構建多棵決策樹來克服過擬合問題。助推技術也是一種強大的方法,它在分類和回歸問題中都被使用,它訓練新的實例,使那些被錯誤分類的實例得到重視。AdaBoost是一種常用的增強技術。
離散化
當數據包含太多的數值時,需要離散化,因為算法無法對如此小的和快速變化的值做出決策。在訓練數據時,這樣的過程可能很耗時,而且會產生不準確的結果。
Python案例研究
我們將介紹一個用Python實現決策樹的案例研究。我們將使用一個非常流行的庫Scikit learn在Python中實現決策樹
步驟1
我們將導入數據所需的所有基本庫
進口熊貓作為pd
將numpy導入為np
進口matplotlib。Pyplot作為PLT
進口海運作為SNS
步驟2
現在我們將導入後凸數據,其中包含81例正在接受治療的患者的數據,以診斷是否存在後凸。數據集很小,所以我們不會對數據中出現的數值進行離散化。它包含以下屬性
- 年齡-以月為單位
- 數量-涉及的椎骨的數量
- 開始-手術的第一個(最上麵的)椎骨的編號。
讓我們讀一下數據。
Df = pd.read_csv(' phphosis .csv ')
現在讓我們檢查屬性和結果是什麼。
df.head ()
步驟3
數據集本質上是正常的,不需要對屬性進行進一步的預處理。因此,我們將直接將數據拆分為訓練和測試。
從sklearn。模型選擇導入train_test_split
X = df.drop('後凸畸形',軸=1)
y = df['後凸症']
X_train, X_test, y_train, y_test = train_test_split (X, y, test_size=0.30)
在這裏,我們將數據分為70%和30%用於培訓和測試。你可以定義你自己的分割比例,看看它是否對精確度有影響。
步驟4
現在我們將導入決策樹分類器來構建模型。因此,scikit learn在Python中使用。
從sklearn。樹導入DecisionTreeClassifier
dtree = DecisionTreeClassifier()
dtree.fit (X_train y_train)
步驟5
既然我們已經將訓練數據擬合到決策樹分類器中,現在是時候預測測試數據的輸出了。
預測= dtree.predict(X_test)
步驟6
現在,最後一步是評估我們的模型,並查看模型的執行情況。為此,我們使用了混淆矩陣、精度和召回率等指標。
從sklearn。指標導入classification_report, confation_matrix
打印(classification_report (y_test,預測))
從評估中,我們可以看到模型表現良好,但目前的標簽給出了40%的精度,並回憶需要改進的地方。讓我們看看錯誤分類的混淆矩陣。
打印(confusion_matrix (y_test,預測))
[[3] 17
[[3] 17
[[3 2]]
步驟7
現在模型已經建好了,但是我們還沒有看到樹。現在,scikit learn有一個內置的樹可視化庫,但我們不經常使用它。為了實現可視化,我們需要安裝pydot庫並運行以下代碼。
IPython。顯示導入
從sklearn.external . 6導入StringIO
從sklearn。樹導入export_graphviz
進口pydot
功能=列表(df.columns[1:])
dot_data = StringIO()
export_graphviz (dtree out_file = dot_data feature_names =特性,= True,圓= True)
圖= pydot.graph_from_dot_data(dot_data.getvalue())
圖像(圖[0].create_png ())
運行上述代碼後,我們得到如下所示的樹。
R。
現在我們將使用R在相同的數據集上構建一個決策樹。
下麵的數據集展示了如何使用R創建兩種類型的決策樹,即分類和回歸決策樹。第一個決策樹幫助根據花瓣的長度和寬度對花朵的類型進行分類,而第二個決策樹專注於找出該資產的價格。
此外,現在您可以學習決策樹和基於樹的印地語模型與免費在線課程
決策樹-分類
#方包
圖書館(黨)
#分割數據
圖書館(插入符號)
##加載所需的包:格子
##加載所需的包:ggplot2
createDataPartition(虹膜$物種,p=0.65,list=F) -> split_tag
虹膜(split_tag)——>火車
虹膜(- - - - - -split_tag] - >測試
#建築樹
ctree(物種~.,data=train) -> mytree . txt
情節(mytree)
#值預測
預測(mytree,test,type= " response ") -> mypred
表格(測試$物種,mypred)
# # mypred
## setosa versicolor virginica
## setosa 17 0 0
## versicolor 0 17 0
## virginica 0 2 15
# model 2
ctree(物種~花瓣。長度+花瓣. width,data=train) -> mytree2
情節(mytree2)
#預測
預測(mytree2,test,type= " response ") -> mypred2
表格(測試$物種,mypred2)
# # mypred2
## setosa versicolor virginica
## setosa 17 0 0
## versicolor 0 17 0
## virginica 0 2 15
決策樹-回歸
圖書館(rpart)
read.csv(" C:/Users/BHARANI/Desktop/Datasets/ boston .csv ") -> boston .csv
#分割數據
圖書館(插入符號)
createDataPartition(波士頓$medv,p=0.70,list=F) -> split_tag
波士頓(split_tag)——>火車
波士頓(- - - - - -split_tag] - >測試
#建築模型
rpart(medv~., train) -> my_tree . txt
圖書館(rpart.plot)
##警告:package ' rpart。情節’ was built under R version 3.6.2
rpart.plot(my_tree)
#預測
預測(my_tree,newdata = test) ->謂詞樹
cbind(實際=測試$-> final_data . medv, predict_tree
as.data.frame(final_data) -> final_data .輸出說明
(final_data$實際- - - - - -final_data$已預測)->錯誤
cbind(final_data,錯誤)-> final_data
√6(的意思是((final_data$錯誤)^2)) -> rmse1
rpart(medv~lstat+氮氧化合物+rm+年齡+稅,火車)-> my_tree2
圖書館(rpart.plot)
#預測
預測(my_tree2,newdata = test) -> predict_tree2
cbind(實際=測試$medv, predict_tree2) -> final_data2
as.data.frame(final_data2) -> final_data2 .輸出說明
(final_data2$實際- - - - - -final_data2$->錯誤2
cbind(final_data2,error2) -> final_data2 .輸出說明
√6(的意思是((final_data2$error2)^2)) -> rmse2
注意,echo = FALSE參數被添加到代碼塊中,以防止打印生成繪圖的R代碼。
在本文中,決策樹的概念是可解釋的。如果數據包含太多的邏輯條件或被離散到類別,那麼決策樹算法是正確的選擇。如果數據包含太多的數值變量,那麼最好選擇其他分類算法,因為決策樹將會因為數據中存在的屬性的微小變化而表現得很糟糕。盡管如此,還是建議對數值數據進行特征工程,以麵對決策樹所持有的算法。
要詳細了解決策樹在AIML中的工作原理,請查看人工智能和機器學習課程.在這個領域提高技能,以利用所有新的和令人興奮的機會。