機器學習算法篇(四)決策樹算法

目錄

一、決策樹概述

1.1 概述

1.2 基本數學原理

二、熵原理形象解讀與計算

2.1 熵的概念

2.2 熵的計算示例

2.3 條件熵

三、決策樹構造實例

3.1 數據集示例

3.2 計算信息增益

3.3 遞歸構建決策樹

四、信息增益和信息增益率

4.1 信息增益的缺陷

4.2 信息增益率

4.3 信息增益與信息增益率的比較

五、三種決策樹算法

5.1 ID3算法

5.2 C4.5算法

5.3 CART決策樹

ps.三種決策樹算法的比較

六、決策樹剪枝

6.1 過擬合問題

6.2 剪枝方法

6.3 CART剪枝算法

第七部分:決策樹案例實戰與參數分析

7.1 案例一:電信客戶流失預測分析

案例背景

代碼實現詳解

實現步驟解析

關鍵點說明

7.2 案例二:客戶流失預測進階分析

案例背景

代碼實現詳解

實現步驟解析

進階技巧說明

7.3 sklearn決策樹參數深度解析

核心參數詳解

關鍵參數應用場景

參數調優實戰策略

參數選擇經驗法則

總結


一、決策樹概述

1.1 概述

決策樹(Decision Tree)是一種基本的分類與回歸方法,它通過構建樹狀結構來進行決策。決策樹模型呈樹形結構,在分類問題中,表示基于特征對實例進行分類的過程。它可以被認為是if-then規則的集合,也可以被認為是定義在特征空間與類空間上的條件概率分布。

決策樹學習通常包括三個步驟:

  1. ??特征選擇??:選擇最優劃分特征
  2. ??決策樹生成??:遞歸構建決策樹
  3. ??決策樹剪枝??:防止過擬合

決策樹的主要優點:

  • 模型具有可解釋性,容易向業務人員解釋
  • 能夠處理數值型和類別型數據
  • 不需要對數據進行復雜的預處理(如標準化)
  • 可以通過可視化直觀展示模型邏輯

1.2 基本數學原理

決策樹的核心是通過遞歸地選擇最優特征進行數據劃分。在選擇劃分特征時,我們需要一個衡量標準來判斷劃分的好壞。常用的標準有:

  1. ??信息增益??(ID3算法使用)
  2. ??信息增益比??(C4.5算法使用)
  3. ??基尼指數??(CART算法使用)

這些標準都基于信息論中的熵概念,我們將在下一節詳細介紹熵的原理。

決策樹的數學本質是一個分段常數函數,它將特征空間劃分為若干互不重疊的區域(R?到R?),每個區域對應一個確定的預測值(c?到c?)。當輸入樣本x落入某個區域R?時,模型就輸出該區域對應的值c?。這種劃分通過遞歸的"if-then"規則實現,最終形成樹狀結構。

二、熵原理形象解讀與計算

2.1 熵的概念

熵(Entropy)是信息論中用于度量信息不確定性的概念。在決策樹中,熵用來衡量數據集的不純度。熵越大,表示數據集的不確定性越高。

熵的數學定義為:
對于一個概率分布P=(p?, p?, ..., p?),其熵H(P)定義為:

H(P) = -∑_{i=1}^n p_i · log?(p_i)

其中,p_i是第i類樣本所占的比例,log?以2為底的對數使得熵的單位為比特(bit)。

2.2 熵的計算示例

假設我們有一個二分類數據集,其中正例占比為p,負例占比為1-p,則其熵為:

H(p) = -p·log?(p) - (1-p)·log?(1-p)

我們來看幾個特殊值:

  • 當p=0或p=1時,H(p)=0,表示數據集完全純凈
  • 當p=0.5時,H(p)=1,表示數據集最混亂

2.3 條件熵

條件熵H(Y|X)表示在已知隨機變量X的條件下,隨機變量Y的不確定性。定義為:

H(Y|X) = ∑_{x∈X} p(x)·H(Y|X=x)

在決策樹中,我們通過計算特征劃分前后的熵變化來選擇最優劃分特征。

三、決策樹構造實例

3.1 數據集示例

我們通過一個簡單的例子來說明決策樹的構造過程。假設有以下天氣數據集,用于判斷是否適合打網球:

天氣溫度濕度風力是否打球
正常
正常
正常
正常
正常
正常
正常

3.2 計算信息增益

首先計算整個數據集的熵:

  • 打球(是):9例
  • 不打球(否):5例
  • 總樣本數:14例

H(D) = - (9/14)·log?(9/14) - (5/14)·log?(5/14) ≈ 0.940

然后計算以"天氣"為劃分特征的條件熵:

  • 晴:5例(2是,3否)
  • 陰:4例(4是,0否)
  • 雨:5例(3是,2否)

H(D|天氣) = (5/14)·H(晴) + (4/14)·H(陰) + (5/14)·H(雨)
= (5/14)·(-(2/5)log?(2/5)-(3/5)log?(3/5)) + (4/14)·0 + (5/14)·(-(3/5)log?(3/5)-(2/5)log?(2/5))
≈ 0.694

信息增益:
Gain(天氣) = H(D) - H(D|天氣) ≈ 0.940 - 0.694 = 0.246

類似地可以計算其他特征的信息增益,選擇信息增益最大的特征作為根節點。

3.3 遞歸構建決策樹

按照上述方法遞歸地對每個子節點選擇最優劃分特征,直到:

  1. 所有樣本屬于同一類別
  2. 沒有剩余特征可用于劃分
  3. 達到預定義的停止條件(如最大深度)

四、信息增益和信息增益率

4.1 信息增益的缺陷

信息增益傾向于選擇取值較多的特征,因為這類特征往往能夠將數據集劃分得更細,從而獲得更高的信息增益。但這可能導致過擬合問題。

4.2 信息增益率

為了克服信息增益的缺陷,C4.5算法引入了信息增益率(Gain Ratio),定義為:

\text{GainRatio}(D,A) = \frac{\text{Gain}(D,A)}{\text{SplitInfo}(D,A)}

即:GR(D,A) = Gain(D,A) / SplitInfo(D,A)

其中SplitInfo(D,A)是特征A的固有值(Intrinsic Value),表示特征A將數據集D劃分的信息量:

SplitInfo(D,A) = -\sum_{v\in A} \frac{|D_v|}{|D|} \log_2 \left( \frac{|D_v|}{|D|} \right)

信息增益率通過除以特征的固有值來懲罰取值較多的特征。

4.3 信息增益與信息增益率的比較

  • 信息增益:傾向于選擇取值較多的特征
  • 信息增益率:傾向于選擇取值較少的特征
  • 實際應用中,通常先計算信息增益高于平均水平的特征,再從中選擇信息增益率最高的特征

五、三種決策樹算法

5.1 ID3算法

ID3(Iterative Dichotomiser 3)是最早的決策樹算法,由Ross Quinlan于1986年提出。

??特點??:

  • 使用信息增益作為特征選擇標準
  • 只能處理離散型特征
  • 不能處理缺失值
  • 容易過擬合,沒有剪枝步驟
  • 傾向于選擇取值較多的特征

??算法步驟??:

  1. 計算所有特征的信息增益
  2. 選擇信息增益最大的特征作為當前節點的劃分特征
  3. 對每個子節點遞歸執行上述步驟,直到:
    • 所有樣本屬于同一類別
    • 沒有剩余特征可用于劃分

5.2 C4.5算法

C4.5是ID3的改進算法,同樣由Quinlan提出。

??改進點??:

  • 使用信息增益率代替信息增益
  • 能夠處理連續型特征(通過離散化)
  • 能夠處理缺失值
  • 加入了剪枝步驟防止過擬合
  • 可以生成規則集

??處理連續特征的方法??:

  1. 對連續特征的值進行排序
  2. 計算相鄰值的中間點作為候選劃分點
  3. 選擇信息增益率最高的劃分點

5.3 CART決策樹

CART(Classification And Regression Tree)由Breiman等人于1984年提出。

??特點??:

  • 可以用于分類和回歸任務
  • 分類樹使用基尼指數作為劃分標準
  • 回歸樹使用平方誤差最小化作為劃分標準
  • 二叉樹結構(每個節點只有兩個子節點)
  • 有完善的剪枝方法

??基尼指數??:
基尼指數(Gini Index)是另一種衡量數據集不純度的指標:

其中p_k是第k類樣本的比例。基尼指數越小,數據集純度越高。

  • p:數據集
  • k:類別總數量
  • p_i:數據集中第i類樣本的占比

??CART分類樹的構建??:

  1. 對每個特征A,計算其每個可能取值的基尼指數
  2. 選擇基尼指數最小的特征和取值作為最優劃分
  3. 遞歸地對子節點執行上述步驟

??CART回歸樹的構建??:

  1. 對每個特征A,尋找最優切分點s,使得:

    其中R1、R2是劃分后的兩個區域,c1、c2是兩個區域的輸出均值
  • A和?s是劃分區域的參數(例如,分割變量和分割點)

  • R1?(A,s)和?R2?(A,s)是由?A和?s定義的區域

  • c1?和?c2?分別是區域?R1?和?R2?內的最優常數(通常是區域內的均值)

  1. 遞歸地對子區域執行上述劃分

ps.三種決策樹算法的比較

算法任務類型特征選擇指標樹結構優勢缺點
ID3分類信息增益多叉樹簡單直觀不支持連續特征,易過擬合
C4.5分類信息增益率多叉樹支持連續特征、缺失值處理計算復雜,不支持回歸
CART分類 / 回歸基尼指數(分類)、MSE(回歸)二叉樹可處理分類和回歸,效率高對不平衡數據敏感

六、決策樹剪枝

6.1 過擬合問題

決策樹容易過擬合,特別是當樹深度較大時。過擬合表現為在訓練集上表現很好,但在測試集上表現較差。

6.2 剪枝方法

剪枝(Pruning)是解決過擬合的主要方法,分為預剪枝和后剪枝:

??預剪枝(Pre-Pruning)??:
在樹構建過程中提前停止樹的生長。常用方法包括:

  • 設置最大深度
  • 設置葉子節點最小樣本數
  • 設置信息增益/基尼指數閾值

??后剪枝(Post-Pruning)??:
先構建完整的樹,然后自底向上剪枝。常用方法包括:

  • 代價復雜度剪枝(Cost Complexity Pruning)
  • 悲觀剪枝(Pessimistic Pruning)
  • 最小誤差剪枝(Minimum Error Pruning)

6.3 CART剪枝算法

CART采用代價復雜度剪枝,定義樹的代價復雜度:

Cα(T) = C(T) + α·|T|

其中:

  • Cα(T):優化后的成本函數
  • C(T)是樹T在訓練數據上的誤差(原始成本函數)
  • |T|:模型復雜度(如決策樹的葉子節點數)
  • α是正則化系數

剪枝過程:

  1. 從完整樹T0開始,生成子樹序列T1, T2, ..., Tn,其中Ti+1是Ti的最優子樹
  2. 通過交叉驗證選擇最優子樹

第七部分:決策樹案例實戰與參數分析

7.1 案例一:電信客戶流失預測分析

案例背景

??數據集說明??:

  • 數據維度:601個樣本,17個特征
  • 特征說明:
    1. 在網月數:客戶使用電信服務的時間(月)
    2. 年齡:客戶年齡
    3. 婚姻狀況:客戶婚姻狀態
    4. 現地址住居時間:在當前地址居住時間
    5. 教育程度:客戶教育水平
    6. 工作狀態:就業狀況
    7. 性別:客戶性別
    8. 租設備:是否租賃設備
    9. IP電話:是否使用IP電話服務
    10. 無線電話:是否使用無線電話服務
    11. 本月話費:當月消費金額
    12. 語音信箱:是否使用語音信箱
    13. 網絡:是否使用網絡服務
    14. 來電顯示:是否使用來電顯示
    15. 呼叫等待:是否使用呼叫等待
    16. 呼叫轉移:是否使用呼叫轉移
    17. 流失狀態(標簽):客戶是否流失(二元分類)

??業務背景??:
電信行業客戶流失預測是客戶關系管理的重要組成部分。通過分析客戶特征和行為數據,建立預測模型識別可能流失的客戶,從而采取針對性的客戶保留措施,降低客戶流失率,提高企業收益。

代碼實現詳解

# 可視化混淆矩陣函數
def cm_plot(y, yp):from sklearn.metrics import confusion_matriximport matplotlib.pyplot as plt# 計算混淆矩陣:真實值y與預測值yp的混淆矩陣cm = confusion_matrix(y, yp)# 使用熱圖顯示混淆矩陣,顏色使用藍色漸變plt.matshow(cm, cmap=plt.cm.Blues)plt.colorbar()  # 添加顏色條# 在熱圖中添加數值標注for x in range(len(cm)):for y in range(len(cm)):# 在每個單元格中心位置添加數值plt.annotate(cm[x,y], xy=(y,x),horizontalalignment='center',  # 水平居中verticalalignment='center')    # 垂直居中# 添加坐標軸標簽plt.ylabel('True label')      # y軸為真實標簽plt.xlabel('Predicted label') # x軸為預測標簽return plt# 數據加載與預處理
# 使用pandas讀取Excel格式的數據文件
datas = pd.read_excel("電信客戶流失數據.xlsx")# 特征與標簽分離
# iloc[:, :-1]選取所有行和除最后一列外的所有列作為特征
data = datas.iloc[:,:-1]
# iloc[:, -1]選取所有行和最后一列作為標簽
target = datas.iloc[:,-1]# 數據集劃分
from sklearn.model_selection import train_test_split# 使用train_test_split劃分訓練集和測試集
# test_size=0.2表示測試集占20%
# random_state=42保證每次劃分結果相同(可復現性)
data_train, data_test, target_train, target_test = \train_test_split(data, target, test_size=0.2, random_state=42)# 決策樹模型構建
from sklearn import tree# 創建決策樹分類器對象
# criterion='gini':使用基尼系數作為劃分標準
# max_depth=8:限制樹的最大深度為8層,防止過擬合
# random_state=42:保證模型可復現
dtr = tree.DecisionTreeClassifier(criterion='gini', max_depth=8, random_state=42)# 模型訓練:使用訓練集數據擬合決策樹模型
dtr.fit(data_train, target_train)# 訓練集性能評估
# 使用訓練好的模型對訓練集進行預測
train_predicted = dtr.predict(data_train)from sklearn import metrics
# 打印分類報告:包含精確率、召回率、F1值等指標
print("訓練集分類報告:")
print(metrics.classification_report(target_train, train_predicted))# 可視化訓練集混淆矩陣
print("訓練集混淆矩陣:")
cm_plot(target_train, train_predicted).show() # 測試集性能評估
# 使用訓練好的模型對測試集進行預測
test_predicted = dtr.predict(data_test)# 打印測試集分類報告
print("測試集分類報告:")
print(metrics.classification_report(target_test, test_predicted))# 可視化測試集混淆矩陣
print("測試集混淆矩陣:")
cm_plot(target_test, test_predicted).show() # 計算模型在測試集上的準確率
print("測試集準確率:", dtr.score(data_test, target_test))# 決策樹可視化
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree# 創建大尺寸圖像(32x32英寸)以清晰顯示決策樹
fig, ax = plt.subplots(figsize=(32, 32))  # 繪制決策樹
# filled=True:填充顏色表示類別
plot_tree(dtr, filled=True, ax=ax)
plt.title("決策樹可視化")  # 添加標題
plt.show()

實現步驟解析

  1. ??數據準備階段??:

    • 加載電信客戶流失數據集
    • 分離特征和標簽
    • 劃分訓練集和測試集(80%訓練,20%測試)
  2. ??模型構建階段??:

    • 創建決策樹分類器
    • 設置基尼系數作為劃分標準
    • 限制樹的最大深度為8層防止過擬合
    • 使用訓練數據擬合模型
  3. ??模型評估階段??:

    • 在訓練集和測試集上分別進行預測
    • 生成分類報告(精確率、召回率、F1值)
    • 可視化混淆矩陣
    • 計算準確率指標
  4. ??模型可視化??:

    • 使用plot_tree繪制完整的決策樹結構
    • 調整圖像尺寸確保節點清晰可見

關鍵點說明

  1. ??數據劃分??:

    • 使用random_state保證每次劃分結果一致,便于結果復現
    • 保持訓練集和測試集的比例合理(通常70-80%訓練)
  2. ??模型參數??:

    • max_depth=8是經過調優的參數,平衡了模型復雜度和泛化能力
    • 使用基尼系數而非信息增益,計算效率更高且效果相當
  3. ??評估指標??:

    • 關注測試集而非訓練集的表現,反映模型真實泛化能力
    • 混淆矩陣直觀展示分類錯誤分布
  4. ??可視化??:

    • 大尺寸圖像確保復雜的決策樹結構清晰可讀
    • 顏色填充幫助快速識別不同類別

7.2 案例二:客戶流失預測進階分析

案例背景

??數據集說明??:

  • 數據維度:601個樣本,17個特征(與案例一相同數據,但特征名稱為英文)
  • 特征說明:
    1. months:在網月數
    2. age:年齡
    3. marry:婚姻狀況
    4. duration:現地址住居時間
    5. edu:教育程度
    6. work:工作狀態
    7. sex:性別
    8. rent:租設備
    9. phone:IP電話
    10. cellphone:無線電話
    11. huafei:本月話費
    12. vmail:語音信箱
    13. net:網絡
    14. ring:來電顯示
    15. wait:呼叫等待
    16. move:呼叫轉移
    17. station(標簽):流失狀態

??分析目標??:
在案例一基礎上,進一步優化模型參數,探索更精細的決策樹調參策略,并通過更專業的可視化方法展示決策樹結構。

代碼實現詳解

import pandas as pd# 增強版混淆矩陣可視化函數
def cm_plot(y, yp):from sklearn.metrics import confusion_matriximport matplotlib.pyplot as plt# 計算混淆矩陣cm = confusion_matrix(y, yp)# 創建熱圖,使用藍色漸變配色plt.matshow(cm, cmap=plt.cm.Blues)plt.colorbar()  # 添加顏色條# 添加數值標注for x in range(len(cm)):for y in range(len(cm)):# 在單元格中心位置顯示數值,設置字體顏色根據背景深淺自動調整plt.annotate(cm[x,y], xy=(y,x),horizontalalignment='center',verticalalignment='center',color='white' if cm[x,y] > cm.max()/2 else 'black')# 添加坐標軸標簽和標題plt.ylabel('True label')plt.xlabel('Predicted label')plt.title('Confusion Matrix')return plt# 數據加載與預處理
# 讀取Excel數據文件
datas = pd.read_excel("電信客戶流失數據2.xlsx")# 特征與標簽分離
# 使用iloc基于位置索引選取數據
data = datas.iloc[:,:-1]  # 所有特征列
target = datas.iloc[:,-1]  # 最后一列是標簽# 數據集劃分
from sklearn.model_selection import train_test_split# 劃分訓練集和測試集
# test_size=0.2:測試集占比20%
# random_state=0:固定隨機種子保證可復現性
data_train, data_test, target_train, target_test = \train_test_split(data, target, test_size=0.2, random_state=0)# 決策樹模型構建與調優
from sklearn import tree # 創建調優后的決策樹分類器
# criterion='gini':使用基尼系數
# max_depth=10:增大最大深度嘗試捕捉更多模式
# min_samples_leaf=5:設置葉節點最小樣本數為5,防止過擬合
# random_state=0:固定隨機種子
dtr = tree.DecisionTreeClassifier(criterion='gini', max_depth=10,min_samples_leaf=5,random_state=0)# 模型訓練
dtr.fit(data_train, target_train)# 訓練集評估
train_predicted = dtr.predict(data_train)from sklearn import metrics
# 生成詳細的分類報告
print("訓練集性能評估:")
print(metrics.classification_report(target_train, train_predicted))# 可視化訓練集混淆矩陣
print("訓練集混淆矩陣:")
cm_plot(target_train, train_predicted).show() # 測試集評估
test_predicted = dtr.predict(data_test)# 生成測試集分類報告
print("測試集性能評估:")
print(metrics.classification_report(target_test, test_predicted))# 可視化測試集混淆矩陣
print("測試集混淆矩陣:")
cm_plot(target_test, test_predicted).show() # 計算并打印測試集準確率
accuracy = dtr.score(data_test, target_test)
print(f"測試集準確率:{accuracy:.4f}")# 高級決策樹可視化
# 導出決策樹為Graphviz格式
dot_data = tree.export_graphviz(dtr,out_file=None,          # 不輸出到文件feature_names=data.columns,  # 使用特征名作為節點標簽filled=True,           # 填充顏色impurity=False,        # 不顯示不純度rounded=True           # 圓角節點)# 使用pydotplus渲染決策樹
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)# 自定義節點顏色(示例:修改第7個節點的填充色)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")# 在Jupyter Notebook中顯示圖像
from IPython.display import Image
Image(graph.create_png())# 將決策樹保存為PNG圖像文件
graph.write_png("dtr_advanced.png")
print("決策樹已保存為dtr_advanced.png")

實現步驟解析

  1. ??數據準備階段??:

    • 加載英文特征名的相同數據集
    • 使用iloc方法確保正確分離特征和標簽
    • 保持與案例一相同的劃分比例和隨機種子
  2. ??模型調優階段??:

    • 增大max_depth至10,嘗試捕捉更復雜模式
    • 設置min_samples_leaf=5,確保葉節點有足夠樣本
    • 保持基尼系數作為劃分標準
  3. ??增強可視化??:

    • 改進混淆矩陣顯示,添加自適應文本顏色
    • 使用Graphviz生成更專業的決策樹可視化
    • 自定義節點顏色增強可讀性
    • 將決策樹導出為高質量PNG圖像
  4. ??評估與分析??:

    • 對比訓練集和測試集表現,分析模型泛化能力
    • 關注精確率、召回率等細粒度指標
    • 通過可視化識別重要特征和決策路徑

進階技巧說明

  1. ??參數調優??:

    • max_depth從8增加到10,允許更復雜的決策邊界
    • 通過min_samples_leaf=5防止葉節點過擬合
    • 平衡模型復雜度和泛化能力
  2. ??可視化增強??:

    • Graphviz提供的可視化比matplotlib更專業
    • 節點顏色填充幫助快速理解決策邏輯
    • 特征名稱直接顯示提高可解釋性
  3. ??模型解釋??:

    • 通過生成的決策樹可以直觀看到重要特征
    • 分析關鍵決策路徑有助于業務理解
    • 識別影響客戶流失的主要因素

7.3 sklearn決策樹參數深度解析

核心參數詳解

class sklearn.tree.DecisionTreeClassifier(criterion='gini',          # 分裂質量衡量標準splitter='best',           # 分裂策略選擇max_depth=None,            # 樹的最大深度min_samples_split=2,       # 分裂所需最小樣本數min_samples_leaf=1,        # 葉節點最小樣本數min_weight_fraction_leaf=0.0, # 葉節點最小權重和max_features=None,         # 考慮的最大特征數random_state=None,         # 隨機種子max_leaf_nodes=None,       # 最大葉節點數min_impurity_decrease=0.0, # 分裂所需最小不純度減少min_impurity_split=None,   # 分裂閾值(已棄用)class_weight=None,         # 類別權重presort=False              # 預排序(已棄用)
)

關鍵參數應用場景

  1. ??max_depth??:

    • ??作用??:控制樹的最大深度,防止過擬合
    • ??調優建議??:
      • 從3-10開始嘗試,通過交叉驗證選擇最優值
      • 數據特征多時可適當增大
      • 可視化決策樹輔助確定合理深度
  2. ??min_samples_split??和??min_samples_leaf??:

    • ??區別??:
      • min_samples_split控制節點是否可以繼續分裂
      • min_samples_leaf保證葉節點的最小樣本量
    • ??設置建議??:
      • 對于大數據集(>10k樣本),可設為0.1%或1%
      • 對于小數據集,保持默認或設為5-10
  3. ??criterion??:

    • ??選擇依據??:
      • 'gini':計算更快,適合大多數情況
      • 'entropy':生成更平衡的樹,但計算量略大
    • ??經驗??:
      • 兩者效果通常相似
      • 當特征有較多類別時,熵可能更合適
  4. ??max_features??:

    • ??作用??:限制每次分裂考慮的特征數,增加隨機性
    • ??推薦值??:
      • None:考慮所有特征(默認)
      • 'sqrt':平方根數量,適用于特征較多時
      • 0.2-0.3:特征非常多時可嘗試
  5. ??class_weight??:

    • ??不平衡數據處理??:
      • None:假設類別平衡
      • 'balanced':自動按類別頻率調整權重
      • 字典:手動指定類別權重
    • ??應用場景??:
      • 當正負樣本比例大于1:5時建議使用
      • 特別關注少數類的預測準確率時

參數調優實戰策略

  1. ??基礎調優流程??:

    • 固定random_state確保結果可復現
    • 先設置max_depth尋找合理樹深度
    • 再調整min_samples_leaf防止過擬合
    • 最后考慮class_weight處理不平衡數據
  2. ??網格搜索示例??:

from sklearn.model_selection import GridSearchCVparam_grid = {'max_depth': [3, 5, 7, 10],'min_samples_leaf': [1, 3, 5, 10],'class_weight': [None, 'balanced']
}grid_search = GridSearchCV(tree.DecisionTreeClassifier(random_state=42),param_grid,cv=5,scoring='f1'
)
grid_search.fit(data_train, target_train)print("最優參數:", grid_search.best_params_)
print("最佳分數:", grid_search.best_score_)
  1. ??學習曲線分析??:
    • 繪制不同max_depth對應的訓練/驗證分數
    • 觀察過擬合和欠擬合點
    • 選擇驗證分數最高的參數

參數選擇經驗法則

  1. ??大數據集??:

    • 增大max_depth和min_samples_leaf
    • 考慮使用max_features
    • 可能需要限制max_leaf_nodes
  2. ??高維數據??:

    • 優先使用'gini'降低計算成本
    • 設置max_features='sqrt'
    • 適當增大min_samples_split
  3. ??不平衡數據??:

    • 使用class_weight='balanced'
    • 關注召回率而非準確率
    • 可能需降低min_samples_leaf
  4. ??過擬合問題??:

    • 減小max_depth
    • 增大min_samples_leaf
    • 嘗試設置max_leaf_nodes

通過系統化的參數調優和業務理解,可以構建出既準確又具有良好解釋性的決策樹模型,為電信客戶流失預測等業務問題提供可靠的數據支持。

總結

決策樹是一種強大且易于理解的機器學習算法,具有以下特點:

  1. 直觀易懂,可以可視化展示
  2. 能夠處理數值型和類別型數據
  3. 不需要復雜的特征預處理
  4. 可以通過剪枝防止過擬合

在實際應用中,需要注意:

  • 選擇合適的劃分標準(基尼指數/信息增益)
  • 合理設置樹的最大深度等參數防止過擬合
  • 對于類別不平衡數據調整類別權重
  • 使用交叉驗證評估模型性能

決策樹也是許多集成方法(如隨機森林、梯度提升樹)的基礎,理解決策樹有助于學習更復雜的集成算法。

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

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

相關文章

React 狀態管理入門:從 useState 到復雜狀態邏輯

作為前端新手,在學習 React 時,useState 往往是我們接觸的第一個 Hook。很多人最初會覺得它只能處理簡單的計數器之類的狀態,但實際上,useState 配合其他 Hook(尤其是 useEffect)可以輕松管理各種復雜狀態。…

DirectX 修復工具檢測 C++ 異常的七大解決方法

在使用電腦的過程中,尤其是在進行與圖形處理、游戲運行或多媒體應用相關的操作時,我們可能會用到 DirectX 修復工具。然而,有時這個工具在運行時會檢測到 C 異常,這無疑給我們帶來了困擾。那么,當遇到這種情況時&#…

0.2. RAII原則:嵌入式C++的基石 (Resource Acquisition Is Initialization)

在C語言的世界里,我們背負著一項沉重而危險的職責:手動管理所有資源。無論是 malloc 后的 free,fopen 后的 fclose,還是獲取互斥鎖后的釋放,程序員都必須在代碼的每一個可能的退出路徑上,確保資源被正確釋放…

Uniworld-V1、X-Omni論文解讀

目錄 一、Uniworld-V1 1、概述 2、架構 3、訓練過程 4、實驗 二、X-Omni 1、概述 2、方法 一、Uniworld-V1 1、概述 動機:當前統一模型雖然可以實現圖文理解和文本生成任務,但是難以實現圖像感知(檢測/分割)與圖像操控&am…

安全常見漏洞

一、OWASP Top 101.注入漏洞(1)SQL 注入原理:通過用戶輸入注入惡意SQL代碼示例:sql-- 惡意輸入OR 11 -- 可能被注入的SQL SELECT * FROM users WHERE username OR 11 AND password (2)防護措施:使用參數化查詢使用ORM框架實施最小權限原則…

管網遙測終端機——管網安全與效率的守護者

管網遙測終端機是一款智能化的管網監測與管理設備,它采用先進的物聯網技術和自動化控制技術,能夠全天候不間斷地對管網系統進行實時監測。該設備通過集成高精度傳感器、穩定可靠的通信模塊和強大的數據處理單元,構建了一套完整的管網運行數據…

AIIData商業版v1.4.1版本發布會

🔥🔥 AllData大數據產品是可定義數據中臺,以數據平臺為底座,以數據中臺為橋梁,以機器學習平臺為中層框架,以大模型應用為上游產品,提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xff…

【Layui】調整 Layui 整體樣式大小的方法

Layui 的默認樣式確實偏大,但你可以通過以下幾種方法來調整整體大小: 使用縮放方法(最簡單) 在 HTML 的 中添加以下 CSS: <style> html {font-size: 14px; /* 調整基礎字體大小 */transform: scale(

MySQL連接數調優實戰:查看與配置

MySQL HikariCP 連接數調優實戰&#xff1a;如何查看用量 & 合理配置 max_connections 在做 Java 后端開發時&#xff0c;我們經常會遇到 MySQL 連接數配置問題&#xff0c;比如&#xff1a; max_connections 配多少合適&#xff1f;HikariCP 的 maximum-pool-size 要不要…

周志華院士西瓜書實戰(一)線性規劃+多項式回歸+邏輯回歸+決策樹

目錄 1. 線性規劃 2. 多項式回歸 3. 邏輯回歸手寫數字 4. Pytorch MNIST 5. 決策樹 1. 線性規劃 先生成 Y1.5X0.2ε 的&#xff08;X,Y&#xff09;訓練數據 兩個長度為30 import numpy as np import matplotlib.pyplot as plt def true_fun(X): # 這是我們設定的真實…

端到端供應鏈優化案例研究:需求預測 + 庫存優化(十二)

本篇文章聚焦于供應鏈中的庫存優化&#xff0c;技術亮點在于通過機器學習改進預測精度&#xff0c;成功將預測誤差降低25%&#xff0c;并在六個月內實現庫存過剩減少40%。該方法適用于需要優化庫存和提升服務水平的商業場景&#xff0c;特別是制藥行業&#xff0c;幫助企業在降…

Harbor 企業級實戰:單機快速上手 × 高可用架構搭建 × HTTPS安全加固

文章目錄一、建立項目二、命令行登錄harbor&#xff08;配置在客戶端即可&#xff09;三、給本地鏡像打標簽并上傳到harbor四、下載harbor的鏡像五、創建自動打標簽上傳鏡像腳本六、修改harbor配置七、實現harbor高可用7.1 安裝第二臺harbor主機7.2 新建目標&#xff0c;輸入第…

進程管理、系統高負載、cpu超過800%等實戰問題處理

進程管理與高負載實戰&#xff1a;CPU 飆到 800% 時的分析與處理 在生產環境中&#xff0c;系統高負載和 CPU 異常占用是運維工程師最常面對的場景之一。 這篇文章將從進程管理基礎講起&#xff0c;到高負載問題定位&#xff0c;再到CPU 占用 800% 的實戰處理&#xff0c;幫助你…

控制建模matlab練習12:線性狀態反饋控制器-①系統建模

此練習&#xff0c;主要是使用狀態空間方程來設計控制器的方法和思路&#xff1a; ①系統建模&#xff1b; ②系統的能控性&#xff1b; ③極點配置&#xff1b; ④最優化控制LQR&#xff1b; ⑤軌跡追蹤&#xff1b; 以下是&#xff0c;第①部分&#xff1a;系統建模&#xff…

bytearray和bytes

bytearray和bytes不一樣的地方在于&#xff0c;bytearray是可變的。 str 人生苦短&#xff0c;我用Python! bytes bytearray(str.encode()) bytes bytearray(b\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe7\x94\xa8Python!) str bytes.d…

護網行動之后:容器安全如何升級?微隔離打造內網“微堡壘”

護網行動剛剛落下帷幕&#xff0c;但這場沒有硝煙的攻防演練&#xff0c;留給安全行業的思考卻從未停止。當“橫向移動”成為攻擊方屢試不爽的殺手锏時&#xff0c;一個過去可能被忽視的角落——容器網絡安全&#xff0c;在本屆護網中被推到了前所未有的高度。面對云原生時代容…

一動鼠標就鎖屏,設備活動監控方案的技術實現與應用

摘要&#xff1a;本文探討基于本地化監控機制實現設備操作追蹤的技術方案&#xff0c;重點解析其觸發邏輯與隱私保護機制。方案適用于需要監控設備使用場景的技術人員。一、核心功能實現原理觸發監控機制鍵盤鉤子&#xff1a;通過系統級鍵盤事件監聽&#xff08;AltL組合鍵激活…

從零開始學習:深度學習(基礎入門版)(1天)

&#xff08;一&#xff09; opencv和opencv-contrib的安裝&#xff08;1.1&#xff09;在桌面地底部的搜索欄&#xff0c;搜索命令提示符&#xff0c;點擊并打開命令提示符&#xff08;1.2&#xff09;依次輸入命令并按回車&#xff1a;pip install opencv-python3.4.18.65 -i…

SimpleMindMap:一個強大的Web思維導圖

在信息爆炸的時代&#xff0c;如何高效地組織、記憶和表達復雜信息成為一項關鍵技能。思維導圖作為一種強大的可視化工具&#xff0c;能夠幫助我們理清思路、激發創意并提高學習效率。最近在逛github的時候發現了一個開源的思維導圖工具SimpleMindMap&#xff0c;和家人們分享下…

正確使用 JetBrains

來自窮鬼的 marker &#xff01;關鍵也不是全靠它吃飯&#xff0c;所以……請鄙視我就對了&#xff01;2023.2.6 和 MybatisX 1.7.3 兼容性好像有些問題&#xff0c;會報錯。想一想降級 MybatisX 不如升級一下 Idea。So, do this.官方下載安裝包并裝之。然后解鎖無需下載文件、…