机器学习——决策树与随机森林

news2025/2/27 20:48:03

机器学习——决策树与随机森林

文章目录

  • 前言
  • 一、决策树
    • 1.1. 原理
    • 1.2. 代码实现
    • 1.3. 网格搜索
    • 1.4. 可视化决策树
  • 二、随机森林算法
    • 2.1. 原理
    • 2.2. 代码实现
  • 三、补充(过拟合与欠拟合)
  • 总结


前言

决策树和随机森林都是常见的机器学习算法,用于分类和回归任务,本文将对这两种算法进行介绍。

在这里插入图片描述


一、决策树

1.1. 原理

决策树算法是一种基于树结构的分类和回归算法。它通过对数据集进行递归地二分,选择最佳的特征进行划分,直到达到终止条件。
决策树的每个内部节点表示一个特征,根据测试结果进行分类,每个叶子节点表示一个类别或一个回归值。
决策树的构建可以通过以下几个步骤来实现:

  1. 特征选择:根据某个评价指标(如信息增益、基尼不纯度等),选择最佳的特征作为当前节点的划分特征。(即哪个特征带来最多的信息变化幅度,就选择哪一个特征来分类)

  2. 划分数据集:根据选择的特征,将数据集划分成多个子集,每个子集对应一个分支。对于离散特征,可以根据特征值的不同进行划分;对于连续特征,可以选择一个阈值进行划分。

  3. 递归构建子树:对每个子集递归地构建子树,直到所有子集被正确分类或满足终止条件。常见的终止条件有:达到最大深度、样本数量小于阈值、节点中的样本属于同一类别等。

  4. 避免过拟合:对决策树进行剪枝处理。剪枝可以分为前剪枝和后剪枝: 前剪枝是在构建树的过程中进行剪枝,通过设定一个阈值,信息熵减小的数量小于这个值则停止创建分支;后剪枝则是在决策树构建完成后,对节点检查其信息熵的增益来判断是否进行剪枝。
    还可以通过控制决策树的最大深度(max_depth)

1.2. 代码实现

import numpy as np
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

#生成数据集
np.random.seed(41)
raw_data = make_moons(n_samples=2000, noise=0.25, random_state=41)
data = raw_data[0]
target = raw_data[1]

# 训练决策树分类模型
x_train, x_test, y_train, y_test = train_test_split(data, target)
classifer = DecisionTreeClassifier()
classifer.fit(x_train, y_train)
#计算测试数据集在决策树模型上的准确率得分
print(classifer.score(x_test, y_test))
0.916


# max_depth 树的最大深度,默认为None
classifer = DecisionTreeClassifier(max_depth=6)
classifer.fit(x_train, y_train)
print(classifer.score(x_test, y_test))
0.934

# min_samples_leaf 叶节点所需的最小样本数,默认为1
classifer = DecisionTreeClassifier(max_depth=6, min_samples_leaf=6)
classifer.fit(x_train, y_train)
print(classifer.score(x_test, y_test))
0.938


# min_impurity_decrease 划分节点时的最小信息增益
def m_score(value):
    model = DecisionTreeClassifier(min_impurity_decrease=value)
    model.fit(x_train, y_train)
    train_score = model.score(x_train, y_train)
    test_score = model.score(x_test, y_test)
    return train_score, test_score
values = np.linspace(0,0.01,50)
score = [m_score(value) for value in values ]
train_s = [s[0] for s in score]
test_s = [s[1] for s in score]
best_index = np.argmax(test_s)
print(test_s[best_index])
print(values[best_index])
plt.plot(train_s,label = "train_s")
plt.plot(test_s,label = "test_s")
plt.legend()
plt.show()

在这里插入图片描述

从以上代码中可以看出在不同参数的选择情况下,准确率(分类器预测正确的样本数量与总样本数量的比例)得分是不同的,越接近1表示模型的预测性能越好

1.3. 网格搜索

可以使用网格搜索获得最优的模型参数:


# 使用网格搜索获得最优的模型参数
from sklearn.model_selection import GridSearchCV
classifer = DecisionTreeClassifier()
params = {
    "max_depth": np.arange(1, 10),
    "min_samples_leaf": np.arange(1, 20),
    "min_impurity_decrease": np.linspace(0,0.4,50),
    "criterion" : ("gini","entropy")
}
grid_searchcv = GridSearchCV(classifer, param_grid=params, scoring="accuracy",
                             cv=5)  # scoring指定模型评估指标,例如:'accuracy'表示使用准确率作为评估指标。
grid_searchcv.fit(x_train, y_train)
print(grid_searchcv.best_params_)
print(grid_searchcv.best_score_)
#print(grid_searchcv.cv_results_)
print(grid_searchcv.best_index_)
print(grid_searchcv.best_estimator_)
best_clf = grid_searchcv.best_estimator_
best_clf.fit(x_train,y_train)
print(best_clf.score(x_test,y_test))
#结果:
{'criterion': 'entropy', 'max_depth': 8, 'min_impurity_decrease': 0.0, 'min_samples_leaf': 16}
0.9286666666666668
15215
DecisionTreeClassifier(criterion='entropy', max_depth=8, min_samples_leaf=16)
0.94

1.4. 可视化决策树

得到可视化决策树文件:

df = pd.DataFrame(data = data,columns=["x1","x2"])
from sklearn.tree import export_graphviz
from graphviz import Source
dot_data = export_graphviz(best_clf, out_file=None, feature_names=df.columns)
graph = Source(dot_data)
graph.format = 'png'file
graph.render(filename='file_image', view=True)

在这里插入图片描述

二、随机森林算法

2.1. 原理

随机森林是一种集成学习方法,它通过构建多个决策树来进行分类或回归,
随机森林的基本原理:

  1. 随机采样:从原始训练集中随机选择一定数量的样本,作为每个决策树的训练集。

  2. 随机特征选择:对于每个决策树的每个节点,从所有特征中随机选择一部分特征进行评估,选择最佳的特征进行划分。

  3. 构建决策树:根据随机采样和随机特征选择的方式,构建多个决策树。

  4. 预测:对于分类问题,通过投票或取平均值的方式,将每个决策树的预测结果进行集成;对于回归问题,将每个决策树的预测结果取平均值。

随机森林函数中的超参数:

  1. n_estimators:它表示随机森林中决策树的个数。

  2. min_samples_split:内部节点分裂所需的最小样本数

  3. min_samples_leaf:叶节点所需的最小样本数

  4. max_features:每个决策树考虑的最大特征数量

  5. n_jobs :表示允许使用处理器的数量

  6. criterion :gini 或者entropy (default = gini)

  7. random_state:随机种子

2.2. 代码实现

import numpy as np
import pandas as pd
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
#训练随机森林分类模型
np.random.seed(42)
raw_data = make_moons(n_samples= 2000,noise= 0.25,random_state=42)
data,target = raw_data[0],raw_data[1]

x_train, x_test, y_train, y_test = train_test_split(data, target,random_state=42)
classfier = RandomForestClassifier(random_state= 42)
classfier.fit(x_train,y_train)
score = classfier.score(x_test,y_test)
print(score)
0.93




#网格搜索获取最优参数
from sklearn.model_selection import GridSearchCV
param_grids = {
    "criterion": ["gini","entropy"],
    "max_depth":np.arange(1,10),
    "min_samples_leaf":np.arange(1,10),
    "max_features": np.arange(1,3)
}
grid_search = GridSearchCV(RandomForestClassifier(),param_grid=param_grids,n_jobs= 1,scoring="accuracy",cv=5)
grid_search.fit(x_train,y_train)
print(grid_search.best_params_)  #最优的参数
print(grid_search.best_score_)	#最好的得分
best_clf = grid_search.best_estimator_   #最优的模型
print(best_clf)
best_clf.fit(x_train,y_train)
print(best_clf.score(x_test,y_test))  #查看测试集在最优模型上的得分
#结果:
{'criterion': 'entropy', 'max_depth': 9, 'max_features': 1, 'min_samples_leaf': 7}
0.9506666666666665
RandomForestClassifier(criterion='entropy', max_depth=9, max_features=1,
                       min_samples_leaf=7)
0.932

三、补充(过拟合与欠拟合)

过拟合指的是模型在训练集上表现得很好,但在测试集或新数据上表现不佳的情况。
过拟合通常发生在模型过于复杂或训练数据过少的情况下

欠拟合指的是模型无法很好地拟合训练集,导致在训练集和测试集上的误差都很高。
欠拟合通常发生在模型过于简单或训练数据过于复杂的情况下


总结

总之,决策树和随机森林都是基于树结构的机器学习算法,具有可解释性和特征选择的能力。随机森林是多个决策树的集成模型,引入了随机性并通过投票或平均来得出最终预测结果,可以有效降低噪声干扰,提高模型的准确性与稳定性,但是增加了计算量。

锦帽貂裘,千骑卷平冈

–2023-9-1 筑基篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OS 内存分区和分页 多级页表与快表

每个进程的PCB都有一个LDT 内存紧缩不实用,所需时间太长 类似于段表,存在页表 但是不连续需要的空间太多了,太麻烦了 多级页表:类比于书的章目录和节目录 构建页目录 每个页目录号指向4M的地址 快表是寄存器,很昂…

Kotlin管道Channel在receiveAsFlow时debounce与flow差异

Kotlin管道Channel在receiveAsFlow时debounce与flow差异 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutine…

Nginx高级配置

目录 一、Nginx 第三方模块 1.1ehco 模块 二、变量 2.1 内置 2.2 自定义变量 三、nginx压缩功能 ​编辑四、https功能 一、Nginx 第三方模块 1.1ehco 模块 基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-…

第7篇:ESP32连接按钮点亮LED无源喇叭播放声音

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播放音乐《涛声…

程序员自由创业周记#3:No1.作品

作息 如果不是热爱,很难解释为什么能早上6点自然醒后坐在电脑前除了吃饭一直敲代码到23点这个现象,而且还乐此不疲。 之前上班的时候生活就很规律,没想到失业后的生活比之前还要规律;记得还在上班的时候,每天7点半懒洋…

670. 最大交换

链接&#xff1a; ​​​​​​670. 最大交换 题解&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:int maximumSwap(int num) {if (num < 0) {return 0;}std::string str to_string(num);stack<int&g…

植物大战僵尸各种僵尸攻略(一)

前言 此文章为“植物大战僵尸”专栏中的004刊&#xff08;2023年9月第2刊&#xff09;&#xff0c;欢迎订阅。版权所有。 注意&#xff1a; 1.本博客适用于pvz无名版&#xff1b; 2.pvz指植物大战僵尸&#xff08;Plants VS Zonbies)&#xff1b; 3.本文以耗费低做标准&am…

JY901B智能9轴加速度计陀螺仪角度传感器

今日学习使用JY901B智能9轴加速度计陀螺仪角度传感器 本文会先使用上位机获取数据作演示&#xff0c;后介绍它的数据表发送原理。 文章提供详细的原理讲解&#xff0c;测试工程下载&#xff0c;代码讲解&#xff0c;本人有多注释的习惯&#xff0c;希望对大家有帮助。 我的J…

2021年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535 输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的第一…

Java学习之序列化

1、引言 《手册》第 9 页 “OOP 规约” 部分有一段关于序列化的约定 1&#xff1a; 【强制】当序列化类新增属性时&#xff0c;请不要修改 serialVersionUID 字段&#xff0c;以避免反序列失败&#xff1b;如果完全不兼容升级&#xff0c;避免反序列化混乱&#xff0c;那么请…

Sitecore站点更新License

一、简介 Sitecore 是一个基于ASP.NET 技术的 CMS 系统&#xff0c;它不仅具有传统 Web CMS 的所有功能&#xff0c;还集成了 Marketing 营销&#xff08;当然&#xff0c;这个功能价格不菲&#xff09;的功能&#xff0c;可以提供一个一站式的在线营销解决方案。对于 .NET 程…

Google Earth Engine 的缺点和限制

随着 Google Earth Engine 在地球科学和数据计算领域越来越流行&#xff0c;网上有很多介绍Google Earth Engine 的文章及 Google Earth Engine的追随者。Google Earth Engine确实是一款伟大的产品&#xff0c;我们应该为其点赞。但由于已经有太多人在热捧了&#xff0c;我这里…

在termux下安装pip

termux的包安装命令是pkg或者apt&#xff0c;在termux下安装python包&#xff0c;一般直接pip。 (本笔记适合初初接触termux或者太久没碰termux而遗忘的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣…

C++ 浅拷贝和深拷贝

目录 1. 浅拷贝 2. 深拷贝 1. 浅拷贝 浅拷贝只是拷贝一个指针&#xff0c;并没有新开辟一个地址&#xff0c;拷贝的指针和原来的指针指向同一块地址&#xff0c;如果原来的指针所指向的资源释放了&#xff0c;那么再释放浅拷贝的指针的资源就会出现错误 对一个已知对象进行拷贝…

在VSCode上画UML的三个插件

2023年9月2日&#xff0c;周六晚上 因为写代理模式的博客时需要画UML&#xff0c;所以就在网上找了半天&#xff0c; 最后觉得VSCode上的这三个插件比较好用 目录 三个画UML的VSCode插件PlantUMLDraw.io IntegrationUMLet我个人推荐使用PlantUML 三个画UML的VSCode插件 Pla…

实战-支付漏洞

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0c…

A 股个股资金流 API 数据接口

A 股个股资金流 API 数据接口 全量股票资金流数据&#xff0c;全量A股数据&#xff0c;最长30日历史数据 1. 产品功能 支持所有A股资金流数据查询&#xff1b;每日定时更新数据&#xff1b;支持多达 30 日历史数据查询&#xff1b;超高的查询效率&#xff0c;数据秒级返回&am…

springboot 与 Redis整合

SpringBoot 操作数据&#xff1a;Spring-data jpa jdbc mongodb redis! SpringData 也是和SpringBoot 齐名的项目&#xff01; 说明&#xff1a;在SpringBoot2.X 之后&#xff0c;原来使用的jedis被替换成了lettuce jedis&#xff1a; 采用的直连&#xff0c;多个线程操作的话&…

【Unity3D】UI Toolkit简介

1 前言 UI Toolkit 是一种基于 Web 技术的 GUI 框架&#xff0c;是为了解决 UGUI 效率问题而设计的新一代 UI 系统&#xff08;UGUI 的介绍详见→UGUI概述&#xff09;。与 UGUI 不同&#xff0c;UI Toolkit 没有采用 GameObject 的方式&#xff0c;而是参考了 Web 技术的 XML …

深度学习应用-WeNet语音识别实战01

概括 本文对WeNet声音识别网络的Python API上介绍的Non-Streaming Usage和 Streaming-Usage分别做了测试&#xff0c;两者本质相同。API对应采样的声音帧率、声道都做了限制。效果还可以&#xff0c;但是部分吐字不清晰、有歧义的地方仍然不能识别清晰。 项目地址&#xff1a; …