《机器学习》从入门到实战——决策树

目录

一、简介

二、基本结构

三、构建过程

四、API接口解析

1、决策树--分类

(1)、接口调用方法

(2)、参数解析

2、决策树--回归

(1)、接口调用方法

(2)、参数解析

五、代码实践

1、决策树--分类

结果展示:

2、决策树--回归

结果展示:


一、简介

决策树是一种常用的机器学习算法,广泛应用于分类和回归任务。它通过递归地将数据集划分为更纯的子集,构建树状结构来进行决策。每个内部节点表示一个特征或属性的测试,每个分支代表一个可能的测试结果,而每个叶节点则代表一个类别(分类任务)或一个值(回归任务)。

决策树通过对训练样本的学习,并建立分类规则,然后依据分类规则,对新样本数据进行分类预测,属于有监督学习。

二、基本结构

  • 节点

    • 根节点:树的起始点,包含整个数据集。

    • 内部节点:表示一个特征或属性的测试,根据测试结果将数据划分到不同的子节点。

    • 叶节点:表示最终的决策结果(类别或值)。

  • 分支:从一个节点到另一个节点的路径,表示一个特征测试的结果。

  • 划分准则:用于选择最佳特征进行划分的准则,常见的准则有信息增益、信息增益比、基尼指数等。

三、构建过程

决策树的构建过程通常包括以下步骤:

  • 特征选择:从所有特征中选择一个最佳特征作为当前节点的划分标准。常用的特征选择方法有:

    • 信息增益(ID3算法):选择信息增益最大的特征。

    • 信息增益比(C4.5算法):对信息增益进行归一化处理,避免偏向取值较多的特征。

    • 基尼指数(CART算法):选择基尼指数最小的特征。

  • 节点划分:根据选择的特征将数据集划分为若干子集,每个子集对应一个分支。

  • 递归构建:对每个子集递归地重复上述过程,直到满足停止条件(如节点中的样本属于同一类别、样本数小于阈值、树的深度达到预设值等)。

  • 剪枝:为了防止过拟合,可以对生成的决策树进行剪枝,去掉一些不必要的分支。

四、API接口解析

1、决策树--分类

(1)、接口调用方法
python 复制代码
from sklearn.tree import DecisionTreeClassifier

# 创建决策树分类器
clf = DecisionTreeClassifier()

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)
(2)、参数解析
参数名 说明
criterion 衡量分割质量的函数。 可选值: - "gini":基尼系数(默认)。 - "entropy":信息增益。
splitter 选择分割策略。 可选值: - "best":选择最佳分割(默认)。 - "random":随机选择分割。
max_depth 树的最大深度。 如果不设置,树会一直生长直到所有叶子节点纯净或达到其他停止条件。
min_samples_split 分割内部节点所需的最小样本数。 默认是 2。
min_samples_leaf 叶子节点所需的最小样本数。 默认是 1。
min_weight_fraction_leaf 叶子节点所需的最小权重比例(基于样本权重)。 默认是 0。
max_features 寻找最佳分割时考虑的最大特征数。 可以是整数、浮点数或 "auto""sqrt""log2" 等。 默认是 "auto"(即所有特征)。
random_state 随机种子,用于控制随机性(如 splitter="random" 时)。
max_leaf_nodes 最大叶子节点数。 如果不设置,则不限制叶子节点数。
min_impurity_decrease 如果分割导致不纯度的减少大于该值,则进行分割。 默认是 0。
class_weight 类别权重,用于处理不平衡数据集。 可以是 "balanced" 或字典形式。默认是 None
ccp_alpha 用于最小代价复杂度剪枝的正则化参数。 默认是 0(不剪枝)。

2、决策树--回归

(1)、接口调用方法
python 复制代码
from sklearn.tree import DecisionTreeRegressor

# 创建决策树回归器
clf = DecisionTreeRegressor()

# 训练模型
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)
(2)、参数解析
参数名 说明
criterion 衡量分割质量的函数。 可选值: - "squared_error":均方误差(默认)。 - "friedman_mse":改进的均方误差。 - "absolute_error":绝对误差。 - "poisson":泊松偏差。
splitter 选择分割策略。 可选值: - "best":选择最佳分割(默认)。 - "random":随机选择分割。
max_depth 树的最大深度。 如果不设置,树会一直生长直到所有叶子节点纯净或达到其他停止条件。
min_samples_split 分割内部节点所需的最小样本数。 默认是 2。
min_samples_leaf 叶子节点所需的最小样本数。 默认是 1。
min_weight_fraction_leaf 叶子节点所需的最小权重比例(基于样本权重)。 默认是 0。
max_features 寻找最佳分割时考虑的最大特征数。 可以是整数、浮点数或 "auto""sqrt""log2" 等。 默认是 "auto"(即所有特征)。
random_state 随机种子,用于控制随机性(如 splitter="random" 时)。
max_leaf_nodes 最大叶子节点数。 如果不设置,则不限制叶子节点数。
min_impurity_decrease 如果分割导致不纯度的减少大于该值,则进行分割。 默认是 0。
ccp_alpha 用于最小代价复杂度剪枝的正则化参数。 默认是 0(不剪枝)。

五、代码实践

1、决策树--分类

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn import tree
from sklearn import metrics
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=(x, y), horizontalalignment='center', verticalalignment='center')
    plt.ylabel('True label')  # 设置y轴标签
    plt.xlabel('Predicted label')  # 设置x轴标签
    return plt

datas = pd.read_excel('./data/电信客户流失数据.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=42)
dtr = tree.DecisionTreeClassifier(criterion='gini',max_depth=10,min_samples_leaf=5,random_state=42)
dtr.fit(data_train,target_train)

'''训练集混淆矩阵'''
# 训练集预测
train_predict = dtr.predict(data_train)
metr = metrics.classification_report(target_train,train_predict)

'''测试集混淆矩阵'''
test_predicted = dtr.predict(data_test)
metr1 = metrics.classification_report(target_test,test_predicted)
print(metr1)
cm_plot(target_test,test_predicted).show()
dtr.score(data_test,target_test)

# 绘制决策树
fig,ax = plt.subplots(figsize=(32,32))
plot_tree(dtr,filled=True,ax=ax)
plt.show()
结果展示:

2、决策树--回归

python 复制代码
from sklearn.tree import DecisionTreeRegressor
import numpy as np
from sklearn import metrics

from sklearn.model_selection import train_test_split
data = np.loadtxt('../data/fangjia.txt')
x = data[:,:-1]
y = data[:,-1]
# 划分数据集
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3,random_state=1)


reg = DecisionTreeRegressor(max_depth=10,
                            min_samples_leaf=1,
                            min_samples_split=3,
                            ccp_alpha=0.03,
                            max_features="auto",
                            random_state=42)
reg = reg.fit(train_x,train_y)
y_pr = reg.predict(test_x)
# print(y_pr)
print("R² Score:", metrics.r2_score(test_y, y_pr))
结果展示:
相关推荐
Deepoch21 分钟前
智能赋能新范式:Deepoc开发板重塑仓储物流产业生态
人工智能·具身模型·deepoc·物流机器人
the4thone1 小时前
AI基础 笔记
人工智能·笔记
盼哥PyAI实验室1 小时前
我用 Coze + Python,从 0 搭了一个“能真正用”的 AI 律师函系统
开发语言·人工智能·python
jimmyleeee1 小时前
人工智能基础知识笔记三十一:Langfuse的几种tracing的方法
人工智能·笔记
算法与编程之美2 小时前
探索多个卷积层的卷积神经网络
人工智能·深度学习·神经网络·机器学习·cnn
木枷2 小时前
多GPU和单GPU运行llama的时间差
人工智能·llama
老吴学AI2 小时前
2025 Generative AI in Professional Services Report
人工智能
Livingbody2 小时前
基于大模型的智能读报助手
人工智能
企智小茶馆3 小时前
AI新闻 2026年01月02日
人工智能
百锦再3 小时前
抖音小程序开发全景透视:生态解析、技术架构与商业实践
人工智能·ai·微信小程序·小程序·架构·模型·抖音