欢迎光临
我们一直在努力

初识机器学习(决策树)

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

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

二、决策树(Decision Tree)

2.1 什么是决策树

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

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

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

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

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

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

2.2 决策树的构建原理

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

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

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

Gini(D) = 1 - \\sum_{k=1}^{K} p_k^2

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

2.3 决策树的关键参数

在 sklearn 的 DecisionTreeClassifier 和 DecisionTreeRegressor 中,常用的调优参数包括:

参数含义作用
max_depth 树的最大深度 限制树的生长深度,防止过拟合
min_samples_split 节点分裂所需的最小样本数 若节点样本数小于该值,则不再分裂
min_samples_leaf 叶节点最少样本数 限制叶节点的最小样本量,防止过拟合
max_features 每次分裂考虑的最大特征数 限制特征数量,常用于随机森林
criterion 特征选择标准 分类任务可选 gini 或 entropy,回归任务可选 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) 是分类任务中的重要指标,尤其适用于不平衡数据集(如客户流失数据中,流失客户通常占比较小)。召回率的计算公式为:

Recall = \\frac{TP}{TP + FN}

其中 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() 方法返回的是决定系数 R^{2},取值范围为 [0,1],越接近 1 说明模型拟合效果越好。

赞(0)
未经允许不得转载:171主机测评 » 初识机器学习(决策树)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址