机器学习之随机森林算法实现和特征重要性排名可视化

随机森林算法实现和特征重要性排名可视化

目录

  • 随机森林算法实现和特征重要性排名可视化
    • 1 随机森林算法
      • 1.1 概念
      • 1.2 主要特点
      • 1.3 优缺点
      • 1.4 步骤
      • 1.5 函数及参数
        • 1.5.1 函数导入
        • 1.5.2 参数
      • 1.6 特征重要性排名
    • 2 实际代码测试

1 随机森林算法


1.1 概念

是一种基于树模型的集成学习方法,它通过在训练过程中构建多棵决策树,并对这些树的预测结果进行投票或平均,从而提高预测的准确性和稳定性。

1.2 主要特点

  1. 集成学习:随机森林通过组合多棵决策树来提高预测性能。每棵树都是一个弱学习器,随机森林将这些弱学习器集成为一个强学习器。
  2. 随机性:在构建每棵树时,随机森林采用了两种随机性:
    • 样本随机性:从原始数据集中随机有放回地抽取一定比例的样本(通常为全部样本的约63.2%)来训练每棵树。
    • 特征随机性:在每棵树的节点分裂时,从所有特征中随机选择一部分特征进行考虑。
  3. 抗过拟合:由于随机森林在构建每棵树时引入了随机性,使得模型具有很好的抗过拟合能力。
  4. 泛化能力:随机森林在很多问题上都有很好的表现,适用于分类和回归任务。
  5. 特征重要性评估:随机森林可以提供特征重要性的评估,有助于理解数据特征对模型预测的影响。

1.3 优缺点

  • 优点
    • 准确率高,抗噪声能力强
    • 能处理高维度数据
    • 易实现并行化计算
  • 缺点
    • 对时间、空间有一定要求

1.4 步骤

  1. 从原始数据集中随机有放回地抽取N个样本。
  2. 在每个节点分裂时,从所有特征中随机选择k个特征,然后选择最优的特征和分裂点。
  3. 重复步骤1和步骤2,直到达到预设的树的数量或深度。
  4. 对于分类问题,采用多数投票法来确定最终类别;对于回归问题,采用平均值来确定最终预测值。

1.5 函数及参数

1.5.1 函数导入

from sklearn.ensemble import RandomForestClassifier

1.5.2 参数
  1. n_estimators: 决策树的数量,默认为100。增加数量可以提高性能,但也会使训练时间增加。
  2. criterion: 衡量分裂质量的函数。默认是“gini”用于基尼不纯度,另一个选项是“entropy”用于信息增益。
  3. max_depth: 树的最大深度。如果为None,则节点会扩展直到所有叶子都是纯的或者直到所有叶子包含小于min_samples_split个样本。限制树深度可以防止过拟合。
  4. min_samples_split: 内部节点再划分所需的最小样本数,默认为2。
  5. min_samples_leaf: 叶子节点最少样本数,默认为1。
  6. min_weight_fraction_leaf: 叶子节点最小的权重分数,默认为0,即不考虑权重。
  7. max_features: 寻找最佳分割时要考虑的特征数量。可以是特征数量的整数,或者小数表示的百分比,或者“auto”(特征数量的平方根),“sqrt”,“log2”。
  8. max_leaf_nodes: 以最优的方式使用最大叶子节点数来增长树。如果为None,则叶子节点数量不受限制。
  9. bootstrap: 是否在构建树时使用放回抽样,默认为True。
  10. oob_score: 是否使用袋外样本来估计泛化精度,默认为False。
  11. n_jobs: 并行运行工作的数量。如果为-1,则使用所有处理器。
  12. random_state: 控制构建树时随机性的种子(用于 reproducibility)。
  13. verbose: 控制树构建过程的冗余度。
  14. warm_start: 当设置为True时,重用之前的解决方案以适应新数据,并在增加新的树时保留现有的树。
  15. class_weight: 用于标定不同类别的权重,可以是一个字典或者“balanced”,默认为None。

这些参数中,n_estimators, max_depth, min_samples_split, min_samples_leaf, 和 max_features 是最常调整的超参数,以优化随机森林模型的表现。在使用随机森林时,通常需要通过交叉验证来选择这些参数的最佳值。

1.6 特征重要性排名

  • RandomForestClassifier().feature_importances_,返回值为ndarray数组
    在这里插入图片描述

2 实际代码测试

数据:

在这里插入图片描述

可以看到各个率都很高
代码展示:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
from pylab import mpl
from sklearn.preprocessing import StandardScalerdata = pd.read_csv('creditcard.csv')
a = data[['Amount']]
b = data['Amount']
# z标准化处理Amount,再存Amount中
scaler = StandardScaler()
data['Amount'] = scaler.fit_transform(data[['Amount']])
# 删除time列
data = data.drop(['Time'],axis=1)
# 特征数据x,删除class列
x = data.drop(['Class'],axis=1)
# class为标签结果列
y = data.Classrfc = RandomForestClassifier(n_estimators=120,max_features=0.8,random_state=314,n_jobs=-1)
x_tr,x_te,y_tr,y_te = \train_test_split(x, y, test_size=0.2,random_state=314)
np.random.seed(seed=4)
# 随机种子
x_tr['Class'] = y_tr
data_tr = x_tr
pt_eg = data_tr[data_tr['Class'] == 0]
ng_eg = data_tr[data_tr['Class'] == 1]
pt_eg = pt_eg.sample(len(ng_eg))
data_c = pd.concat([pt_eg,ng_eg])
x_data_c = data_c.drop(['Class'],axis=1)
y_data_c = data_c['Class']
rfc.fit(x_data_c,y_data_c)
x_tr_pr = rfc.predict(x_data_c)
print(metrics.classification_report(y_data_c ,x_tr_pr))
x_te_pr = rfc.predict(x_te)
print(metrics.classification_report(y_te,x_te_pr))
# 排名
importances = rfc.feature_importances_
im = pd.DataFrame(importances,columns=['importances'])
clos = data.columns
clos_1 = clos.values
clos_2 = clos_1.tolist()
clos = clos_2[0:-1]
im['clos'] = clos
im = im.sort_values(by=['importances'],ascending=False)[:10]
# 中文
mpl.rcParams["font.sans-serif"] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False
index = range(len(im))
plt.yticks(index,im.clos)
plt.barh(index,im["importances"])
plt.show()

运行结果:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

本文作者: 容器服务团队:刘佳旭、冯诗淳 可观测团队:竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准(CNCF Survey[1])。随着承接的业务规模越来越大,用户也在使…

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层,它简化了缓存的使用和管理。Spring Cache默认使用服务器内存,并无法控制缓存时长,查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…

MySQL —— 在CentOS9下安装MySQL

MySQL —— 在CentOS9下安装MySQL 1.查看自己操作系统的版本2.找到对应的安装源3.上传我们在windows下,下载的文件,解压4.执行rpm命令,启用MySQL8仓库5.执行dnf install -y mysql-community-server6.设置开机自启动7.获得初始密码8.登录MySQL…

Center Loss 和 ArcFace Loss 笔记

一、Center Loss 1. 定义 Center Loss 旨在最小化类内特征的离散程度,通过约束样本特征与其类别中心之间的距离,提高类内特征的聚合性。 2. 公式 对于样本 xi​ 和其类别yi​,Center Loss 的公式为: xi​: 当前样本的特征向量&…

AI在软件工程教育中的应用与前景展望

引言 随着科技的快速发展,软件工程教育面临着前所未有的挑战与机遇。传统的教学模式逐渐无法满足快速变化的行业需求,学生们需要更多的实践经验和个性化的学习方式。而在这样的背景下,人工智能(AI)作为一项创新技术&a…

【微服务】面试 7、幂等性

幂等性概念及场景 概念:多次调用方法或接口不改变业务状态,重复调用结果与单次调用一致。例如在京东下单,多次点击提交订单只能成功一次。场景:包括用户重复点击、网络波动导致多次请求、mq 消息重复消费、代码中设置失败或超时重…

Redis 为什么要引入 Pipeline机制?

在 Redis 中有一种 Pipeline(管道)机制,其目的是提高数据传输效率和吞吐量。那么,Pipeline是如何工作的?它又是如何提高性能的?Pipeline有什么优缺点?我们该如何使用 Pipeline? 1、…

游戏引擎学习第78天

Blackboard: Position ! Collision “网格” 昨天想到的一个点,可能本来就应该想到,但有时反而不立即思考这些问题也能带来一些好处。节目是周期性的,每天不需要全程关注,通常只是在晚上思考,因此有时我们可能不能那么…

使用 C# 制作图像的特写窗口

许多网站都会显示一个特写窗口,其中显示放大的图像部分,以便您可以看到更多细节。您在主图像上移动鼠标,它会在单独的图片中显示特写。此示例执行的操作类似。(示例使用的一些数学运算非常棘手,因此您可能需要仔细查看…

Python学习(三)基础入门(数据类型、变量、条件判断、模式匹配、循环)

目录 一、第一个 Python 程序1.1 命令行模式、Python 交互模式1.2 Python的执行方式1.3 SyntaxError 语法错误1.4 输入和输出 二、Python 基础2.1 Python 语法2.2 数据类型1)Number 数字2)String 字符串3)List 列表4)Tuple 元组5&…

【MySQL】SQL菜鸟教程(一)

1.常见命令 1.1 总览 命令作用SELECT从数据库中提取数据UPDATE更新数据库中的数据DELETE从数据库中删除数据INSERT INTO向数据库中插入新数据CREATE DATABASE创建新数据库ALTER DATABASE修改数据库CREATE TABLE创建新表ALTER TABLE变更数据表DROP TABLE删除表CREATE INDEX创建…

力扣257(关于回溯算法)二叉树的所有路径

257. 二叉树的所有路径 一.问题描述 已解答 简单 相关标签 相关企业 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5…

Redis有哪些常用应用场景?

大家好,我是锋哥。今天分享关于【Redis有哪些常用应用场景?】面试题。希望对大家有帮助; Redis有哪些常用应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 是一个高性能的开源键值对(Key-Va…

【2024年华为OD机试】(A卷,100分)- 处理器问题(Java JS PythonC/C++)

一、问题描述 题目描述 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信。 如下图所…

设计模式-结构型-组合模式

1. 什么是组合模式? 组合模式(Composite Pattern) 是一种结构型设计模式,它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说,组合模式允…

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…

Proser:升级为简易的通讯调试助手软件

我本来打算将Proser定位为一个直观的协议编辑、发送端模拟软件,像下面这样。 但是按耐不住升级的心理,硬生生的把即时收发整合了进去,就像这样! 不过,目前针对即时收发还没有发送历史、批量发送等功能,…

PyTorch环境配置常见报错的解决办法

目标 小白在最基础的环境配置里一般都会出现许多问题。 这里把一些常见的问题分享出来。希望可以节省大家一些时间。 最终目标是可以在cmd虚拟环境里进入jupyter notebook,new的时候有对应的环境,并且可以跑通所有的import code。 第一步:…

【Linux系列】Curl 参数详解与实践应用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Web基础-分层解耦

思考:什么是耦合?什么是内聚?软件设计原则是什么? 耦合:衡量软件中各个层 / 各个模块的依赖关联程度。 内聚:软件中各个功能模块内部的功能联系。 软件设计原则:高内聚低耦合。 那我们该如何实现…