当前位置: 首页 > article >正文

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

目录

一、简介

二、基本结构

三、构建过程

四、API接口解析

1、决策树--分类

(1)、接口调用方法

(2)、参数解析

2、决策树--回归

(1)、接口调用方法

(2)、参数解析

五、代码实践

1、决策树--分类

结果展示:

2、决策树--回归

结果展示: 


一、简介

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

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

二、基本结构

  • 节点

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

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

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

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

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

三、构建过程

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

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

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

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

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

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

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

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

四、API接口解析

1、决策树--分类

(1)、接口调用方法
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)、接口调用方法
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、决策树--分类

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、决策树--回归

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))
结果展示: 

 


http://www.kler.cn/a/468540.html

相关文章:

  • 深入刨析数据结构之排序(上)
  • huggingface 下载方法 测试ok
  • 工控安全需求分析与安全保护工程
  • 【网络协议】开放式最短路径优先协议OSPF详解(一)
  • 【数据结构】链表(2):双向链表和双向循环链表
  • 在大型语言模型LLM中使用私有数据
  • 记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)
  • 算法13、基础二分查找的应用(木根切割等)
  • kubernetes-循序渐进了解coredns
  • 打造三甲医院人工智能矩阵新引擎(二):医学影像大模型篇--“火眼金睛”TransUNet
  • Spring Boot教程之四十九:Spring Boot – MongoRepository 示例
  • 【数据结构与算法:二、线性表】
  • Zookeeper模式安装Kafka(含常规、容器两种安装方式)
  • SpringBoot的6种API请求参数读取方式
  • 【C++】P1428 小鱼比可爱
  • Unity开发2d游戏全套教程[入门案例]
  • 0-基于蚁群优化和带注意力机制的循环神经网络的新型混合算法用于解决旅行商问题(HAL science)(完)
  • 【数据结构与算法:五、树和二叉树】
  • Springboot使用Rabbitmq的延时队列+死信队列实现消息延期消费
  • 快速将索尼手机联系人导出为 HTML 文件
  • 2024 年度时序数据库 IoTDB 论文总结
  • From matplotl1b.path 1mport failed to import ImportError:numpy.core.multiarray
  • CentOS — 群组管理
  • NVIDIA DLI课程《NVIDIA NIM入门》——学习笔记
  • 【USRP】教程:在Macos M1(Apple芯片)上安装UHD驱动(最正确的安装方法)
  • 【C++】矩阵转置问题详解与优化