ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

初识机器学习(决策树)

2026/8/7 7:49:40 拓冰建站 浏览量
初识机器学习(决策树)

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

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

二、决策树(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 说明模型拟合效果越好。