数据分析 | 特征重要性分析 | 树模型、SHAP值法

这篇具有很好参考价值的文章主要介绍了数据分析 | 特征重要性分析 | 树模型、SHAP值法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        在分析特征重要性的时候,相关性分析和主成分分析往往是比较简单的方法,相关性分析是通过计算特征与目标变量之间的相关系数来评估特征的重要性。它可以告诉我们特征和目标变量之间的线性关系程度,但对于非线性关系就无能为力了;主成分分析是一种降维技术,用于将高维特征数据转化为少数几个主成分。它可以帮助我们理解数据的主要变化模式,但却无法给出具体每个特征对目标变量的影响程度。

        本文基于集成学习的方法介绍另外两种可以分析特征重要性的方法:树模型、SHAP值法。


数据集

        本文使用的数据集为房价数据集,一共有20640个样本,8个特征,1个自变量,除了HouseAge是离散型变量,其余均为连续型变量。树模型分析重要性和贝叶斯优化时,均使用原始数据,SHAP值法时使用归一化后的数据。

数据分析 | 特征重要性分析 | 树模型、SHAP值法,数据分析,数学建模,数据分析,机器学习,数据挖掘,python,随机森林

原始数据节选


TPE过程贝叶斯优化超参数寻优

        集成学习中超参数设置一直是大问题,本文通过调用Optuna库进行TPE过程的贝叶斯优化,对三种树模型进行超参数寻优。代码如下:

import optuna
from sklearn.model_selection import KFold,cross_validate
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
import time
start_time = time.time()

# 读取数据
data = pd.read_csv(r'D:\2暂存文件\Sth with Py\重要性程度分析\data.csv')
X = data.iloc[:,[0, 1, 2, 3, 4, 5, 6, 7]]
y = data.iloc[:,8]

'''贝叶斯随机森林寻优'''
# 定义目标函数和参数空间
def optuna_objective(trial):
    # 定义参数空间
    n_estimators = trial.suggest_int('n_estimators', 10, 30, 1)
    max_depth = trial.suggest_int('max_depth', 10, 30, 1)
    max_features = trial.suggest_int('max_features', 10, 30, 1)

    # 定义评估器
    reg = RandomForestRegressor(n_estimators=n_estimators,
              max_depth=max_depth,
              max_features=max_features,
              random_state=1412,
              verbose=False,
              n_jobs=-1)

    # 定义交叉过程,输出负均方误差
    cv = KFold(n_splits=5, shuffle=True, random_state=1412)
    validation_loss = cross_validate(reg, X, y,
                                     scoring='neg_mean_squared_error',
                                     cv=cv,
                                     verbose=True,
                                     n_jobs=-1,
                                     error_score='raise')
    return np.mean(validation_loss['test_score'])

# 定义优化目标函数
def optimizer_optuna(n_trials):
    study = optuna.create_study(sampler=optuna.samplers.TPESampler(n_startup_trials=20, n_ei_candidates=30),
                                direction='maximize')
    study.optimize(optuna_objective, n_trials=n_trials, show_progress_bar=True)

    print('随机森林最优参数:\nbest_params:', study.best_trial.params,
          '随机森林最优得分:\nbest_score:', study.best_trial.values,
          '\n')

    return study.best_trial.params, study.best_trial.values

import warnings
warnings.filterwarnings('ignore',message='The objective has been evaluated at this point before trails')
optuna.logging.set_verbosity(optuna.logging.ERROR)
best_params, best_score = optimizer_optuna(100)

# 保存最优参数和最优得分到文件
with open(r'D:\2暂存文件\Sth with Py\重要性程度分析\随机森林贝叶斯优化结果.txt', 'w') as f:
    for key, value in best_params.items():
        f.write(f'{key}: {value}\n')
    f.write(f'Best Score: {best_score}\n')

'''贝叶斯决策树寻优'''
# 定义目标函数和参数空间
def optuna_objective(trial):
    # 定义参数空间
    max_depth = trial.suggest_int('max_depth', 10, 30, 1)
    min_samples_split = trial.suggest_int('min_samples_split',10,30,1)
    min_samples_leaf = trial.suggest_int('min_samples_leaf',10,30,1)
    max_features = trial.suggest_int('max_features', 10, 30, 1)

    # 定义评估器
    dtr = DecisionTreeRegressor(
        max_depth=max_depth,
        max_features=max_features,
        min_samples_split=min_samples_split,
        min_samples_leaf=min_samples_leaf,
        random_state=1412,)

    # 定义交叉过程,输出负均方误差
    cv = KFold(n_splits=5, shuffle=True, random_state=1412)
    validation_loss = cross_validate(dtr, X, y,
                                     scoring='neg_mean_squared_error',
                                     cv=cv,
                                     verbose=True,
                                     n_jobs=-1,
                                     error_score='raise')
    return np.mean(validation_loss['test_score'])

# 定义优化目标函数
def optimizer_optuna(n_trials):
    study = optuna.create_study(sampler=optuna.samplers.TPESampler(n_startup_trials=20, n_ei_candidates=30),
                                direction='maximize')
    study.optimize(optuna_objective, n_trials=n_trials, show_progress_bar=True)

    print('决策树最优参数:\nbest_params:', study.best_trial.params,
          '决策树最优得分:\nbest_score:', study.best_trial.values,
          '\n')

    return study.best_trial.params, study.best_trial.values

import warnings
warnings.filterwarnings('ignore',message='The objective has been evaluated at this point before trails')
optuna.logging.set_verbosity(optuna.logging.ERROR)
best_params, best_score = optimizer_optuna(100)

# 保存最优参数和最优得分到文件
with open(r'D:\2暂存文件\Sth with Py\重要性程度分析\决策树贝叶斯优化结果.txt', 'w') as f:
    for key, value in best_params.items():
        f.write(f'{key}: {value}\n')
    f.write(f'Best Score: {best_score}\n')

'''贝叶斯梯度提升树寻优'''


# 定义目标函数和参数空间
def optuna_objective(trial):
    # 定义参数空间
    max_depth = trial.suggest_int('max_depth', 3, 10)
    learning_rate = trial.suggest_float('learning_rate', 0.001, 0.1, log=True)
    n_estimators = trial.suggest_int('n_estimators', 50, 200)
    subsample = trial.suggest_float('subsample', 0.5, 1.0)

    # 定义评估器
    gbr = GradientBoostingRegressor(
        max_depth=max_depth,
        learning_rate=learning_rate,
        n_estimators=n_estimators,
        subsample=subsample,
        random_state=1412, )

    # 定义交叉过程,输出负均方误差
    cv = KFold(n_splits=5, shuffle=True, random_state=1412)
    validation_loss = cross_validate(gbr, X, y,
                                     scoring='neg_mean_squared_error',
                                     cv=cv,
                                     verbose=True,
                                     n_jobs=-1,
                                     error_score='raise')
    return np.mean(validation_loss['test_score'])


# 定义优化目标函数
def optimizer_optuna(n_trials):
    study = optuna.create_study(sampler=optuna.samplers.TPESampler(n_startup_trials=20, n_ei_candidates=30),
                                direction='maximize')
    study.optimize(optuna_objective, n_trials=n_trials, show_progress_bar=True)

    print('梯度提升树最优参数:\nbest_params:', study.best_trial.params,
          '梯度提升树最优得分:\nbest_score:', study.best_trial.value, '\n')

    return study.best_trial.params, study.best_trial.value

import warnings

warnings.filterwarnings('ignore', message='The objective has been evaluated at this point before trails')
optuna.logging.set_verbosity(optuna.logging.ERROR)
best_params, best_score = optimizer_optuna(100)

# 保存最优参数和最优得分到文件
with open(r'D:\2暂存文件\Sth with Py\重要性程度分析\梯度提升树贝叶斯优化结果.txt', 'w') as f:
    for key, value in best_params.items():
        f.write(f'{key}: {value}\n')
    f.write(f'Best Score: {best_score}\n')

# 结束计时
end_time = time.time()

# 输出执行时间
execution_time = end_time - start_time
print("模型训练执行时间: {:.2f}秒".format(execution_time))

决策树模型最优参数及最佳得分如下:

max_depth: 11、min_samples_split: 18、min_samples_leaf: 13、max_features: 12
Best Score: -0.24607607821335736

随机森林模型最优参数及最佳得分如下:

n_estimators: 30、max_depth: 19、max_features: 24
Best Score: -0.18016603147647478

梯度提升树模型最优参数及最佳得分如下:

max_depth: 9、learning_rate: 0.0418665547136736、n_estimators: 188、subsample: 0.676537978032126
Best Score: -0.16401985559476492


树模型

        树模型,例如决策树和随机森林,能够通过对数据的划分建立一棵树形结构。它可以考虑不仅是线性关系,还包括非线性和交互作用。树模型不仅能够判断特征的重要性,还能够提供每个特征对目标变量的具体影响程度。通过这种方式,我们可以更好地理解和解释特征的重要性。另外,树模型还能够处理缺失值和离群点,使得分析结果更加鲁棒。此外,树模型还可以处理各种类型的特征,包括连续型、分类型以及文本型特征,具有很强的适应性。

        其中源码和绘图结果如下:

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import GradientBoostingRegressor
import matplotlib.pyplot as plt
import time
plt.rcParams['font.sans-serif']=['SimHei'] # 把中文字体改成国际黑体
plt.rcParams['axes.unicode_minus'] = False # 显示负号
start_time = time.time()

# 读取数据
data = pd.read_csv(r'D:\2暂存文件\Sth with Py\重要性程度分析\data.csv')
X = data.iloc[0:5000,[0, 1, 2, 3, 4, 5, 6, 7]]
y = data.iloc[0:5000,8]


'''决策树'''
model_dtr = DecisionTreeRegressor(max_depth=11,
                                  min_samples_split=18,
                                  min_samples_leaf=13,
                                  max_features=12)
model_dtr.fit(X, y)
importances_dtr = model_dtr.feature_importances_

'''随机森林'''
model_rfr = RandomForestRegressor(n_estimators=30,max_depth=19,max_features=24)
model_rfr.fit(X, y)
importances_rfr = model_rfr.feature_importances_

'''梯度提升树'''
model_gbr = GradientBoostingRegressor(max_depth=9,learning_rate=0.0418665547136736,n_estimators=188,subsample=0.676537978032126)
model_gbr.fit(X, y)
importances_gbr = model_gbr.feature_importances_

# 创建特征名称列表
feature_names = ['MedInc','HouseAge','AveRooms','AveBedrms','Population','AveOccup','Latitude','Longitude']

# 将特征名称和重要性值进行配对
feature_importances_dtr = list(zip(feature_names, importances_dtr))
print('决策树特征重要性:',feature_importances_dtr)
feature_importances_rfr = list(zip(feature_names, importances_rfr))
print('\n随机森林特征重要性:',feature_importances_rfr)
feature_importances_gbr = list(zip(feature_names, importances_gbr))
print('\n梯度提升树特征重要性:',feature_importances_gbr)

'''绘图'''
tree = pd.read_excel(r'D:\2暂存文件\Sth with Py\重要性程度分析\树模型重要性.xlsx')
labels=["特征","Decision trees","Random Forest","GBDT","Average"]

# 把dataframe转换为list
x = tree['特征'].values.tolist()
y1 = tree['Decision trees'].values.tolist()
y2 = tree['Random Forest'].values.tolist()
y3 = tree['GBDT'].values.tolist()
y4 = tree['Average'].values.tolist()

plt.bar(x=np.arange(len(x))-0.2,height=y1,label="Decision trees",color="#AADCE0",width=0.1)
plt.bar(x=np.arange(len(x))-0.1,height=y2,label="Random Forest",color="#FFD06F",width=0.1)
plt.bar(x=x,height=y3,label="GBDT",color="#FFE6B7",width=0.1)
plt.bar(x=np.arange(len(x))+0.1,height=y4,label="Average",color="#E76254",width=0.1)

plt.legend(loc="upper right")
plt.xticks(x)
轴=plt.gca()
轴.set_xticklabels(x,rotation=45,ha="center")
图形=plt.gcf()
plt.xlabel('Feature',fontsize=15)
plt.ylabel('Importance',fontsize=15)
plt.title('Feature Importance',fontsize=18)
图形.subplots_adjust(left=0.1,bottom=0.3)
plt.savefig(r'D:\2暂存文件\Sth with Py\重要性程度分析\树模型重要性.png',dpi=600)
# 输出执行时间
end_time = time.time()
execution_time = end_time - start_time
print("模型训练执行时间: {:.2f}秒".format(execution_time))
plt.show()
数据分析 | 特征重要性分析 | 树模型、SHAP值法,数据分析,数学建模,数据分析,机器学习,数据挖掘,python,随机森林

树模型重要性分析图


SHAP值法

        SHAP值法采用了一种更为细致的方法来解释特征重要性。它通过计算每个特征对模型预测结果的贡献程度,从而揭示出特征之间的相互作用和非线性关系。这使得我们能够更全面地了解特征对目标的影响,而不仅仅局限于线性关系的分析。本文使用随机森林回归模型,其中数据使用归一化后的数据。代码和摘要图、特征重要性图如下:

import pandas as pd
import shap
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import RandomForestRegressor
import matplotlib.pyplot as plt
import time
plt.rcParams['font.sans-serif']=['SimHei'] # 把中文字体改成国际黑体
plt.rcParams['axes.unicode_minus'] = False # 显示负号

# 读取数据
normalized_data = pd.read_excel(r'D:\2暂存文件\Sth with Py\重要性程度分析\归一化数据.xlsx')
X = normalized_data.iloc[:,[0, 1, 2, 3, 4, 5, 6, 7]]
y = normalized_data.iloc[:,8]

start_time = time.time()

# 初始化随机森林模型
model = RandomForestRegressor(n_estimators=30,max_depth=19,max_features=24)

# 训练模型
model.fit(X, y)

# 创建一个Explainer对象
explainer = shap.Explainer(model)

# 计算SHAP值
shap_values = explainer.shap_values(X)

# 结束计时
end_time = time.time()

# 输出执行时间
execution_time = end_time - start_time
print("模型训练执行时间: {:.2f}秒".format(execution_time))

# 打印特征重要性得分
shap.summary_plot(shap_values, X)

# 打印每个特征的重要性图
shap.summary_plot(shap_values, X, plot_type="bar")
数据分析 | 特征重要性分析 | 树模型、SHAP值法,数据分析,数学建模,数据分析,机器学习,数据挖掘,python,随机森林

SHAP值摘要图

数据分析 | 特征重要性分析 | 树模型、SHAP值法,数据分析,数学建模,数据分析,机器学习,数据挖掘,python,随机森林

SHAP值特征重要性图

 文章来源地址https://www.toymoban.com/news/detail-687395.html

到了这里,关于数据分析 | 特征重要性分析 | 树模型、SHAP值法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中进行特征重要性分析的9个常用方法

    特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。 如果有一个包含数十个甚至数百个特征的数据集,每个特征都可能对你的机器学习模型的性能有所贡献。但

    2024年02月07日
    浏览(48)
  • 【Python | 机器学习】Python中进行特征重要性分析的9个常用方法(含源代码)

    特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。 特征重要性分析在数据科学和机器学习中扮演着重要的角色,具有以下重要性: 理解数据:特征重要性分析

    2024年02月03日
    浏览(51)
  • 【Python机器学习】决策树——树的特征重要性

    利用一些有用的属性来总结树的工作原理,其中最常用的事特征重要性,它为每个特征树的决策的重要性进行排序。对于每个特征来说,它都是介于0到1之间的数字,其中0代表“根本没有用到”,1代表“完美预测目标值”。特征重要性的求和为1。 将特征重要性进行可视化:

    2024年02月03日
    浏览(49)
  • 利用随机森林对特征重要性进行评估(公式原理)

    本文参考来源于: 杨凯, 侯艳, 李康. 随机森林变量重要性评分及其研究进展[J]. 2015. 码字不易,各位看官大大的赞是我更细的动力! 随机森林( r a n d o m      f o r e s t , R F random;; forest,RF r an d o m f ores t , RF )由 B r e i m a n Breiman B re iman 等人在2001年提出。 R F RF RF

    2024年02月20日
    浏览(48)
  • python实现随机森林的特征变量重要性排序

          大家好,我是带我去滑雪!       随机森林的特征变量重要性排序在特征选择和特征分析中具有广泛的用途。它可以用来识别哪些特征对目标变量的预测最为重要,从而帮助我们理解数据中的关键特征和影响因素。特征变量重要性排序的一些常见用途如下: 特征选择

    2024年02月16日
    浏览(46)
  • 聊一聊 tcp/ip 在.NET故障分析的重要性

    这段时间分析了几个和网络故障有关的 .NET程序 之后,真的越来越体会到计算机基础课的重要,比如 计算机网络 课,如果没有对 tcpip协议 的深刻理解,解决这些问题真的很难,因为你只能在高层做黑盒测试,你无法看到 tcp 层面的握手和psh通讯。 这篇我们通过两个小例子来

    2024年02月05日
    浏览(54)
  • 大数据时代元数据的重要性

            元数据,是描述了数据本身(如数据库、数据元素、数据模型),数据表示的概念(如业务流程、应用系统、软件代码、技术基础设施,数据与概念之间的联系。元数据可以帮助组织理解其自身的数据、系统和流程,同时帮助用户评估数据质量,对数据库与其他应用

    2024年02月08日
    浏览(36)
  • 机器学习中训练数据的重要性

    人工智能技术发展至今,训练数据的重要性已经是我们老生常谈的问题。在重声训练数据为什么重要之前,我们先重新回顾下AI技术大爆炸的三大初始概念:机器学习是什么?人工智能是什么?训练数据又是什么? 简单来说,机器学习包含人工智能,人工智能属于机器学习的

    2024年02月13日
    浏览(55)
  • 网络安全合规-数据安全治理的重要性

    数据安全治理能力评估框架将数据安全治理分为三大层次,即数据安全战略、数据全生命周期安全和基础安全[3]。数据安全战略指组织的数据安全顶层规划,起到为数据安全治理“搭框架”“配人手”的作用;数据全生命周期安全指组织在数据全生命周期的安全管控措施;基

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包