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

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

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

目录

  • 随机森林算法实现和特征重要性排名可视化
    • 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 StandardScaler

data = 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.Class

rfc = 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.kler.cn/a/472618.html

相关文章:

  • Linux(上):基本知识篇
  • Flink源码解析之:Flink on k8s 客户端提交任务源码分析
  • 个人博客搭建(二)—Typora+PicGo+OSS
  • QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?
  • Flutter Web 中文字体显示异常问题
  • IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾
  • Three.js 12中利用着色器进行材质加工深度解析
  • Backend - C# asp .net core MVC
  • 制造业该怎么做数据治理?
  • 【免费】2000-2010年各省第二产业就业人数数据
  • HarmonyOS 应用开发实践——基于 `Index` 组件的多语言、主题模式与文件存储管理
  • json报文的序列化与反序列化问题总结(对比fastjson和jackson)
  • QT鼠标、键盘事件
  • JavaAPI.02.包装类与正则表达式
  • 在vue3项目中利用自定义ref实现防抖
  • C++和Python中负数取余结果的区别
  • imageio 图片转mp4 保存mp4
  • 深度学习从入门到实战——卷积神经网络原理解析及其应用
  • js 根据条件判断样式
  • ElasticSearch内存占用率过高怎么办?
  • Java中将特征向量转换为矩阵的实现
  • CentOS 8 系统中添加 4G 大小的swap(交换空间)
  • 如何理解支持向量回归
  • 滑动变阻器的三种连接方式
  • linux中给自己编译的模块签名
  • element-ui下拉输入框+resetFields无法回显