DecisionTree 二分类

发布时间:2026/10/14 18:11:30

DecisionTree 二分类 DecisionTree 二分类指的是用决策树Decision Tree解决二分类问题如 0/1、是/否、流失/不流失。下面我从概念、原理、代码实现、典型场景几个方面来讲。一、什么是决策树决策树是一种基于树形结构的分类/回归模型。它通过一系列如果...那么...的规则把样本逐步划分到不同的叶子节点每个叶子节点对应一个预测结果。直观理解想象你在判断一个人是否会买某款产品text年龄 30 ├── 是收入 10000 │ ├── 是会买 ✓ │ └── 否不会买 ✗ └── 否性别 男 ├── 是会买 ✓ └── 否不会买 ✗这就是一棵决策树。二、决策树的核心思想决策树通过递归划分数据每次选择一个最优特征和最优切分点把数据分成两部分使得划分后的子集纯度最高。划分标准指标公式说明信息增益ID3熵 - 条件熵划分后熵减少最多信息增益率C4.5信息增益 / 特征熵修正信息增益偏向多值特征的问题基尼系数CART1 - Σp²划分后基尼不纯度最小sklearn 默认用 CART 基尼系数。关键概念概念说明根节点树的起点包含所有样本内部节点一个判断条件如 年龄 30叶子节点最终的分类结果深度从根到叶的最长路径剪枝防止过拟合去掉不必要的分支三、代码实现1. 基本用法from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, roc_auc_score, classification_report # 生成二分类数据 X, y make_classification( n_samples1000, n_features20, n_informative10, n_redundant5, weights[0.9, 0.1], random_state42 ) # 划分数据集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 训练决策树 clf DecisionTreeClassifier(random_state42) clf.fit(X_train, y_train) # 预测 y_pred clf.predict(X_test) y_pred_prob clf.predict_proba(X_test)[:, 1] # 评估 print(准确率:, accuracy_score(y_test, y_pred)) print(AUC:, roc_auc_score(y_test, y_pred_prob)) print(\n分类报告:) print(classification_report(y_test, y_pred))2. 重要参数clf DecisionTreeClassifier( criteriongini, # 划分标准gini 或 entropy max_depth5, # 树的最大深度 min_samples_split10, # 内部节点再划分所需的最小样本数 min_samples_leaf5, # 叶子节点最少样本数 max_featuressqrt, # 每次划分考虑的最大特征数 class_weightbalanced, # 类别不平衡时自动加权 random_state42 )参数含义作用criterion划分标准gini默认或entropymax_depth树最大深度限制深度防过拟合min_samples_split内部节点最小样本数小于此值不再划分min_samples_leaf叶子节点最小样本数防止叶子样本太少max_features每次划分考虑的特征数sqrt、log2、整数、Nonemax_leaf_nodes最大叶子数限制树的规模min_impurity_decrease最小不纯度减少小于此值不划分class_weight类别权重balanced自动处理不平衡ccp_alpha代价复杂度剪枝后剪枝防过拟合random_state随机种子保证可复现3. 处理类别不平衡# 方法1class_weightbalanced clf DecisionTreeClassifier(class_weightbalanced, random_state42) # 方法2手动指定权重 clf DecisionTreeClassifier(class_weight{0: 1, 1: 9}, random_state42) # 方法3采样SMOTE 等 # 见前面SMOTE过采样章节class_weightbalanced会自动按类别频率的反比设置权重。4. 防止过拟合决策树不加限制时容易过拟合可以一直划分到每个叶子只有一个样本。常用方法# 方法1限制深度 clf DecisionTreeClassifier(max_depth5, random_state42) # 方法2限制叶子样本数 clf DecisionTreeClassifier(min_samples_leaf10, random_state42) # 方法3限制叶子节点数 clf DecisionTreeClassifier(max_leaf_nodes20, random_state42) # 方法4后剪枝代价复杂度剪枝 clf DecisionTreeClassifier(ccp_alpha0.01, random_state42)5. 可视化决策树from sklearn.tree import plot_tree import matplotlib.pyplot as plt plt.figure(figsize(20, 10)) plot_tree( clf, feature_names[ff{i} for i in range(X.shape[1])], class_names[负类, 正类], filledTrue, roundedTrue, fontsize10 ) plt.show()6. 特征重要性import pandas as pd # 特征重要性 importance pd.DataFrame({ feature: [ff{i} for i in range(X.shape[1])], importance: clf.feature_importances_ }).sort_values(importance, ascendingFalse) print(importance)输出示例feature importance 2 f2 0.3521 7 f7 0.2145 0 f0 0.1234 ...含义重要性越高该特征对分类的贡献越大。7. 交叉验证from sklearn.model_selection import cross_val_score scores cross_val_score(clf, X, y, cv5, scoringroc_auc) print(5折交叉验证 AUC:, scores.mean())8. 在 Pipeline 中使用from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.tree import DecisionTreeClassifier pipe Pipeline([ (scaler, StandardScaler()), # 决策树不需要标准化这里仅为演示 (clf, DecisionTreeClassifier(max_depth5, random_state42)) ]) pipe.fit(X_train, y_train) print(Pipeline 准确率:, pipe.score(X_test, y_test))注意决策树不需要标准化因为它是基于分裂点的对特征尺度不敏感。9. 网格搜索调参from sklearn.model_selection import GridSearchCV param_grid { max_depth: [3, 5, 7, 10], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 5], criterion: [gini, entropy] } grid GridSearchCV( DecisionTreeClassifier(random_state42), param_grid, cv5, scoringroc_auc, n_jobs-1 ) grid.fit(X_train, y_train) print(最优参数:, grid.best_params_) print(最优 AUC:, grid.best_score_)四、决策树的优缺点优点可解释性强可以画出树规则清晰业务容易理解。不需要标准化基于分裂点对特征尺度不敏感。能处理混合类型数值、类别都可以。能处理非线性自动捕捉非线性关系。不需要特征工程自动做特征选择。训练快相比 DNN训练速度快。能输出特征重要性方便特征筛选。缺点容易过拟合不加限制时可以一直划分到每个叶子一个样本。不稳定数据微小变化可能导致树结构大幅变化。偏向多值特征信息增益偏向取值多的特征C4.5 用增益率修正。不擅长处理线性关系需要用多个分裂逼近线性边界。对类别不平衡敏感需要用class_weight或采样。单棵树效果有限通常不如随机森林、XGBoost。五、决策树 vs 其他模型维度决策树逻辑回归随机森林XGBoost可解释性强强中中非线性强弱强强过拟合风险高低低低训练速度快快中中效果中中好最好需要标准化否是否否特征重要性有无有有实践建议需要可解释性 → 决策树、逻辑回归。追求效果 → 随机森林、XGBoost、LightGBM。决策树通常作为集成模型的基学习器。六、典型应用场景场景说明风控信用评分、欺诈检测医疗疾病诊断规则营销用户流失预测、转化预测推荐是否点击、是否购买工业故障诊断规则提取从数据中提取业务规则七、关键提醒必须限制深度不加限制会过拟合用max_depth、min_samples_leaf等。不需要标准化决策树对特征尺度不敏感。处理类别不平衡用class_weightbalanced或采样。随机种子要固定random_state42保证可复现。注意特征重要性偏差决策树偏向多值特征可用 permutation importance 修正。单棵树效果有限实际应用中多用随机森林、XGBoost。可以输出概率predict_proba返回每个类别的概率。可视化很直观plot_tree可以画出树结构方便业务解释。八、决策树的重要属性属性说明tree_底层树结构feature_importances_特征重要性classes_类别标签n_classes_类别数max_depth实际最大深度n_leaves_叶子节点数n_features_in_输入特征数九、决策树的重要方法方法说明fit(X, y)训练predict(X)预测类别predict_proba(X)预测概率predict_log_proba(X)预测对数概率score(X, y)准确率apply(X)返回每个样本所在的叶子节点索引decision_path(X)返回决策路径十、总结DecisionTree 二分类 用决策树解决二分类问题。核心思想递归划分每次选最优特征和切分点让子集纯度最高。划分标准基尼系数默认、信息增益、信息增益率。sklearn 实现DecisionTreeClassifier。关键参数max_depth、min_samples_split、min_samples_leaf、class_weight。核心价值可解释性强、不需要标准化、自动特征选择、能输出特征重要性。主要代价容易过拟合、不稳定、单棵树效果有限。关键原则限制深度、处理不平衡、固定随机种子、注意特征重要性偏差。它和前面讲的 DNN 二分类、逻辑回归二分类、XGBoost 二分类一样都是二分类算法区别在于决策树可解释性最强、最容易理解但单棵树效果有限实际应用中通常作为随机森林、GBDT、XGBoost 的基学习器。
延伸阅读

更多相关文章

2026/10/14 18:11:30

基于DFT的HRTF空间音频MATLAB实现与工程避坑指南

简介:这份资源是面向音频信号处理学习者与MATLAB开发者的HRTF空间音频合成实践项目,核心目标是通过头相关传递函数(HRTF)将单声道蜂鸣声在水平面以5度为增量环绕听众移动,从而直观理解3D空间化音频的合成原理。项目采用…

2026/10/14 18:11:30

Qt并发编程实战:用QtConcurrent与进度对话框解决界面卡死

作为Qt开发者,多线程和界面卡死,几乎是每个人写第一个复杂工具时都会撞上的墙。Qt 5.14.2自带Examples里有一个名字很朴素的工程,QtConcurrent Progress Dialog,第一次看到时我觉得它不过是官方顺手凑数的示例,直到后来…

2026/10/14 18:06:28

自底向上多人姿态估计:PAF、关联嵌入与中心点方案全解读

1. 为什么2020年的综述要专门给Bottom-Up留出一整章先抛一个现象。我整理手头姿态估计的方案选型时发现一个很有趣的规律:同样一张密集人群的照片,自顶向下模型在单人特写里能跑出极高的关键点精度,一旦画面里挤了十几个人,命中率…

2026/10/14 19:22:00

x86汇编FPU对数指令全解析:FYL2X原理与精度控制

从去年开始断断续续写这个汇编系列,到了第68部分,终于要碰FPU里的对数指令了。说实话,在网络应用、业务代码满天飞的年代,可能绝大多数程序员一辈子都不会直接写汇编,更不会碰x87浮点栈。但如果你做的是底层引导程序、…

2026/10/14 19:22:00

基于YOLOv8的持械检测:从数据标注到部署的完整实践指南

简介:基于YOLOv8的持械检测模型部署包,面向安防监控与公共安全领域的开发者、算法工程师及计算机视觉学习者,可用于视频流或图片中持刀、持枪、持棍等行为的实时识别与威胁评估。压缩包共6个文件,包含.pt与.onnx两种主流模型格式&…

2026/10/14 19:22:00

基于Springboot的智慧点餐系统设计与实现-计算机毕业设计源码+LW文档

摘 要 点餐的用户越来越多使得智慧点餐系统成为了一个必不可少的工具。智慧点餐系统旨在提供高效、准确和便捷的智慧点餐系统管理和资料服务。本文讲述了基于java语言开发,后台数据库选择MySQL进行数据的存储。该软件的主要功能是进行智慧点餐系统的管理。主要包括…

2026/10/14 19:22:00

C/C++访问MySQL实战:从C API到连接池与预处理语句

开篇:别急着写代码,先搞懂C/C访问MySQL的底层逻辑如果你接触过一段时间的MySQL开发,大概率会有这样的体会:用命令行或者图形工具操作数据库,跟用C/C代码操作数据库,完全是两个世界。命令行里一句SELECT敲下…

2026/10/14 19:22:00

OpenRig实战:将SOLIDWORKS数据接入3DEXPERIENCE平台的完整指南

接手这个项目前,我其实已经被本地的图纸管理折磨得够呛。我们团队一直用SOLIDWORKS做产品设计,常规操作就是一人一台电脑一个共享盘,改完一版存成“A柜体最终版3”,隔两天又出来一个“A柜体最终版4最终确认”。直到有次评审会&…

2026/10/14 19:16:59

Agent 开发代码片段分享

分享一个学习中的代码片段,通过火山引擎Agent Plan的API Key langchain搭建一个简单的Agent助手 代码如下: from langchain_openai import ChatOpenAI from langchain.agents import create_agent, AgentState from langchain.agents.middleware import…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑