news 2026/10/23 4:52:00

DecisionTree 二分类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DecisionTree 二分类

DecisionTree 二分类,指的是用决策树(Decision Tree)解决二分类问题(如 0/1、是/否、流失/不流失)。

下面我从概念、原理、代码实现、典型场景几个方面来讲。


一、什么是决策树?

决策树是一种基于树形结构的分类/回归模型。它通过一系列"如果...那么..."的规则,把样本逐步划分到不同的叶子节点,每个叶子节点对应一个预测结果。

直观理解

想象你在判断一个人是否会买某款产品:

text

年龄 > 30? ├── 是:收入 > 10000? │ ├── 是:会买 ✓ │ └── 否:不会买 ✗ └── 否:性别 = 男? ├── 是:会买 ✓ └── 否:不会买 ✗

这就是一棵决策树。


二、决策树的核心思想

决策树通过递归划分数据,每次选择一个最优特征和最优切分点,把数据分成两部分,使得划分后的子集纯度最高。

划分标准

指标公式说明
信息增益(ID3)熵 - 条件熵划分后熵减少最多
信息增益率(C4.5)信息增益 / 特征熵修正信息增益偏向多值特征的问题
基尼系数(CART)1 - Σ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_samples=1000, n_features=20, n_informative=10, n_redundant=5, weights=[0.9, 0.1], random_state=42 ) # 划分数据集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) # 训练决策树 clf = DecisionTreeClassifier(random_state=42) 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( criterion='gini', # 划分标准:'gini' 或 'entropy' max_depth=5, # 树的最大深度 min_samples_split=10, # 内部节点再划分所需的最小样本数 min_samples_leaf=5, # 叶子节点最少样本数 max_features='sqrt', # 每次划分考虑的最大特征数 class_weight='balanced', # 类别不平衡时自动加权 random_state=42 )
参数含义作用
criterion划分标准'gini'(默认)或'entropy'
max_depth树最大深度限制深度,防过拟合
min_samples_split内部节点最小样本数小于此值不再划分
min_samples_leaf叶子节点最小样本数防止叶子样本太少
max_features每次划分考虑的特征数'sqrt'、'log2'、整数、None
max_leaf_nodes最大叶子数限制树的规模
min_impurity_decrease最小不纯度减少小于此值不划分
class_weight类别权重'balanced'自动处理不平衡
ccp_alpha代价复杂度剪枝后剪枝,防过拟合
random_state随机种子保证可复现

3. 处理类别不平衡

# 方法1:class_weight='balanced' clf = DecisionTreeClassifier(class_weight='balanced', random_state=42) # 方法2:手动指定权重 clf = DecisionTreeClassifier(class_weight={0: 1, 1: 9}, random_state=42) # 方法3:采样(SMOTE 等) # 见前面"SMOTE过采样"章节

class_weight='balanced'会自动按类别频率的反比设置权重。


4. 防止过拟合

决策树不加限制时容易过拟合(可以一直划分到每个叶子只有一个样本)。常用方法:

# 方法1:限制深度 clf = DecisionTreeClassifier(max_depth=5, random_state=42) # 方法2:限制叶子样本数 clf = DecisionTreeClassifier(min_samples_leaf=10, random_state=42) # 方法3:限制叶子节点数 clf = DecisionTreeClassifier(max_leaf_nodes=20, random_state=42) # 方法4:后剪枝(代价复杂度剪枝) clf = DecisionTreeClassifier(ccp_alpha=0.01, random_state=42)

5. 可视化决策树

from sklearn.tree import plot_tree import matplotlib.pyplot as plt plt.figure(figsize=(20, 10)) plot_tree( clf, feature_names=[f'f{i}' for i in range(X.shape[1])], class_names=['负类', '正类'], filled=True, rounded=True, fontsize=10 ) plt.show()

6. 特征重要性

import pandas as pd # 特征重要性 importance = pd.DataFrame({ 'feature': [f'f{i}' for i in range(X.shape[1])], 'importance': clf.feature_importances_ }).sort_values('importance', ascending=False) 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, cv=5, scoring='roc_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_depth=5, random_state=42)) ]) 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_state=42), param_grid, cv=5, scoring='roc_auc', n_jobs=-1 ) grid.fit(X_train, y_train) print("最优参数:", grid.best_params_) print("最优 AUC:", grid.best_score_)

四、决策树的优缺点

优点

  1. 可解释性强:可以画出树,规则清晰,业务容易理解。

  2. 不需要标准化:基于分裂点,对特征尺度不敏感。

  3. 能处理混合类型:数值、类别都可以。

  4. 能处理非线性:自动捕捉非线性关系。

  5. 不需要特征工程:自动做特征选择。

  6. 训练快:相比 DNN,训练速度快。

  7. 能输出特征重要性:方便特征筛选。

缺点

  1. 容易过拟合:不加限制时,可以一直划分到每个叶子一个样本。

  2. 不稳定:数据微小变化可能导致树结构大幅变化。

  3. 偏向多值特征:信息增益偏向取值多的特征(C4.5 用增益率修正)。

  4. 不擅长处理线性关系:需要用多个分裂逼近线性边界。

  5. 对类别不平衡敏感:需要用class_weight或采样。

  6. 单棵树效果有限:通常不如随机森林、XGBoost。


五、决策树 vs 其他模型

维度决策树逻辑回归随机森林XGBoost
可解释性强强中中
非线性强弱强强
过拟合风险高低低低
训练速度快快中中
效果中中好最好
需要标准化否是否否
特征重要性有无有有

实践建议:

  • 需要可解释性 → 决策树、逻辑回归。

  • 追求效果 → 随机森林、XGBoost、LightGBM。

  • 决策树通常作为集成模型的基学习器。


六、典型应用场景

场景说明
风控信用评分、欺诈检测
医疗疾病诊断规则
营销用户流失预测、转化预测
推荐是否点击、是否购买
工业故障诊断
规则提取从数据中提取业务规则

七、关键提醒

  1. 必须限制深度:不加限制会过拟合,用max_depth、min_samples_leaf等。

  2. 不需要标准化:决策树对特征尺度不敏感。

  3. 处理类别不平衡:用class_weight='balanced'或采样。

  4. 随机种子要固定:random_state=42保证可复现。

  5. 注意特征重要性偏差:决策树偏向多值特征,可用 permutation importance 修正。

  6. 单棵树效果有限:实际应用中多用随机森林、XGBoost。

  7. 可以输出概率:predict_proba返回每个类别的概率。

  8. 可视化很直观: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 的基学习器。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 21:46:37

CAD .NET 16.1组件库技术解析与工程实践

1. CAD .NET 16.1 技术解析与应用实践CAD .NET 16.1 是面向.NET开发者的一套计算机辅助设计组件库,它为Windows平台应用程序提供了原生CAD功能集成能力。作为一名长期从事工业软件开发的工程师,我亲历了从早期版本到16.1的迭代过程,这个版本在…

作者头像 李华
网站建设 2026/10/22 14:29:57

STM32F407按键驱动LCD多级菜单:数据结构、消抖与局部刷新

简介:这份资源面向嵌入式开发初学者与进阶工程师,聚焦STM32F407平台下按键输入与12864液晶屏联动的多级菜单实现,可应用于智能家居面板、工业控制界面、车载信息终端等场景。压缩包共110个文件,以50个c源文件与50个h头文件为主体&…

作者头像 李华
网站建设 2026/10/21 17:22:49

目标到底移动得有多快?我用 YOLO + ByteTrack 做了视频速度估计

项目地址: yolo-object-detection-lab:基于 FastAPI 与 Ultralytics YOLO 的图像目标检测实验项目 - AtomGit 前面几篇里,这个项目已经从目标检测一路做到: Single Image → Batch Images → Video → Tracking → Line Crossing → ROI Ana…

作者头像 李华
网站建设 2026/10/21 9:37:04

看懂IEC 62619:2022:工业锂电安全测试与BMS设计要点

简介:IEC 62619:2022(Edition 2.0 2022-05)是国际电工委员会发布的工业用二次锂电池和蓄电池安全要求标准,面向电池设计、制造、测试及使用环节的工程师与合规人员,适合动力电池、储能系统、工业设备等领域的研发和质量…

作者头像 李华
网站建设 2026/10/22 6:57:10

手调格式一小时 vs 科迅捷AI十分钟,哪个更省心

写论文的同学都体会过手调格式的痛苦:标题字号不对、行距不统一、目录页码错乱、图表编号断开、参考文献格式参差。如果你完全靠手动调,一小时能完成的工作量,往往只够你把第一章的标题统一一下。今天我们就来对比一下,手调一小时…

作者头像 李华
网站建设 2026/10/21 5:46:56

NOC指导教师认证真题拆解:递归、二分与机器人巡线核心考点

简介:这份资料围绕全国中小学信息技术创新与实践大赛(NOC)指导教师认证真题整理而成,面向备考该认证的指导教师及竞赛辅导人员,覆盖编程基础、机器人、人工智能、算法与数据结构等核心考点,适合用于考前自测…

作者头像 李华