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

ops/2025/1/12 8:52:56/

目录

一、简介

二、基本结构

三、构建过程

四、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 pltdatas = 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 metricsfrom 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.ppmy.cn/ops/149398.html

相关文章

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener Scheduler 调度器scheduler是Quartz中的独立工作容器,所有的Trigger和Job都需要注册到scheduler中才能工作。我们可以通过SchedulerFactory来获取scheduler实例。如下: //1.获取默认的标准…

Chart.js 雷达图:数据可视化利器

Chart.js 雷达图:数据可视化利器 引言 在数据可视化的领域中,雷达图以其独特的展示方式,成为了一种非常受欢迎的数据展现工具。雷达图能够将多个量化变量的数据以二维图表的形式展示出来,使得观察者能够快速地理解和比较不同数据集之间的差异。Chart.js 是一个强大的 Jav…

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…

《Opencv》信用卡信息识别项目

目录 一、项目介绍 二、数据材料介绍 1、模板图片(1张) 2、需要处理的信用卡图片(5张) 三、实现过程 1、导入需要用到的库 2、设置命令行参数 3、模板图像中数字的定位处理 4、信用卡图像处理 5、模板匹配 四、总结 一…

vs2022编译webrtc步骤

1、主要步骤说明 概述:基础环境必须有,比如git,Powershell这些,就不写到下面了。 1.1 安装vs2022 1、选择使用C的桌面开发 2、 Windows 10 SDK安装10.0.20348.0 3、勾选MFC及ATL这两项 4、 安装完VS2022后,必须安…

iOS中的设计模式(二)- 原型模式

引言 在软件开发中,创建对象的过程往往涉及许多复杂的初始化步骤,尤其是在对象之间具有相似属性或状态时。传统的做法是每次都从头开始创建新的实例,然而,这种方法可能导致性能问题和代码冗余。为了解决这一问题,原型…

QT + opencv 实现形状(轮廓)模板匹配

QT opencv 实现形状(轮廓)模板匹配 实现思路 1.创建模板数据:主要是提取模板的轮廓信息,这一步通常通过边缘检测实现。将模板的轮廓信息存储起来。 代码: //创建形状模板 bool cvLearnShapeMatchPattern_(Mat matDst, MyShapeUiParam pa…

字节小米等后端岗位C++面试题

C 基础 引用和指针之间的区别?堆栈和堆中的内存分配有何区别?存在哪些类型的智能指针?unique_ptr 是如何实现的?我们如何强制在 unique_ptr 中仅存在一个对象所有者?shared_ptr 如何工作?对象之间如何同步…