机器学习笔记 十五:随机森林(Random Forest)评估机器学习模型的特征重要性

news2024/11/23 19:01:30

随机森林

      • 1. 随机森林介绍
        • 1.1 租赁数据案例
      • 2. 特征相关性分析(热图)
        • 2.1 热图绘制
        • 2.2 构建随机森林模型
        • 2.3 不同特征合并的重要性
          • 2.3.1 经纬度合并(分3类)
          • 2.3.2 经纬度合并(分2类)
          • 2.3.3 经纬度合并(分4类)
          • 2.3.4 经纬度合并(分4类)
          • 2.3.5 oob重要性
      • 3. 总结

1. 随机森林介绍

    在随机森林中创建决策树时,通过测量特征在减少不确定性(分类器)或方差(回归器)方面的有效性来计算特征的平均-减少-不纯重要性。问题是这种机制虽然快速,但并不总是能准确反映出重要性。Strobl等指出:“the variable importance measures of Breiman’s original random forest method … are not reliable in situations where potential predictor variables vary in their scale of measurement or their number of categories.”
    互换重要性是一个更好的方法,它衡量一个特征的重要性为:将验证集或袋外(OOB)样本导入随机森林,并记录基线准确性(分类器)或 R2 得分(调节器)。对单一预测特征的列值进行修正,然后将所有测试样本重新通过随机森林,重新计算准确率或者 R2 。该特征的重要性是基线和因排列组合而造成的总体准确率或R2下降之间的差异。虽然替换机制的计算成本比杂质机制的平均下降的成本高得多,但结果更可靠。

1.1 租赁数据案例

需要安装的库: rfpimp(Random Forest Feature Importances Package)

pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com rfpimp

数据来源:Two Sigma Connect: Rental Listing Inquiries
rent.csv(租赁数据集)

在这里插入图片描述

from rfpimp import *
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

df_orig = pd.read_csv("C:/Users/Administrator/Desktop/rent.csv")

df = df_orig.copy()

# 突出rent.csv中价格异常值的影响
df['price'] = np.log(df['price'])

df_train, df_test = train_test_split(df, test_size=0.20)

features = ['bathrooms','bedrooms','longitude','latitude','price']
df_train = df_train[features]
df_test = df_test[features]
# 将训练集拆分,并将拆分后的数据分别赋予X_train(没有价格),y_train(价格)
X_train, y_train = df_train.drop('price',axis=1), df_train['price'] # drop():默认删除某行,若axis=1,表示删除某列数据
X_test, y_test = df_test.drop('price',axis=1), df_test['price']
# 添加随机数的列数
X_train['random'] = np.random.random(size=len(X_train)) # 返回0-1之间的随机数,矩阵大小为:len(X_train),即39481*1行随机数据
X_test['random'] = np.random.random(size=len(X_test))
df_train, df_test = train_test_split(df_orig, test_size=0.20)
features = ['bathrooms','bedrooms','price','longitude','latitude','interest_level']
df_train = df_train[features]
df_test = df_test[features]

X_train, y_train = df_train.drop('interest_level',axis=1), df_train['interest_level']
X_test, y_test = df_test.drop('interest_level',axis=1), df_test['interest_level']
X_train['random'] = np.random.random(size=len(X_train))
X_test['random'] = np.random.random(size=len(X_test))

构建随机森林分类器:

# 构建随机森林分类器
rf = RandomForestClassifier(n_estimators=100,
                            min_samples_leaf=5,
                            n_jobs=-1,
                            oob_score=True)
rf.fit(X_train, y_train)
imp = importances(rf, X_test, y_test) # permutation
viz = plot_importances(imp)
viz.view()

特征重要性显示:

在这里插入图片描述

2. 特征相关性分析(热图)

2.1 热图绘制

数据导入:

# 回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,分为一元回归和多元回归分析
# 按照因变量的多少:分为简单回归分析和多重回归分析
# 按照自变量和因变量之间的关系类型:分为线性回归分析和非线性回归分析
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, mean_absolute_error
from sklearn.model_selection import cross_val_score
from rfpimp import *
from sklearn.model_selection import train_test_split
from sklearn.base import clone

df_all = pd.read_csv("C:/Users/Administrator/Desktop/rent.csv") 

num_features = ['bathrooms','bedrooms','latitude','longitude','price']
target = 'interest_level'

df = df_all[num_features + [target]]
# 计算每个卧室的中位数
df = df.copy()
df_median_price_per_bedrooms = df.groupby(by='bedrooms')['price'].median().reset_index() # reset_index():会将原来的索引index作为新的一列
                                                                                         # groupby()[]先以bedrooms进行分组,再提取每组中的price字段
beds_to_median = df_median_price_per_bedrooms.to_dict(orient='dict')['price'] # to_dict():将数据框数据转换为字典形式(字典为可变容器模型且可存储任意类型对象)
                                                                              # 转换为字典格式,并将price字段提取出
df['median_price_per_bedrooms'] = df['bedrooms'].map(beds_to_median)  # 合并两个表格

# 计算该数量卧室的价格与中间价格的比率
df['price_to_median_beds'] = df['price'] / df['median_price_per_bedrooms']
# 卧室数量与价格的比率
df["beds_per_price"] = df["bedrooms"] / df["price"] 

# 房间总数(卧室、浴室)
df["beds_baths"] = df["bedrooms"]+df["bathrooms"]
del df['median_price_per_bedrooms']

df_train, df_test = train_test_split(df, test_size=0.15)

热图绘制:

from rfpimp import plot_corr_heatmap
viz = plot_corr_heatmap(df_train, figsize=(7,5))
viz.save('C:/Users/Administrator/Desktop/corrheatmap.tif')
viz

斯皮尔曼相关矩阵:
在这里插入图片描述

    可以看出,值越大颜色越深,则数据之间的相关性越强。 比如卧室数量和卧室加浴室相关性为 0.98,相关性非常强。

2.2 构建随机森林模型

模型构建:

# 数据集拆分
X_train, y_train = df_train.drop('interest_level',axis=1), df_train['interest_level']
X_test, y_test = df_test.drop('interest_level',axis=1), df_test['interest_level']

rf = RandomForestClassifier(n_estimators=100, n_jobs=-1,
#                            max_features=X_train.shape[1]-1,
                            max_features=1.0,
                            min_samples_leaf=10, oob_score=True)
#训练集拟合
rf.fit(X_train, y_train)

特征重要性训练:

# 特征重要性训练
I = importances(rf, X_test, y_test)
viz = plot_importances(I)
viz.save('C:/Users/Administrator/Desktop/imp.tif')
viz

在这里插入图片描述

2.3 不同特征合并的重要性

2.3.1 经纬度合并(分3类)
I = importances(rf, X_test, y_test, features=['price',['latitude','longitude']])
viz = plot_importances(I, vscale=1.2)
viz.save('C:/Users/Administrator/Desktop/subset_imp.tif')
viz

在这里插入图片描述

2.3.2 经纬度合并(分2类)
I = importances(rf, X_test, y_test, features=[['latitude','longitude']])
viz = plot_importances(I, vscale=1.2)
viz.save('C:/Users/Administrator/Desktop/latlong_imp.jpg')
viz

在这里插入图片描述

2.3.3 经纬度合并(分4类)
features = ['bathrooms', 'bedrooms', 
            ['latitude', 'longitude'],  
            ['price_to_median_beds', 'beds_baths', 'price'], 
            ['beds_per_price','bedrooms']]
I = importances(rf, X_test, y_test, features=features)
viz = plot_importances(I, vscale=1.3)
viz.save('C:/Users/Administrator/Desktop/grouped_imp.tif')
viz

在这里插入图片描述

2.3.4 经纬度合并(分4类)
features = [['latitude', 'longitude'],
            ['price_to_median_beds', 'beds_baths', 'beds_per_price', 'bedrooms'],
            ['price','beds_per_price','bedrooms']]
I = importances(rf, X_test, y_test, features=features)
viz = plot_importances(I, vscale=1.2)
viz.save('C:/Users/Administrator/Desktop/grouped_dup_imp.tif')
viz

在这里插入图片描述

2.3.5 oob重要性
# 兼容性测试 >= 0.22.1
I = oob_importances(rf, X_test, y_test) 
plot_importances(I, vscale=1.2)

在这里插入图片描述

3. 总结

    在机器学习中使用的特征很少是完全独立的,这使得解释特征的重要性十分困难。我们可以计算相关系数,但只能识别线性关系。一种方法是训练一个模型,使用x作为因变量,所有其他特征作为自变量,这样至少可以确定一个特征x是否依赖于其他特征。
    因为随机森林给我们一个容易的出袋误差估计(oob),特征依赖函数依赖于随机森林模型。来自模型的 R2 预测误差表明使用其他特征预测特征x是很容易的。分数越高,特征x的依赖性越大。

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

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

相关文章

HTML CSS游戏官网网页模板 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载 游戏娱乐网页成品代码...

✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 🥇 关于作者: 历任研发工程师,技术组长,教学总监。 十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索…

系分 - 系统规划

个人总结,仅供参考,欢迎加好友一起讨论 系分 - 系统规划 考点摘要 系统规划的步骤(★)可行性分析(★★★)成本效益分析(★★★) 系统规划的步骤 初步调查根据企业战略目标&#…

一行行的代码解密马尔可夫链

使用Python的马尔科夫链实例的实践 一行行的代码解密马尔可夫链。 当我开始学习物理时,我并不喜欢概率的概念。我对用物理学可以对整个世界进行建模的想法非常振奋,不确定性的想法让我很生气:) 事实是,当我们想研究真实的现象时,我…

硬件电路(3)设计篇----为什么栅极型推挽电路不用上P下N?

在做信号控制以及驱动时,为了加快控制速度,经常要使用推挽电路。推挽电路可以由两种结构组成:分别是上P下N,以及上N下P。其原理图如下所示, 在平时中,我个人经常遇到的推挽电路是第一种。当我每次问身边的…

推荐一个不到2MB的C#开发工具箱,集成了上千个常用操作类

今天给大家推荐一个C#开发工具箱,涵盖了所有常用操作类,体积小、功能强大。 项目简介 C# 开发工具箱。大都是静态类,加密解密,反射操作,权重随机筛选算法,分布式短id,表达式树,lin…

单链表简单实现

单链表实现一、为什么会存在单链表?二、什么是单链表?三、单链表结构定义四、单链表的基本操作1、 创建结点2、 销毁链表3、 打印链表4、 尾插节点5、 头插结点6、 尾结点的删除7、 头结点的删除8、 单链表的查找9、 单链表在pos位置之后插入10、单链表在…

在jenkins上创建一个CANoe Job

目录实战项目CANoe 工程配置全局安全创建 slave 节点创建pipline Job: CANoeAutoRun实战项目CANoe 工程 配置全局安全 将代理和SSH Server都设置成随机选取,后面再本机创建slave 节点要用,因为我们会在用一台机器上创建了master和slave节点…

快充伤电池?我来帮何同学做个假设检验

最近看到何同学的视频,拿40部手机花两年半做了关于各种充电的实验视频,视频确实很好看,花里胡哨,看着科技感满满~。但是关于实验设计和根据实验的数据得出最后的结论上似乎有些草率。 实验设计上就不提了,…

周涛:在大数据沙滩上捡拾“珍珠”|奋斗者正青春

“我始终觉得,创新的本原就是好奇心,要像小孩儿一样,一直不断地追问,向这个世界讨要答案。在追寻答案的过程中,要有独立探索和批评的精神,不能轻信权威。” 1 提起电子科技大学教授周涛,大多…

【定语从句练习题】who、which

1. 填空训练 翻译的时候加上 … 的 1.who 2.which 3.which 4.which 5.who 6.which 7.which 8.who 9.who 10.which 11.which 12.who 2. 选择 1.took 2.live 3.she is 3.lost 5.bought 6.is parked 7.it cuts 8.writes 9.make 10.lent you. 10.lend sb. sth 这里需要&…

Java反射06:反射的应用之动态代理

反射的应用之动态代理 (这里没听懂,知道反射体现了代理动态性就行,后面框架再学习) 代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原 始对象的调用都要通过代理。代理对象决定是否以及何…

C语言之指针详解

文章目录1 指针1.1 简介1.2 什么是指针1.3 使用指针1.3.1 简单使用1.3.2 NULL 指针1.3.3 指针算术运算1.3.3.1 定义1.3.3.2 遍历数组:递增一个指针1.3.3.3 遍历数组:递减一个指针1.3.3.4 指针的比较1.3.4 指针数组1.3.5 指向数组的指针1.3.6 指向指针的指…

Django中利用Admin后台实现Excel/CSV的导入更新数据库和导出数据到Excel/CSV

本文基于Django自带的admin 后台实现Excel,csv,Json等格式文件的导入并更新后台数据库。 核心是引入 django-import-export模块。 1、测试相数据准备: 我们先创建一个app:app01 python manage.py startapp app01 然后在app01…

软考下午题第1题——数据流,题目分析与案例解析:

答题技巧-【11-12分】分必拿方法: 下午第一题肯定是数据流的题目,那么,数据流肯定要找到对应的实体、关系模式等内容,审题的时候一定要细致,下午时间也是相当够的,所以每句话记住,至少读3遍&am…

【pyhon】利用pygame实现彩图版飞机大战(附源码 可供大作业练习使用)

源码请点赞关注收藏后评论区留言或私信博主 演示视频已上传到我的主页 有需要者可自行观看 演示视频如下: 飞机大战接下来先介绍一下游戏的玩法 在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 具体的操作步骤如下: (1&…

Android Native APP开发笔记:多线程编程

文章目录目的Java中的多线程ThreadRunnableTimerAndroid中的多线程HandlerAsyncTask总结目的 Android中UI线程对于开发者和用户来说都是最主要接触到的线程。一般来说为了UI流畅、不卡顿,耗时操作是不推荐放在UI线程中的。但是耗时操作的需求又是存在的&#xff0c…

Spring Cloud(八):Spring Cloud Alibaba Seata 2PC、AT、XA、TCC

事务简介 分布式事务:https://www.processon.com/view/link/61cd52fb0e3e7441570801ab 本地事务 JDBC 事务模式 Connection conn ... //获取数据库连接 conn.setAutoCommit(false); //开启事务 try{//...执行增删改查sqlconn.commit(); //提交事务 }catch (Exce…

【C++学习】日期类和内存管理

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 日期类的实现和内存管理🏬日期类的实现🏬C/C内存分布🏬C内存管理方…

【工具】Git-码农“吃饭的碗”要拿好

汝之观览,吾之幸也!本文主要讲解的是Git的轻巧使用(创建、下载、上传、更新、回退),我们平常都是通过idea自带的git工具,或者其他工具来拉取提交代码,这里主要用命令行的方式拉取代码&#xff0…

基于springboot+vue的心理预约咨询测试交流小程序

💖💖作者:IT跃迁谷毕设展 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等。平常会做一些项目定制化开发…