当前位置: 首页 > news >正文

机器学习算法篇(四)决策树算法

目录

一、决策树概述

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.lryc.cn/news/612931.html

相关文章:

  • Qwen-Image开源模型实战
  • 使用萤石云播放视频及主题模版配置
  • VFTO与局部放电-高压设备绝缘系统的双重挑战与防护策略
  • Keil MDK-ARM V5.42a 完整安装教程
  • rk3588s vscode索引失败的问题
  • 12-netty基础-手写rpc-编解码-04
  • web前端结合Microsoft Office Online 在线预览,vue实现(PPT、Word、Excel、PDF等)
  • 表单元素与美化技巧:打造用户友好的交互体验
  • 【LVGL自学笔记暂存】
  • LINUX-批量文件管理及vim文件编辑器
  • VBA之Word应用第四章第一节:段落集合Paragraphs对象(一)
  • 11-netty基础-手写rpc-支持多序列化协议-03
  • 从零开始构建情绪可视化日记平台 - React + TypeScript + Vite
  • 芯谷科技--高效噪声降低解决方案压缩扩展器D5015
  • 30-Hive SQL-DML-Load加载数据
  • 微算法科技(NASDAQ:MLGO)利用集成学习方法,实现更低成本、更稳健的区块链虚拟货币交易价格预测
  • 51单片机
  • 数据推荐|标贝科技方言自然对话数据集 构建语音交互新基建
  • 全球化2.0 | 泰国IT服务商携手云轴科技ZStack重塑云租赁新生态
  • 最新教程 | CentOS 7 内网环境 Nginx + ECharts 页面离线部署手册(RPM 安装方式)
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
  • 如何为WordPress启用LiteSpeed缓存
  • HTML已死,HTML万岁——重新思考DOM的底层设计理念
  • 炫酷圆形按钮调色器
  • Ubuntu 系统 Docker 启动失败(iptables/nf\_tables)
  • 应急响应复现
  • Android 原生与 Flutter 通信完整实现 (Kotlin 版)
  • JPA 分页查询与条件分页查询
  • 《深入理解 WSGI:解锁 Python Web 应用背后的奥秘》
  • Java+Vue合力开发固定资产条码管理系统,移动端+后台管理,集成资产录入、条码打印、实时盘点等功能,助力高效管理,附全量源码