机器学习笔记 十八:基于3种方法的随机森林模型分析房屋参数重要性

news2024/12/23 3:26:49

这里写自定义目录标题

      • 1. 探索性数据分析
        • 1.1 数据集分割(训练集、测试集)
        • 1.2 模型拟合
      • 2. 特征重要性比较
        • 2.1 Gini Importance
        • 2.2 Permutation Importance
        • 2.3 Boruta
      • 3. 特征比较
        • 3.1 Gini Importance
        • 3.2 Permutation Importance
        • 3.3 Boruta
      • 4. 模型比较

将机器学习笔记 十六:基于Boruta算法的随机森林(RF)特征重要性评估与本篇结合,对比分析。

1. 探索性数据分析

输入参数: id、date、bedrooms、bathrooms、sqft_living、sqft_lot、floors、waterfront、view、condition、grade、sqft_above、sqft_basement、yr_built、yr_renovated、zipcode、lat、long、sqft_living15、sqft_lot15、
输出参数: price

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVC
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import accuracy_score
from collections import defaultdict
from sklearn.metrics import r2_score

import sys

sys.path.insert(0, 'boruta_py-master/boruta')
from boruta import BorutaPy

sys.path.insert(0, 'random-forest-importances-master/src')
from rfpimp import *

%matplotlib inline

house = pd.read_csv("C:/Users/Administrator/Desktop/kc_house_data.csv")
# 查看数据是否有空
print(house.isnull().any())
# 检查类型
print(house.dtypes)
# 删除id和date两列数据,因为他们不会使用
house = house.drop(['id', 'date'],axis=1)

用散点图展示数据之间的相关性:

with sns.plotting_context("notebook",font_scale=2.5):
    g = sns.pairplot(house[['sqft_lot','sqft_above','price','sqft_living','bedrooms']], 
                 hue='bedrooms', palette='tab20',size=6)
g.set(xticklabels=[]);

在这里插入图片描述
绘制参数热图(相关性分析):

corr = house.corr()

mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True

f, ax = plt.subplots(figsize=(10, 8))
cmap = sns.diverging_palette(220, 10, as_cmap=True)

sns.heatmap(corr, mask=mask, cmap=cmap, center=0,
            square=True, linewidths=0.5)

在这里插入图片描述

1.1 数据集分割(训练集、测试集)

df_train, df_test = train_test_split(house, test_size=0.20,random_state=42)
df_train = df_train[list(house.columns)]
df_test = df_test[list(house.columns)]

X_train, y_train = df_train.drop('price',axis=1), df_train['price']
X_test, y_test = df_test.drop('price',axis=1), df_test['price']

X_train.shape,y_train.shape,X_test.shape,y_test.shape

((17290, 18), (17290,), (4323, 18), (4323,))

1.2 模型拟合

def predictions (rf,X_test,y_test):
    # Make predictions on test data
    predictions = rf.predict(X_test)
    # Performance metrics
    errors = abs(predictions - y_test)
    print('Metrics for Random Forest Regressor')
    print('Average absolute error:', round(np.mean(errors), 2), 'degrees.')
    # Calculate mean absolute percentage error (MAPE)
    mape = np.mean(100 * (errors / y_test))
    # Compare to baseline
    baseline_mape=np.mean(y_test)
    improvement_baseline = 100 * abs(mape - baseline_mape) / baseline_mape
    print('Improvement over baseline:', round(improvement_baseline, 2), '%.')
    # Calculate and display accuracy
    accuracy = 100 - mape
    print('Accuracy:', round(accuracy, 2), '%.')
    print('R2 score:',r2_score(predictions,y_test))
rf_reg = RandomForestRegressor(n_estimators=200,
                            min_samples_leaf=2,
                            n_jobs=-1,
                            oob_score=True,
                            random_state=42)
rf_reg.fit(X_train, y_train)

predictions(rf_reg,X_test,y_test)

Metrics for Random Forest Regressor
Average absolute error: 72704.15 degrees.
Improvement over baseline: 100.0 %.
Accuracy: 86.88 %.
R2 score: 0.8381720745711922

2. 特征重要性比较

2.1 Gini Importance

features = np.array(X_train.columns)
imps_gini=rf_reg.feature_importances_
std_gini = np.std([tree.feature_importances_ for tree in rf_reg.estimators_],
             axis=0)
indices_gini = np.argsort(imps_gini)

plt.title('Feature Importances')
plt.barh(range(len(indices_gini)), imps_gini[indices_gini], yerr=std_gini[indices_gini],color='black', align='center')
plt.yticks(range(len(indices_gini)), features[indices_gini])
plt.xlabel('Gini Importance')
plt.show()

在这里插入图片描述

2.2 Permutation Importance

def permutation_importances(rf, X_train, y_train, metric):
    baseline = metric(rf, X_train, y_train)
    imp = []
    std = []
    for col in X_train.columns:
        tmp=[]
        for i in range(10):
            save = X_train[col].copy()
            X_train[col] = np.random.permutation(X_train[col]) # permutation():按照给定列表生成一个打乱后的随机列表
            m = metric(rf, X_train, y_train)
            X_train[col] = save
            tmp.append(m)
        imp.append(baseline - np.mean(tmp))
        std.append(np.std(tmp))
    return np.array(imp),np.array(std)
np.random.seed(10)
imps_perm, std_perm = permutation_importances(rf_reg, X_train, y_train,oob_regression_r2_score)

features = np.array(X_train.columns)
indices_perm = np.argsort(imps_perm)

plt.title('Feature Importances')
plt.barh(range(len(indices_perm)), imps_perm[indices_perm], yerr=std_perm[indices_perm],color='black', align='center')
plt.yticks(range(len(indices_perm)), features[indices_perm])
plt.xlabel('Permutation Importance')
plt.show()

在这里插入图片描述
可以看出lat的重要性升高

2.3 Boruta

forest_reg = RandomForestRegressor(min_samples_leaf=2,
                                n_jobs=-1,
                                oob_score=True,
                                random_state=42)
feat_selector_reg = BorutaPy(forest_reg, verbose=2,max_iter=50)
np.random.seed(10)

import time
start = time.time()
feat_selector_reg.fit(X_train.values, y_train.values)
end = time.time()
print(end - start)

Iteration: 1 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 2 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 3 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 4 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 5 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 6 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 7 / 50
Confirmed: 0
Tentative: 18
Rejected: 0
Iteration: 8 / 50
Confirmed: 13
Tentative: 0
Rejected: 5

BorutaPy finished running.
Iteration: 9 / 50
Confirmed: 13
Tentative: 0
Rejected: 5
837.3257942199707

print('Confirmed: \n',list(np.array(X_train.columns)[feat_selector_reg.ranking_==1]))
print('\nTentatives: \n',list(np.array(X_train.columns)[feat_selector_reg.ranking_==2]))
print('\nRejected: \n',list(np.array(X_train.columns)[feat_selector_reg.ranking_>=3]))

Confirmed:
[‘bathrooms’, ‘sqft_living’, ‘sqft_lot’, ‘waterfront’, ‘view’, ‘grade’, ‘sqft_above’, ‘yr_built’, ‘zipcode’, ‘lat’, ‘long’, ‘sqft_living15’, ‘sqft_lot15’]

Tentatives:
[‘sqft_basement’]

Rejected:
[‘bedrooms’, ‘floors’, ‘condition’, ‘yr_renovated’]


3. 特征比较

3.1 Gini Importance

X_train_gini_reg=X_train[['grade','sqft_living','lat','long']]
X_test_gini_reg=X_test[['grade','sqft_living','lat','long']]

rf_gini_reg = RandomForestRegressor(n_estimators=200,
                            min_samples_leaf=2,
                            n_jobs=-1,
                            oob_score=True,
                            random_state=42)
rf_gini_reg.fit(X_train_gini_reg, y_train)

3.2 Permutation Importance

X_train_perm_reg=X_train.drop(['bedrooms','yr_renovated','floors','sqft_basement','condition','bathrooms'],axis=1)
X_test_perm_reg=X_test.drop(['bedrooms','yr_renovated','floors','sqft_basement','condition','bathrooms'],axis=1)

rf_perm_reg = RandomForestRegressor(n_estimators=200,
                            min_samples_leaf=2,
                            n_jobs=-1,
                            oob_score=True,
                            random_state=42)
rf_perm_reg.fit(X_train_perm_reg, y_train)

3.3 Boruta

X_train_boruta_reg=X_train.drop(['bedrooms','floors','condition','yr_renovated'],axis=1)
X_test_boruta_reg=X_test.drop(['bedrooms','floors','condition','yr_renovated'],axis=1)

rf_boruta_reg = RandomForestRegressor(n_estimators=200,
                            min_samples_leaf=2,
                            n_jobs=-1,
                            oob_score=True,
                            random_state=42)
rf_boruta_reg.fit(X_train_boruta_reg, y_train)

4. 模型比较

print('******************* Original Model ***********************')
print('\n')
predictions(rf_reg,X_test,y_test)

print ('\n')

print('**** Feature selection based on Gini Importance ****')
print('\n')
predictions(rf_gini_reg,X_test_gini_reg,y_test)

print ('\n')

print('**** Feature selection based on Permutation Importance *****')
print('\n')
predictions(rf_perm_reg,X_test_perm_reg,y_test)

print ('\n')

print('*********** Feature selection based on Boruta **************')
print('\n')
predictions(rf_boruta_reg,X_test_boruta_reg,y_test)

******************* Original Model ***********************

Metrics for Random Forest Regressor
Average absolute error: 72704.15 degrees.
Improvement over baseline: 100.0 %.
Accuracy: 86.88 %.
R2 score: 0.8381720745711922

**** Feature selection based on Gini Importance ****

Metrics for Random Forest Regressor
Average absolute error: 81288.41 degrees.
Improvement over baseline: 100.0 %.
Accuracy: 85.56 %.
R2 score: 0.8052584664901095

**** Feature selection based on Permutation Importance *****

Metrics for Random Forest Regressor
Average absolute error: 72741.67 degrees.
Improvement over baseline: 100.0 %.
Accuracy: 86.77 %.
R2 score: 0.8477802122659206

*********** Feature selection based on Boruta **************

Metrics for Random Forest Regressor
Average absolute error: 73254.05 degrees.
Improvement over baseline: 100.0 %.
Accuracy: 86.75 %.
R2 score: 0.8388239891237698

Permutation Importance对于R2的计算是比较好的模型,Permutation Importance和Boruta都是比较好的方法。

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

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

相关文章

算法设计与分析复习(一)

判断题: 如果一个NP完全问题能在多项式时间内得到解决,那么NP中的每一个问题都能在多项式时间内求解。(T)可以用如下方法来证明某结论X成立:先假设X不成立,在此假设基础上推出X成立,则可以证明…

8、Bean的循环依赖问题

8.2 singleton下的set注入产生的循环依赖(解决) A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你,你也依赖我。 比如:丈夫类Husband,妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Husband Data public class …

覆盖变量漏洞

变量覆盖: \> $a 1; $b 2; $a 3; echo $a; > 输出3 .代码从上而下执行,$a被多次定义 常见变量覆盖导致漏洞的函数 \> 经常导致变量覆盖漏洞场景有: $$使用不当 EXTRACT()函数使用不当 PARSE_STR()函数使用不当IMPORT_REQUEST_…

c语言指针(深入了解指针)

前沿: 有人曾说过不会指针等于没有学习c语言,而我也是非常认同这个观点的,要想学习好c语言,指针是比不可缺少的,如果指针学不会c语言也就没办法学好,而向如此越重要的东西越比较难学,但难学并不…

Qt基础之四:Qt信号与槽机制原理及优缺点

信号和插槽用于对象之间的通信。信号和槽机制是Qt的核心特性,可能也是与其他框架提供的特性最大不同的部分。Qt的元对象系统使信号和槽成为可能。 一.简介 在GUI编程中,当我们改变一个控件,通常希望其他控件被通知到。更一般的,…

【优化覆盖】基于matlab果蝇算法求解无线传感器覆盖优化问题【含Matlab源码 2215期】

一、⛄果蝇算法 果蝇优化算法(Fruit Fly Optimization Algorithm, FOA) 是台湾学者潘文超经过研究发现, 并于2011年提出的一种新型智能优化算法, 它具有很好的全局优化性能, 能够解决很多的优化求解问题.果蝇有着优于其它生物的感官知觉, 特别是视觉与嗅觉, 依靠灵敏的嗅觉, 果…

Linux服务器被入侵后的排查思路(应急响应思路)

目录Linux-暴力破解、替换ps命令并留存后门事件复现一、事件背景二、应急响应过程排查crontab后门排查是否有命令被替换响应过程回顾三、事件还原查看后门排查安全日志Linux-暴力破解、替换ps命令并留存后门事件复现 一、事件背景 服务器疑似被入侵,与恶意IP进行通信…

手眼标定笔记

文章目录基本介绍:坐标系变换运算规则:关系运算说明:坐标系运算规则一:坐标系运算规则二:齐次坐标系:齐次坐标系下的坐标变换:眼在手外:眼在手内:解方程:- Ta…

Spring学习第4篇:Spring 的依赖注入

大家家好,我是一名网络怪咖,北漂五年。相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知Spring重要性,现在普遍都使用SpringBoot来开发,面试的时候SpringBoot原理也是经常会问到&…

数据结构 | 单链表

… 🌳🌲🌱本文已收录至:数据结构 | C语言 更多知识尽在此专栏中!文章目录🌳前言🌳正文🌲链表打印与销毁🪴打印🪴销毁🌲尾部插入与删除🪴节点申请&…

javaweb JAVA JSP销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上在线销售

JSP销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上在线销售

Linux基础 - 虚拟化介绍(KVM)

‍‍🏡博客主页: Passerby_Wang的博客_CSDN博客-系统运维,云计算,Linux基础领域博主 🌐所属专栏:『Linux基础』 🌌上期文章: Linux基础 - 服务管理(systemd) 📰如觉得博…

爬取医药卫生知识服务系统的药品数据——超详细流程

爬取医药卫生知识服务系统的药品数据——超详细流程 文章目录爬取医药卫生知识服务系统的药品数据——超详细流程前言一、寻找药品数据二、爬取药品ID1.资源获取2.数据提取3.资源保存4.主函数5.总体代码三、爬取药品信息1.加载资源ID2.获取数据3.数据提取4.保存信息5.主函数6.总…

SpringBoot-属性绑定和bean属性校验

目录 属性绑定 自定义类属性绑定 第三方bean属性匹配 规则:松散绑定(宽松绑定) Bean属性校验 属性绑定 属性绑定:我们可以使用配置文件对类的属性进行赋值绑定。 自定义类属性绑定 我们自定义一个类,在此使用yml文件进行类…

【滤波器】基于matlab实现微波带低通高通带通滤波器设计

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

python科研做图系列之雷达图

文章目录参考资料matplotlib库画的复现一个 pyecharts的雷达图尝试在上面的基础上,把pyecharts 导出存为一般的png图尝试在上面的基础上,把pyecharts 导出存为一般的矢量图用pygal画雷达图参考资料 参考知乎 CSDN给出了一些参数 matplotbib库雷达图官网 …

Python实现九九乘法表的几种方式,入门必备案例~超级简单~

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 们在学习Python的过程中需要不断的积累和练习,这样才能够走的更远, 今天一起来学习怎么用Python写九九乘法表~ 第一种方法:for-for 代码: for i in range(1, 10):for j in…

数据挖掘面试经总结【私人版,仅供参考】

1特征归一化 1.1为什么需要对数值类型的特征做归一化? 线性函数归一化零均值归一化 1.2在对数据进行预处理时,应该怎样处理类别型特征? 序号编码独热编码二进制编码 1.3什么是组合特征?如何处理高维组合特征? 例…

【python】云打印实现

这两天为了实现云打印功能找了很多相关的文章 记录一下这一篇,python云打印实现-朝花夕拾,代码通过监听文件夹有无产生新文件来判断是否执行,我尝试运行了下没问题,于是打算转载一下 程序运行结果 由于对方的代码和我实现的有点出…

【Maven】你好,Maven >>> 与Maven的初次见面~

个人主页:.29.的博客 学习社区:进去逛一逛~ 个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的道路上摸爬滚打,记录学习的过程~ 与Maven的初次见面~一、了解Maven二、Maven的…