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

初识机器学习(决策树)

一、机器学习十大常见算法

本篇主要讲述决策树算法。

二、决策树(Decision Tree)

2.1 什么是决策树

决策树是一种基于树结构的监督学习算法,既可以用于分类任务,也可以用于回归任务。它通过模拟人类决策过程,对数据进行逐步划分,最终得出预测结果。

决策树的结构由以下部分组成:

  • 根节点:树的起始节点,包含所有样本,对应第一个划分条件。

  • 内部节点:对应一个特征和该特征上的划分条件,每个内部节点将一个节点中的样本划分到不同的子节点中。

  • 叶节点:树的末端节点,对应最终的决策结果(分类任务中为类别标签,回归任务中为连续值)。

决策树的核心思想:通过对特征空间的递归划分,使得每个子区域中的样本尽可能属于同一类别(分类)或具有相近的目标值(回归)。

2.2 决策树的构建原理

决策树的构建过程本质上是一个递归分裂的过程,其核心在于每次分裂时如何选择最优的特征和划分点。常用的特征选择标准有以下几种:

标准适用场景原理
信息增益分类任务基于信息熵,选择使划分后信息熵下降最多的特征
信息增益率分类任务对信息增益进行归一化,避免偏向取值较多的特征
基尼系数(Gini)分类任务衡量节点的纯度,选择使基尼系数下降最多的特征
均方误差(MSE)回归任务选择使划分后方差下降最多的特征

以分类任务中最常用的基尼系数为例,其计算公式为:

其中​ 表示节点 D 中第 k 类样本所占的比例。基尼系数越小,节点的纯度越高。决策树在每次分裂时,会选择使基尼系数下降幅度最大的特征进行划分。

2.3 决策树的关键参数

sklearnDecisionTreeClassifierDecisionTreeRegressor中,常用的调优参数包括:

参数含义作用
max_depth树的最大深度限制树的生长深度,防止过拟合
min_samples_split节点分裂所需的最小样本数若节点样本数小于该值,则不再分裂
min_samples_leaf叶节点最少样本数限制叶节点的最小样本量,防止过拟合
max_features每次分裂考虑的最大特征数限制特征数量,常用于随机森林
criterion特征选择标准分类任务可选ginientropy,回归任务可选squared_error

这些参数的主要作用是防止过拟合——即模型在训练集上表现很好,但在测试集上泛化能力较差的问题。

2.4 决策树分类实战:电信客户流失预测

下面通过一个完整的案例来展示决策树分类器的使用流程:

import pandas as pd import matplotlib.pyplot as plt import numpy as np from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split from sklearn import tree, metrics from sklearn.model_selection import cross_val_score from sklearn.tree import plot_tree # 自定义混淆矩阵可视化函数 def cm_plot(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') plt.xlabel('Predicted label') return plt # 读取数据 datas = pd.read_excel("电信客户流失数据2.xlsx") data = datas.iloc[:, :-1] # 特征 target = datas.iloc[:, -1] # 目标(是否流失) # 划分训练集和测试集 data_train, data_test, target_train, target_test = train_test_split( data, target, test_size=0.2, random_state=0 )
2.4.1 网格搜索与交叉验证

为了找到最优的模型参数,我们需要进行网格搜索,并结合交叉验证来评估不同参数组合的性能:

depth_score = [] depth = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] # 遍历不同的 max_depth 参数 for i in depth: model = tree.DecisionTreeClassifier(max_depth=i, random_state=0) # 5折交叉验证,以召回率(recall)为评估指标 scores = cross_val_score(model, data_train, target_train, cv=5, scoring='recall') score_mean = sum(scores) / len(scores) depth_score.append(score_mean) # 选择召回率最高的 depth best_depth = depth[np.argmax(depth_score)]

交叉验证的作用是将训练集进一步划分为 K 份(此处 K=5),每次用 K−1 份训练、1份验证,轮流进行 K 次后取平均得分。这样可以更全面地评估模型的泛化能力,避免因单次划分的偶然性导致的评估偏差。

召回率(Recall)是分类任务中的重要指标,尤其适用于不平衡数据集(如客户流失数据中,流失客户通常占比较小)。召回率的计算公式为:

其中 TP 为真正例(实际流失且预测流失),FN 为假负例(实际流失但预测未流失)。召回率越高,说明模型对少数类的识别能力越强。

2.4.2 模型训练与评估
# 使用最优参数训练模型 dtr = tree.DecisionTreeClassifier(max_depth=best_depth, random_state=0) dtr.fit(data_train, target_train) # 训练集预测与评估 train_pred = dtr.predict(data_train) print(metrics.classification_report(target_train, train_pred)) cm_plot(target_train, train_pred).show() # 测试集预测与评估 test_pred = dtr.predict(data_test) print(metrics.classification_report(target_test, test_pred)) cm_plot(target_test, test_pred).show()

classification_report会输出精确率(Precision)、召回率(Recall)、F1-score 等详细的分类评估指标。

2.4.3 决策树可视化
fig, ax = plt.subplots(figsize=(32, 32)) plot_tree(dtr, filled=True, ax=ax) plt.show()

通过plot_tree可以将训练好的决策树可视化展示,每个节点显示划分条件、样本数、类别分布等信息,便于理解模型的决策逻辑。

2.5 决策树回归实战:多元回归

决策树同样可以用于回归任务:

import pandas as pd import numpy as np from sklearn.tree import DecisionTreeRegressor from sklearn.model_selection import cross_val_score, train_test_split datas = pd.read_csv("多元回归.csv", encoding="gbk") data = datas.iloc[:, :-1] target = datas.iloc[:, -1] data_train, data_test, target_train, target_test = train_test_split( data, target, test_size=0.2, random_state=0 ) # 交叉验证选择最佳深度 scores = [] depth = [1, 2, 3, 4, 5] for i in depth: model = DecisionTreeRegressor(max_depth=i, random_state=0) score = cross_val_score(model, data, target) # 默认使用 R² 分数 scores.append(sum(score) / len(score)) best_depth = depth[np.argmax(scores)] print(f"最佳深度: {best_depth}") # 训练模型 model = DecisionTreeRegressor(max_depth=best_depth) model.fit(data_train, target_train) # 评估 train_score = model.score(data_train, target_train) test_score = model.score(data_test, target_test) print(f"训练集 R²: {train_score}") print(f"测试集 R²: {test_score}")

回归任务中,score()方法返回的是决定系数,取值范围为 [0,1],越接近 1 说明模型拟合效果越好。

http://www.jsqmd.com/news/1344875/

相关文章:

  • Unity Text组件中文排版优化实战:解决标点避头尾与中英文混排
  • 腾讯云轻量服务器建站指南:从零部署网站与宝塔面板实战
  • 从逆向工程历史学视角:先秦两汉传统工艺集群对现代科技的整体启示
  • OpenAI审核机制全解析:从原理到实战,保障AI应用安全
  • 具身智能协同机制研究:TVA与VLA的统一建模(2)
  • 2026 年当下,辽阳比较好的AI推广服务团队怎么联系,教你一招,靠它让你的业务订单两周内翻三倍,还能省下三分之二营销费?-抖盈网络科技 - 企业信息推荐-2
  • JavaSE初学(3)
  • 时序逻辑电路实战:从D触发器到状态机的核心原理与工程应用
  • MaxKey:业界领先的IAM-IDaas身份管理和认证产品
  • Unity游戏Mod加载器故障排查指南:从原理到实战解决MelonLoader安装与运行问题
  • 分式函数值域求解全攻略:四大核心方法与实战避坑指南
  • ABB机器人OPC UA通信实战:从环境配置到Python客户端开发
  • 谷歌 AI 权力重组拆解:Hassabis 让位、Jeff Dean 创业,Gemini 4 谁来交卷
  • AI多模态识图赋能开发:从视觉信息到代码的智能转换实战
  • 创业公司ERP生产管理实战:从职责重塑到流程再造
  • SpringBoot AOP统一Web请求日志:从原理到生产级实现
  • 北京卫生间防水补漏公司怎么选?朝阳区专业防水施工经验分享 - 优质品牌商家
  • 电动车怎么邮寄用什么物流便宜?2026年寄大件物流全攻略 - 快递物流资讯
  • Unity光照原理:从CPU到GPU的数据传递链
  • 戴尔iDRAC邮箱告警配置全攻略:从SMTP设置到故障排查
  • 【00010】
  • Ventoy与云固件深度解析:从多系统启动到云端固件架构
  • AI知识库搜索不准?文档分块策略是关键,详解4种实战方案与评估方法
  • 数据集格式转化 xml转换txt xml转换txt 转换代码示例参考 VOC(xml)格式如何转换yolo(txt )格式 (1)
  • Java开发环境搭建指南:从JDK到IntelliJ IDEA的完整配置
  • 气体放电管(GDT)原理、选型与电路防护设计实战指南
  • 缓存穿透、缓存击穿和缓存雪崩详解
  • 【Web安全】API安全测试实战指南(OWASP API Top 10全覆盖,保姆级教程)
  • 北京工商代办服务怎么选?2026年注册公司、税务解异常及代理记账机构实务评测 - 优质品牌商家
  • Android分区存储下外置存储设备(U盘/SD卡)的发现、监听与安全访问实战