【机器学习】随机森林预测并可视化特征重要性

2023-11-08

         今天需要用到特征重要性的分析,所以干脆就写一下使用随机森林是如何做建模并基于随机森林做特征重要性的分析。顺带给出了编码方式、随机森林、特征重要性可视化的完整Python代码,都是可以直接运行的。

目  录

1  分类型特征编码

1.1  LabelEncoder编码

 1.2  独热编码(One-Hot Encoding)

2  随机森林回归模型

2.1  随机森林回归模型建立

2.2  模型评价指标

3  基于随机森林的特征重要性可视化


实验环境:

        Window 10

        PyCharm 2021.2.2(Community Edition)

实验说明:

        data:数据集(我的数据包含27个特征,1个目标变量)

 !!!数据集是预处理过后数据,其中的分类型特征已被编码。若数据集未编码,可以使用以下方式对分类型特征编码!!!

1  分类型特征编码

1.1  LabelEncoder编码

        LabelEncoder编码会将分类型特征按照1、2、3、4...的方式编码

# 导入LabelEncoder包
from sklearn.preprocessing import LabelEncoder

# 选出分类型特征
bool_features = ['有阳台', '有厨房', '有地窖', '有电梯', '有花园', '是新建筑', '上传日期', '可带宠物']

for i in bool_features:
    le = LabelEncoder()
    le = le.fit(data[i])
    data[i] = le.transform(data[i])
    #data[i] = LabelEncoder().fit_transform(train[i])
    print(f'{i}处理成功~')

 1.2  独热编码(One-Hot Encoding)

        独热编码会将分类型数据按照(1,0,0)、(0,1,0)、(0,0,1)的方式编码,这种编码方式会扩增特征维数,具体来说,假设你的“可带宠物”包含3类,那么独热编码后就会使得该特征变为3列

from sklearn.preprocessing import OneHotEncoder

# 创建OneHotEncoder对象
encoder = OneHotEncoder(categories='auto', sparse=False)

# 对需要进行One-Hot编码的特征进行编码
encoded_data = encoder.fit_transform(data[bool_features])

# 获取编码后特征的名称并根据原始特征的取值进行命名
feature_names = []
for feature, categories in zip(bool_features, encoder.categories_):
    for category in categories:
        feature_names.append(f"{feature}_{category}")
# 将编码后的特征转化为DataFrame,并使用新的特征名称进行命名
encoded_data = pd.DataFrame(encoded_data, columns=feature_names)

# 将编码后的特征替换原始数据集中的特征
data.drop(bool_features, axis=1, inplace=True)
train = pd.concat([data, pd.DataFrame(encoded_data)], axis=1)

上述代码会删掉编码前的特征列,并在最后加入编码后的特征列 


2  随机森林回归模型

2.1  随机森林回归模型建立

变量解释:
        y_test:验证集的真实值,Series类型

        y_test_t:验证集的真实集,ndarray类型

        y_pred:验证集的预测值,ndarray类型

# 导入必要的库
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
# 用于保存和提取模型
import joblib
import matplotlib.pyplot as plt  # 绘图库
# 解决画图中文字体显示的问题
plt.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'Times New Roman']  # 汉字字体集
plt.rcParams['font.size'] = 12  # 字体大小
plt.rcParams['axes.unicode_minus'] = False
# 忽略警告
import warnings
warnings.filterwarnings('ignore')

# 读取数据集
data = pd.read_csv('./data.csv', encoding='gbk')

# 特征
X = data.drop('房屋租金', axis=1)
# 目标变量
y = data['房屋租金']

# 数据集拆分出训练集和验证集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=2023)

# 定义一个默认随机森林回归模型
RF = RandomForestRegressor(n_jobs=-1)
# 训练模型
RF.fit(X_train, y_train)

# 保存模型
joblib.dump(RF, r'./RF.pkl')
# 读取模型
RF = joblib.load(r'./RF.pkl')

# 模型预测
y_pred = RF.predict(X_test)

# 绘制线图
# 前200条预测结果的可视化
plt.figure(figsize=(20, 6))
y_tesy_t = np.asarray(y_test)
plt.plot(y_tesy_t[:200], label='True Values')
plt.plot(y_pred[:200], label='Predicted Values')
plt.xlabel('Index')
plt.ylabel('Value')
plt.legend()
plt.savefig('./前200条预测结果图.jpg', dpi=400, bbox_inches='tight')
plt.show()

使用模型预测验证集,得到前200条数据的可视化结果如下:

可以看到模型的预测结果和验证集的真实值还是非常接近的 。

(当然这里是预测验证集,所以是会有True Values的。通常来说测试集的标签值我们是不知道的,所以对于测试集而言我们只能做预测,没办法做对比,也就是只能画出图上的Predicted Values那一条线)

2.2  模型评价指标

对于机器学习中的回归模型,我们一般使用但不局限于以下4个指标:

  • 均方误差、均方根误差、平均绝对误差:误差当然是越小说明模型拟合的效果越好
  • R^{2}:拟合优度,通常情况下取值在0~1之间,越接近1说明模型的效果越好,越接近0模型越差。
  • R^{2}取值也是可以为负数的,这时候说明使用平均值来当预测值的效果都比模型的预测好,意思就是模型的效果非常垃圾,大概是废了。
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 模型评估
# 计算均方误差(MSE)
mse = mean_squared_error(y_test, y_pred)
print("均方误差(MSE):", mse)

# 计算均方根误差(RMSE)
rmse = np.sqrt(mse)
print("均方根误差(RMSE):", rmse)

# 计算平均绝对误差(MAE)
mae = mean_absolute_error(y_test, y_pred)
print("平均绝对误差(MAE):", mae)

# 计算决定系数(R²)
r2 = r2_score(y_test, y_pred)
print("决定系数(R²):", r2)

随机森林回归模型的评价指标结果:

均方误差(MSE): 0.04583461034583555
均方根误差(RMSE): 0.2140901920822987
平均绝对误差(MAE): 0.14870750835532767
决定系数(R^{2}): 0.8649912651874802

 我们以MAE和R^{2}作为评价指标。可以看出来平均绝对误差0.14,这说明预测值和真实值的平均误差在\pm0.14左右,预测效果良好。决定系数的值为0.865,说明模型的性能还是很好的。


3  基于随机森林的特征重要性可视化

使用解释:

  1. feature_importances_df:这个变量就是特征的重要性得分
  2. 特征重要性一般是为了筛选出对目标变量影响较大的因素,所以使用到的数据集是整个数据集,而不是拆分出来的训练集。(可用于影响因素那部分的研究中)
  3. 下面代码中一些注释可以根据自己需要解开,使用到的中文字体为宋体,数字字体是Time New Roman
# 导入必要的库
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt  # 绘图库
# 解决画图中文字体显示的问题
plt.rcParams['font.sans-serif'] = ['SimSun', 'Times New Roman']  # 汉字字体集
plt.rcParams['font.size'] = 10  # 字体大小
plt.rcParams['axes.unicode_minus'] = False
# 忽略警告
import warnings
warnings.filterwarnings('ignore')

# 读取数据集
data = pd.read_csv('./数据集.csv', encoding='gbk')
# Split data into features and target
X = data.drop('房屋租金', axis=1)
y = data['房屋租金']
# 定义一个随机森林回归模型
RF = RandomForestRegressor(n_jobs=-1)
# 训练模型
RF.fit(X, y)
# 获取特征重要性得分
feature_importances = RF.feature_importances_
# 创建特征名列表
feature_names = list(X.columns)
# 创建一个DataFrame,包含特征名和其重要性得分
feature_importances_df = pd.DataFrame({'feature': feature_names, 'importance': feature_importances})
# 对特征重要性得分进行排序
feature_importances_df = feature_importances_df.sort_values('importance', ascending=False)

# 颜色映射
colors = plt.cm.viridis(np.linspace(0, 1, len(feature_names)))

# 可视化特征重要性
fig, ax = plt.subplots(figsize=(10, 6))
ax.barh(feature_importances_df['feature'], feature_importances_df['importance'], color=colors)
ax.invert_yaxis()  # 翻转y轴,使得最大的特征在最上面
ax.set_xlabel('特征重要性', fontsize=12)  # 图形的x标签
ax.set_title('随机森林特征重要性可视化',fontsize=16)
for i, v in enumerate(feature_importances_df['importance']):
    ax.text(v + 0.01, i, str(round(v, 3)), va='center', fontname='Times New Roman', fontsize=10)

# # 设置图形样式
# plt.style.use('default')
ax.spines['top'].set_visible(False)  # 去掉上边框
ax.spines['right'].set_visible(False)  # 去掉右边框
# ax.spines['left'].set_linewidth(0.5)#左边框粗细
# ax.spines['bottom'].set_linewidth(0.5)#下边框粗细
# ax.tick_params(width=0.5)
# ax.set_facecolor('white')#背景色为白色
# ax.grid(False)#关闭内部网格线

# 保存图形
plt.savefig('./特征重要性.jpg', dpi=400, bbox_inches='tight')
plt.show()

我认为这个可视化还是非常美观的,从布局以及配色的过渡上都是很符合学术规范的^_^

特征重要性可视化结果:

图示说明对于目标变量房屋租金而言,影响较大的是居住面积>价格趋势>服务费>区域2。这表明在房屋租金的定价中,大的面积、上升的房价趋势、更高的服务费缴纳、地处更发达的市区会使得房屋租金更高,房东可以制定更高的租金!

就想到这里啦!等小白后面想到什么再补充吧! 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习】随机森林预测并可视化特征重要性 的相关文章

随机推荐

  • AR基础讲解:打造AR元宇宙博物馆编程之旅

    AR基础讲解 打造AR元宇宙博物馆编程之旅 随着技术的不断发展 增强现实 AR 正逐渐成为各个领域的热门技术 而在AR中 构建一个全新的虚拟世界 AR元宇宙博物馆 使我们能够透过手机或其他AR设备与数字内容进行互动 本文将为大家介绍如何使用
  • 美国病毒systemd占用100%,root密码登录卡死

    1 top 查看到有僵尸进程一直启动 2 lsof p 752 查看进程的来源 3 crontab l 查看定时任务 是否有自动启动
  • C语言网络编程(二)建立套接字通讯UDP

    所谓socket套接字 指的是在网络通信以前建立的通信接口 进行网络连接以前 需要向系统注册申请一个新的socket 然后使用这个socket进行网络连接 提示 套接字 传输层协议 端口号 IP地址 在进行网络连接以前 需要用socket函
  • 代码随想录算法训练营19期第57天

    647 回文子串 代码随想录 初步思路 动态规划 总结 dp i j 表示区间范围 i j 注意是左闭右闭 的子串是否是回文子串 当 s i s j 时 需要判断 dp i 1 j 1 是不是一个回文串 if s i s j j i lt
  • 3分钟搞懂js的冒泡和捕获?

    为了快速理解js冒泡和捕获 我们先看代码
  • 桌前检查、代码评审、走查

    桌前检查 Disk Checking 这是一种传统的检查方法 由程序员检查自己编写的程序 程序员在程序通过编译之后 进行单元测试之前 对源程序代码进行分析 检验 并补充相关的文档 目的是发现程序中的错误 检查项目有 1 检查变量的交叉引用表
  • 浅谈3NF(范式)建模

    范式 一张数据表的表结构所符合的某种设计标准的级别 构造数据库必须遵循一定的规则 在关系型数据库中 这种规则就是范式 范式是符合某一种级别的关系模式的集合 目前关系数据库有六种范式 第一范式 1NF 第二范式 2NF 第三范式 3NF 第四
  • Pycharm及python安装详细教程(图解)

    更多编程教程请到 菜鸟教程 https www piaodoo com 友情链接 好看站 http www nrso net 首先我们来安装python 1 首先进入网站下载 点击打开链接 或自己输入网址https www python o
  • java类是公共的应当声明,java 类是公共的,应在名为.java 的文件中声明

    java 类是公共的 应在名为 java 的文件中声明 关注 162 答案 2 mip版 解决时间 2021 01 16 12 24 提问者关系已逝 2021 01 15 16 19 import javax swing JOptionPa
  • ajax中中loaddate,jQuery中ajax的load()与post()方法实例详解

    本文实例讲述了jQuery中ajax的load 与post 方法 分享给大家供大家参考 具体如下 一 load 方法 在jQuery ajax的load 方法能够载入远程 HTML 文件代码并插入至 DOM 中 这个与post get还是有
  • 数据结构与算法(九)-- 队列

    队列 队列的定义 它只允许在表的前端 front 进行删除操作 而在表的后端 rear 进行插入操作 进行插入操作的端称为队尾 进行删除操作的端称为队头 顺序队 采用顺序存储结构的队列 存储空间连续 front指向对头元素 rear 指向队
  • 利用Dom4j创建xml文档

    DocumentHelper是使用Dom4j的辅助类的集合 利用它我们可以创建xml文档 接下来我们就使用它来创建一个简单的xml文档 创建文档 第一种方式 Document document DocumentHelper createDo
  • 20200317_决策树预测贷款申请

    使用决策树 预测贷款申请 import pandas as pd 忽略弹出的warnings import warnings warnings filterwarnings ignore text pd read excel data Lo
  • 前导0 的数字

    代码和任务 copyright c 2015 csdn学院 All right reserved 文件名称 main c 作者 张如田 完成日期 版本号 任务描述 输入小时和分 以hh mm形式输出 其中小时和分钟不足两位数时 用零前导 例
  • 手动下载Python第三方库whl文件并进行安装

    手动下载Python第三方库whl文件并进行安装 在Python开发中 我们经常需要使用第三方库来辅助我们完成各种任务 而通常在安装这些库时 我们会使用pip命令进行安装 但有时候因为网络环境等原因 pip无法正常工作 导致我们无法安装所需
  • Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之一

    完整人脸识别系统 源码 教程 环境 开源毕业设计 基于嵌入式ARM Linux的应用OpenCV和QT实现的人脸识别系统 源码 论文 完全毕设教程 Linux上Opencv与Qt实现的人脸识别的考勤点名 门禁系统 PC与嵌入式ARM版本 零
  • I2C通信基本原理及其实现

    I2C是一种总线式结构 它只需要SCL时钟信号线与SDA数据线 两根线就能将连接与总线上的设备实现数据通信 由于它的简便的构造设计 于是成为一种较为常用的通信方式 由于I2C采用的是主从式通信方式 所以 通信的过程完全由主设备仲裁 在通信之
  • 蓝桥杯2019年第十届省赛真题-扫地机器人

    题目 题目链接 题解 二分 贪心 二分模板 看到这道题第一时间想到的就是二分和动规 仔细一看二分有戏 能check出来 所以决定用二分好好想想 主要是因为我动规太菜了 怕了 二分时间 准确的说我们二分的不是时间 而是覆盖范围 也就是枚举每个
  • 《Python编程:从入门到实践》学习笔记——第11章 测试代码

    文章目录 前言 1 测试函数 1 1 单元测试和测试用例 1 2 可通过的测试 1 3 不能通过的测试 1 4 测试未通过时怎么办 1 5 添加新测试 2 测试类 2 1 各种断言方法 2 2 一个要测试的类 2 3 测试 Anonymou
  • 【机器学习】随机森林预测并可视化特征重要性

    今天需要用到特征重要性的分析 所以干脆就写一下使用随机森林是如何做建模并基于随机森林做特征重要性的分析 顺带给出了编码方式 随机森林 特征重要性可视化的完整Python代码 都是可以直接运行的 目 录 1 分类型特征编码 1 1 Label