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

目录

一、决策树概述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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.官方下载安装包并装之。然后解锁无需下载文件、…