機器學習 - 決策樹

1. 決策樹基礎

定義與概念

決策樹是一種監督學習算法,主要用于分類和回歸任務。它通過學習從數據特征到輸出標簽的映射規則,構建一個樹形結構。在分類問題中,決策樹的每個葉節點代表一個類別。

案例分析

假設我們有一個關于天氣和是否進行戶外活動的數據集,其中特征包括“溫度”、“風速”和“天氣類型”,目標變量是“是否進行戶外活動”。決策樹將從這些特征中學習規則,以預測任何給定天氣條件下的活動決定。

公式推導

最簡單的決策樹使用信息增益來選擇每個節點的分裂特征。信息增益計算如下:

I G ( T , a ) = H ( T ) ? ∑ v ∈ V a l u e s ( a ) ∣ T v ∣ ∣ T ∣ H ( T v ) IG(T, a) = H(T) - \sum_{v \in Values(a)} \frac{|T_v|}{|T|} H(T_v) IG(T,a)=H(T)?vValues(a)?TTv??H(Tv?)

常見問題及解決方案
  1. 問題:如何處理連續特征?

    • 解決方案:將連續特征通過閾值劃分為兩個子集,選擇最優閾值使信息增益最大化。
  2. 問題:決策樹容易過擬合嗎?

    • 解決方案:是的,可以通過設置樹的最大深度或使用剪枝技術來防止過擬合。
  3. 問題:如果數據集中有缺失值怎么辦?

    • 解決方案:可以用數據集中同一特征的非缺失值的平均值或眾數替代缺失值。
  4. 問題:決策樹在何種情況下表現不好?

    • 解決方案:在特征間復雜的相互作用或分類邊界非線性時,單一決策樹效果不佳,此時可考慮使用隨機森林等集成方法。
  5. 問題:如何選擇最佳的分裂特征?

    • 解決方案:通過計算每個特征的信息增益或基尼不純度,并選擇增益最大或不純度降低最多的特征。

2. 關鍵概念

屬性選擇度量

在決策樹構造中,選擇正確的屬性對于分裂每個節點至關重要。以下是幾種常見的屬性選擇度量方法:

  1. 信息增益:如之前所述,信息增益衡量在給定屬性的條件下,數據不確定性的減少。
  2. 增益比率:解決信息增益偏好選擇取值較多的屬性的問題,通過標準化信息增益來減少這種偏差。
  3. 基尼指數:常用于CART(分類與回歸樹)算法中,測量一個隨機選擇的樣本被錯誤標記的概率。
案例分析:基尼指數

考慮一個數據集,我們需要根據“年齡”、“收入”和“學歷”預測一個人是否會購買豪車。使用基尼指數,我們可以決定哪個特征在根節點分裂時使用。

計算方法如下:

G i n i ( T ) = 1 ? ∑ i = 1 k p i 2 Gini(T) = 1 - \sum_{i=1}^k p_i^2 Gini(T)=1?i=1k?pi2?

其中 pi 是第 i 類的比例。

假設我們有100個樣本,60個樣本不買豪車,40個買豪車,則:

G i n i ( T ) = 1 ? ( ( 0.6 ) 2 + ( 0.4 ) 2 ) = 0.48 Gini(T) = 1 - ((0.6)^2 + (0.4)^2) = 0.48 Gini(T)=1?((0.6)2+(0.4)2)=0.48

樹的構造

構造決策樹時,我們從根節點開始,使用所選的屬性選擇度量來遞歸地分裂每個節點,直到滿足某些停止條件,如節點達到最小樣本數、達到最大深度或純度達到一定水平。

常見問題及解決方案
  1. 問題:如何處理非數值特征?

    • 解決方案:將類別型特征進行獨熱編碼或使用基于標簽的編碼方法。
  2. 問題:節點最優分裂點如何確定?

    • 解決方案:對于每個屬性,嘗試所有可能的分裂點,選擇使信息增益、增益比率或基尼指數最優的分裂點。
  3. 問題:如何處理訓練數據中的噪聲?

    • 解決方案:使用預剪枝或后剪枝減少噪聲帶來的影響,或者使用交叉驗證來確定最佳的剪枝策略。
  4. 問題:決策樹構造算法運行時間過長怎么辦?

    • 解決方案:可以通過限制樹的最大深度或節點最小樣本數來減少構造時間,或使用更高效的數據結構如KD樹。
  5. 問題:如果一個屬性在訓練集中重要但在驗證集中無效怎么辦?

    • 解決方案:進行特征選擇和特征重要性評估,以避免過度依賴訓練數據中的特定特征。

3. 決策樹算法

ID3算法

定義與概念
ID3(Iterative Dichotomiser 3)算法是最早的決策樹算法之一,主要用于處理分類問題。它使用信息增益作為屬性選擇的度量標準,從而選擇最能提供最大信息增益的屬性來進行節點的分裂。

案例應用
考慮一個郵件系統需要根據郵件內容判斷是否為垃圾郵件。特征可能包括關鍵詞的出現頻率、發件人信譽等。ID3算法會選擇最能區分垃圾郵件和非垃圾郵件的特征來分裂節點。

公式推導
信息增益的計算已在前文中詳細介紹。

C4.5算法

定義與概念
C4.5算法是ID3算法的改進版本,能夠處理連續屬性和具有缺失值的數據。此外,C4.5使用增益比率來選擇屬性,減少了對多值屬性的偏見。

案例應用
在一個在線零售數據集中,我們可能需要根據客戶的年齡、購買歷史和頁面瀏覽行為來預測他們是否會購買某個產品。C4.5算法能夠有效地處理這些連續和離散的數據特征。

公式推導
G a i n R a t i o ( S , A ) = I n f o r m a t i o n G a i n ( S , A ) S p l i t I n f o r m a t i o n ( S , A ) GainRatio(S, A) = \frac{InformationGain(S, A)}{SplitInformation(S, A)} GainRatio(S,A)=SplitInformation(S,A)InformationGain(S,A)?
其中:
S p l i t I n f o r m a t i o n ( S , A ) = ? ∑ i = 1 n ( ∣ S i ∣ ∣ S ∣ ) log ? 2 ( ∣ S i ∣ ∣ S ∣ ) SplitInformation(S, A) = -\sum_{i=1}^n \left(\frac{|S_i|}{|S|}\right) \log_2 \left(\frac{|S_i|}{|S|}\right) SplitInformation(S,A)=?i=1n?(SSi??)log2?(SSi??)

CART算法

定義與概念
CART(Classification and Regression Trees)算法既可以用于分類問題也可以用于回歸問題。這種算法使用基尼指數作為分類問題的度量,而對于回歸問題,則使用最小二乘偏差。

案例應用
在房價預測模型中,CART算法可以通過房屋的年齡、面積、地理位置等連續特征來預測房屋價格。

公式推導
基尼指數計算已在前文介紹。對于回歸問題,最小二乘偏差定義為:
L ( T ) = ∑ i ∈ T ( y i ? y ^ T ) 2 L(T) = \sum_{i \in T} (y_i - \hat{y}_T)^2 L(T)=iT?(yi??y^?T?)2
其中 y ^ T \hat{y}_T y^?T? 是節點 T 中所有樣本 y 值的平均數。

常見問題及解決方案
  1. 問題:如何在ID3算法中處理連續特征?

    • 解決方案:通過定義閾值將連續特征離散化,然后按照離散特征處理。
  2. 問題:C4.5算法在處理非常大的數據集時性能如何?

    • 解決方案:由于計算增益比率較為復雜,對于非常大的數據集,C4.5的性能可能不如預期。可以考慮使用算法優化或者硬件加速。
  3. 問題:CART算法在分類問題中如何選擇最佳分裂點?

    • 解決方案:通過計算每個可能分裂點的基尼指數,選擇基尼指數最低的點作為分裂點。
  4. 問題:如何處理決策樹中的過擬合問題?

    • 解決方案:通過剪枝技術,限制樹的深度或者設置節點的最小樣本大小等方法來控制樹的復雜度。
  5. 問題:如果數據集中存在大量缺失值,決策樹的性能如何?

    • 解決方案:可以使用多種策略處理缺失值,如使用最常見的值填充,或者利用可用特征的信息推斷缺失值。 C4.5算法原生支持處理缺失值。

4. 剪枝技術

定義與概念

剪枝是決策樹學習算法中的一種技術,用于減少樹的大小,從而控制模型的復雜度和過擬合現象。剪枝可以分為兩種主要類型:預剪枝(Pre-pruning)和后剪枝(Post-pruning)。

預剪枝

定義:預剪枝是在決策樹完全生成之前停止樹的生長。這通常通過設置停止條件來實現,如達到最大深度、節點中的最小樣本數或信息增益的最小閾值。

案例應用
假設在一個貸款申請的決策樹模型中,我們可以設置最大深度為5,以防止模型變得過于復雜并過擬合訓練數據。

后剪枝

定義:后剪枝是在決策樹構造完成后進行的。這種方法通常涉及使用驗證數據集來評估是否剪去某些子樹,從而改善模型在未見數據上的表現。

案例應用
在同一個貸款申請模型中,我們可能會允許樹完全生長,然后用一個獨立的驗證集來測試每一個子樹的性能。如果剪除某個子樹能夠提高驗證集上的準確率,則進行剪枝。

公式推導

對于后剪枝,其中一種常用方法是成本復雜度剪枝,其公式可以表示為:
R α ( T ) = R ( T ) + α × ∣ l e a v e s ∣ R_\alpha(T) = R(T) + \alpha \times |leaves| Rα?(T)=R(T)+α×leaves
其中 R(T) 是樹 T 在訓練數據上的誤差, |leaves| 是樹的葉節點數量,α 是復雜度參數。

常見問題及解決方案
  1. 問題:預剪枝和后剪枝哪個更好?

    • 解決方案:預剪枝可以更快地構建模型,但可能因為過于保守而錯過重要的模式;后剪枝通常更能提高模型的泛化能力,但計算成本更高。
  2. 問題:如何選擇合適的 α 值進行成本復雜度剪枝?

    • 解決方案:通過交叉驗證來選取最佳的α 值,從而在模型簡單性和準確性之間找到最佳平衡。
  3. 問題:如果剪枝過度會怎樣?

    • 解決方案:過度剪枝可能導致模型過于簡單,不能捕捉數據中的重要模式。需要通過調整剪枝參數或減少剪枝程度來解決。
  4. 問題:預剪枝有哪些具體的停止條件?

    • 解決方案:具體的停止條件包括但不限于達到最大樹深、節點最小樣本數、信息增益低于某個閾值等。
  5. 問題:后剪枝的流程是怎樣的?

    • 解決方案:后剪枝通常包括完全生成決策樹,然后逐步測試每個節點(從葉節點開始)是否應該替換為更簡單的決策過程或其父節點,通常借助獨立的驗證集來評估性能。

5. 決策樹的應用

實際案例分析

決策樹因其模型的解釋性強,被廣泛應用于各種行業和場景中。以下是幾個示例:

  1. 醫療診斷

    • 場景:使用病人的歷史醫療記錄來預測某種疾病的發生。
    • 數據:特征包括年齡、性別、體重、血壓等。
    • 應用:構建決策樹來識別高風險病人,并進行早期干預。
  2. 客戶分類

    • 場景:電商平臺根據用戶的購物行為和個人喜好進行市場細分。
    • 數據:特征包括購買頻率、平均消費金額、瀏覽歷史等。
    • 應用:決策樹幫助確定哪些客戶對特定產品類別感興趣,以定向推送廣告。
  3. 信用評分

    • 場景:金融機構需要評估貸款申請者的信用風險。
    • 數據:特征包括信用歷史、還款能力、已有負債等。
    • 應用:通過決策樹分析,銀行可以決定是否批準貸款以及貸款條件。
特征重要性評估

在構建決策樹模型時,了解哪些特征對預測結果影響最大是至關重要的。特征重要性評估可以幫助我們優化模型和理解數據背后的因果關系。

方法

  • 基于模型的特征重要性:大多數決策樹算法(如CART和隨機森林)都提供了一種計算特征重要性的內建方法。這通常基于每個特征在分裂節點時的效用(如基尼減少或信息增益)來評分。

案例應用
在信用評分模型中,特征如“年收入”和“現有負債”可能顯示為最重要的預測因素。通過分析這些特征的重要性,銀行可以更準確地識別潛在的風險客戶。

常見問題及解決方案
  1. 問題:決策樹在哪些情況下可能不是最佳選擇?

    • 解決方案:對于具有復雜關系和大量非線性特征的數據集,單一決策樹可能表現不佳。此時,可以考慮使用集成方法如隨機森林或梯度提升樹。
  2. 問題:如何處理大數據集上的決策樹訓練?

    • 解決方案:可使用分布式計算框架如Apache Spark中的MLlib來處理大規模數據集上的決策樹訓練。
  3. 問題:如何解決決策樹對于數據中小的變化過于敏感的問題?

    • 解決方案:通過集成學習方法,如隨機森林,可以降低模型對數據中小波動的敏感性。
  4. 問題:決策樹如何應對非平衡數據集?

    • 解決方案:通過調整類權重或對少數類進行過采樣處理,以平衡各類的影響力。
  5. 問題:如何提高決策樹的預測準確性?

    • 解決方案:除了使用剪枝和特征選擇技術,還可以通過調整模型參數如最大深度和最小分裂樣本數來優化模型性能。

6. 集成方法

定義與概念

集成學習是一種強大的機器學習范式,它通過結合多個模型來提高預測性能,通常能夠比任何一個單獨的模型表現得更好。在決策樹的上下文中,常見的集成方法包括隨機森林和梯度提升樹。

隨機森林

定義:隨機森林是由多個決策樹組成的集成模型,每棵樹都在數據集的一個隨機子集上訓練得到,用于增加模型的多樣性。

案例應用
在一個銀行欺詐檢測系統中,隨機森林模型可以通過整合數百棵樹的預測結果來提高識別欺詐行為的準確率。

梯度提升樹

定義:梯度提升是一種提升技術,通過迭代地添加新模型來糾正前一輪模型的錯誤,通常使用決策樹作為基學習器。

案例應用
在房價預測模型中,梯度提升樹可以逐步學習并改進預測,處理各種復雜的非線性關系,以更精確地預測各種因素影響下的房價。

比較決策樹與其他模型
與支持向量機(SVM)
  • 優點:決策樹易于理解和解釋,適合處理帶有明確決策邊界的問題。
  • 缺點:SVM通常在高維空間和復雜決策邊界的情況下表現更好,因為它側重于最大化類之間的邊界。
與神經網絡
  • 優點:決策樹不需要很多參數調整即可開始訓練,而神經網絡通常需要復雜的配置和更長的訓練時間。
  • 缺點:神經網絡在處理大規模數據集和捕捉數據中復雜模式方面更有優勢,尤其是在圖像和語音識別等領域。
工具與庫
  1. Scikit-learn:Python的一個主要機器學習庫,提供了決策樹和集成算法的實現,包括隨機森林和梯度提升樹。
  2. XGBoost:優化的分布式梯度提升庫,非常適合在大規模數據集上進行高效的模型訓練。
  3. Graphviz:用于決策樹可視化的工具,可以幫助分析和解釋模型的決策路徑。

7.案例 - 鳶尾花分類

當然,這里我將給出一個使用Python中的scikit-learn庫構建決策樹分類器的詳細案例。我們將使用經典的鳶尾花數據集(Iris dataset)來演示如何構建和評估一個決策樹模型。

數據集

鳶尾花數據集包含150個樣本,每個樣本有4個特征(花萼長度、花萼寬度、花瓣長度和花瓣寬度)和3種不同類別的鳶尾花(Setosa, Versicolour, 和 Virginica)。

步驟
  1. 導入所需的庫和數據集。
  2. 數據預處理。
  3. 分割數據集為訓練集和測試集。
  4. 創建決策樹模型。
  5. 訓練模型。
  6. 預測測試數據。
  7. 評估模型性能。
  8. 可視化決策樹。
代碼實現
# 1. 導入庫
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_text, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt# 2. 加載數據
iris = load_iris()
X = iris.data
y = iris.target# 3. 分割數據集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 4. 創建決策樹模型
tree_classifier = DecisionTreeClassifier(max_depth=3, random_state=42)# 5. 訓練模型
tree_classifier.fit(X_train, y_train)# 6. 預測測試數據
y_pred = tree_classifier.predict(X_test)# 7. 評估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
print("Classification Report:")
print(classification_report(y_test, y_pred))# 8. 可視化決策樹
plt.figure(figsize=(12,8))
plot_tree(tree_classifier, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
說明
  • 這段代碼首先導入了必要的庫,包括數據集加載、決策樹構建、數據分割、模型評估和可視化所需的庫。
  • 使用train_test_split函數將數據分為70%的訓練集和30%的測試集。
  • 使用DecisionTreeClassifier創建一個決策樹模型,設置max_depth=3來限制樹的深度,以避免過擬合。
  • 使用訓練集訓練模型,并在測試集上進行預測。
  • 評估模型性能,輸出準確率和分類報告。
  • 使用plot_tree函數可視化決策樹,幫助理解模型是如何做出決策的。

更多問題咨詢

Cos機器人

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/10962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10962.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux防火墻的操作

linux防火墻的操作 前言1查看防火墻狀態2暫時關閉防火墻3永久關閉防火墻4開啟防火墻5開啟指定端口6關閉指定端口7立即生效8查看開放的端口前言 systemctl是管理linux中服務的命令,可以對服務進行啟動、停止、重啟、查看狀態等操作 firewall-cmd是linux中專門用于控制防火墻的…

并發-守護線程setDaemon()

目錄 為什么存在 什么是守護線程 創建守護線程 在使用守護線程時需要注意以下幾點 可以使用isDaemon()方法來檢查線程是否是守護線程 例1:上面提到當JVM中只剩下守護線程的時候,JVM就會退出,那么寫段代碼測試下 例2:thread…

小紅的字符串構造和小紅的排列構造

小紅的字符串構造 小紅希望你構造一個長度為nnn的、僅包含小寫字母的字符串,其中恰好有kkk個長度大于1的回文子串。你能幫幫她嗎?輸入兩個整數n,k,用空格隔開。 1≤n≤10^5,0≤k≤n/2.一個字符串。如果有多解輸出任意即可。 可以證明&#x…

[Bug]:由于中國防火墻,無法連接 huggingface.co

問題描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

[AIGC] 幾道 redis數據結構相關面試題

文章目錄 7. 數據類型的實現8. 什么是空間預分配以及惰性空間釋放,SDS 是怎么實現的9. 為什么說 SDS 是二進制安全的呢10. 說說 redis 里的對象11. 使用 RedisObject 的好處12. RedisObject 的具體結構是什么 7. 數據類型的實現 8. 什么是空間預分配以及惰性空間釋放…

Vue3實戰筆記(16)—pinia基本用法--Getter

文章目錄 前言一、pinia的getter簡單理解二、訪問其他 store 的 getter總結 前言 在 Pinia 中,getter 類似于 Vuex 中的 getter,允許你從 store 中派生出一些狀態,而不需要修改原始狀態。這使得我們可以創建基于現有狀態的計算屬性。 一、pi…

練習題(2024/5/12)

1二分查找 給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。 示例 1: 輸入: nums [-1,0,3,5,9,12], target 9 輸出: 4…

樹莓派C語言開發

安裝C語言編譯器和開發工具 sudo apt update sudo apt install build-essential 此命令會安裝GCC編譯器以及make等其他工具,這些都是C語言程序開發過程中必需的。 配置文本編輯器 樹莓派默認安裝了幾個文本編輯器,如Nano和Vim。如果你對這些編輯器不熟…

如何遠程訪問?

遠程訪問是指在不同的地理位置之間通過網絡連接來實現對目標設備或系統的訪問。無論是在個人生活還是商業領域,遠程訪問都起到了重要的作用,幫助人們實現高效的工作和便捷的生活。本文將介紹一款名為【天聯】的組網產品,它是一款強大的異地組…

Linux與Windows互傳文件【筆記】

Linux與Windows互傳文件【筆記】 前言前言推薦Linux與Windows互傳文件首先確保Windows安裝ssh如何傳送文件問題 最后 前言 這是陳舊已久的草稿2023-05-10 00:01:24 這個是準備把計組課程華為智能計組的,傳輸文件。 最后發現,好像沒有實現了。 現在202…

汽車線控轉向系統介紹

汽車線控轉向系統由方向盤總成、轉向執行總成和主控制器(ECU)三個主要部分以及自動防故障系統、電源等輔助系統組成。 線控轉向系統(Steering-By-Wire),取消了方向盤和轉向車輪之間的機械連接部件,徹底擺脫了機械固件的限制,完全由電能來實現…

【LeetCode】數組——hashmap的妙用

在遇到一類題目時,通過雙for循環也可暴力破解,但我們可以通過用hashmap來代替一次for循環節約時間開支,在算法上屬于用空間換時間,也能幫助我們更好的理解hashmap這一種重要數據結構,并熟悉hashmap的重要方法。 1.兩數…

31Windows精簡系統下載推薦

Windows精簡系統下載推薦 世界上有很多人在做Windows精簡系統,去掉了他們認為不必要的功能和插件,達到了減小系統安裝包體積,提升系統運行流暢度和穩定性的目的。 筆者推薦使用大佬不忘初心制作的精簡版系統,最精簡windows10系統安…

什么是數據平臺——企業構建Data+AI的基礎數據底座需要的決策參考

什么是數據平臺 標準的解釋是這樣的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 數據平臺是指將各類數據進行整合、存儲、處…

你知道C++多少——默認成員函數

🌈個人主頁:小新_- 🎈個人座右銘:“成功者不是從不失敗的人,而是從不放棄的人!”🎈 🎁歡迎各位→點贊👍 收藏?? 留言📝 🏆所屬專欄&#xff1…

Python vs MATLAB:選擇深度學習的首選編程語言

Python vs MATLAB:選擇深度學習的首選編程語言 在深度學習領域,編程語言的選擇對于初學者的學習路徑和未來的職業發展至關重要。目前,Python和MATLAB都是進行科學計算和數據分析的流行工具,但它們在深度學習社區中的應用和受歡迎…

linux程序分析命令(一)

linux程序分析命令(一) **ldd:**用于打印共享庫依賴。這個命令會顯示出一個可執行文件所依賴的所有共享庫(動態鏈接庫),這對于解決運行時庫依賴問題非常有用。**nm:**用于列出對象文件的符號表。這個命令可以顯示出定…

什么事防抖和節流,有什么區別,如何實現

防抖和節流,本質上是優化高頻率執行代碼的一種手段,比如:resize、scroll、keypress、mousemove這些事件在觸發的時候,會不斷調用綁定在事件上的回調函數,這樣極大浪費資源,降低前端性能。 為了優化體驗&am…

ipa 分區算法分析,圖解

參考 Room Segmentation: Survey, Implementation, and Analysis. 分區算法調查,實現以及評估對比 相關論文 分區算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形態分割 Interactive SLAM using …

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)

函數原型(Function Prototype)、函數定義(Function Definition)和函數聲明(Function Declaration)在C和C等編程語言中扮演著不同的角色,但它們有時在概念上可能會有些重疊。下面是它們之間的主要…