目录

  • 1. 随机森林模型拟合和预测性能
    • 1.1 样本拆分
    • 1.2 模型拟合
    • 1.3 特征重要性
    • 1.4 Permutation Importance(permutation_importances)
    • 1.5 Boruta
  • 2. 特征选择和性能比较
    • 2.1 基于基尼重要性的特征选择
    • 2.2 基于排序重要性的特征选择
    • 2.3 基于Boruta的特征选择
    • 2.4 预测性能比较

1. 随机森林模型拟合和预测性能

1.1 样本拆分

X = wine.drop('quality', axis = 1)
y = wine['quality']

集合y:

df_train, df_test = train_test_split(wine, test_size=0.20) # random_state随机状态:保证每次分割的样本一致
df_train = df_train[list(wine.columns)] # 获取wine的列名:Index(['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar',#       'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density',#       'pH', 'sulphates', 'alcohol', 'quality'],
df_test = df_test[list(wine.columns)]X_train, y_train = df_train.drop('quality',axis=1), df_train['quality']
X_test, y_test = df_test.drop('quality',axis=1), df_test['quality']X_train.shape,y_train.shape,X_test.shape,y_test.shape

((1279, 11), (1279,), (320, 11), (320,))

注意:
若random_state随机状态未设置,将出现下面的情况,即每次划分的结果不一致

1.2 模型拟合

参数解释:

  • n_estimators : integer, optional (default=10) 整数,可选择(默认值为10)。 森林里决策树的数目。
  • criterion : string, optional (default=”gini”) 字符串,可选择(默认值为“gini”)。衡量分裂质量的性能(函数)。
  • min_samples_leaf : int, float, optional (default=1) 整数,浮点数,可选的(默认值为1)。需要在叶子结点上的最小样本数量:如果为int,那么考虑min_samples_leaf作为最小的数字。
  • n_jobs : integer, optional (default=1) 整数,可选的(默认值为1)。用于拟合和预测的并行运行的工作(作业)数量。如果值为-1,那么工作数量被设置为核的数量。
  • oob_score : bool (default=False) bool,(默认值为False)。是否使用袋外样本来估计泛化精度。
rf = RandomForestClassifier(n_estimators=200,min_samples_leaf=5,n_jobs=-1,oob_score=True,random_state=42)
rf.fit(X_train, y_train)
# 性能预测
print(classification_report(y_test, rf.predict(X_test)))

结果显示:

            precision   recall   f1-score   support0       0.91      0.98      0.94       2811       0.67      0.31      0.42        39
accuracy                           0.90       320
macro avg      0.79      0.64      0.68       320
weighted avg   0.88      0.90      0.88       320

其中,列表最左边的一列为分类的标签名,右边support列为每个标签的出现次数。avg / total行为各列的均值(support列为总和),precision、recall、f1-score三列分别为各个类别的精确度、召回率及值。
precision: 预测的准确性,获取的所有样本中,正确样本的占比
recall: 实际样本中,有多少样本被正确的预测出来了。
F1 Score: 统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的精确率和召回率。F1分数可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。

举例解释:
某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为目的,撒网逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:
精确率 = 700 / (700 +200 + 100) = 70%
召回率 = 700 / 1400 = 50%

1.3 特征重要性

Gini Importance: feature_importances_
gini不纯度: 从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率,计算式:



因此,基尼系数可以做为熵模型的一个近似替代。

基尼不纯度:
(1)基尼不纯度可以作为衡量系统混乱程度的标准;
(2)基尼不纯度越小,纯度越高,集合的有序程度越高,分类的效果越好
(3)基尼不纯度为 0 时,表示集合类别一致;
(4)在决策树中,比较基尼不纯度的大小可以选择更好的决策条件(子节点)

features = np.array(X_train.columns)
# gini不纯度
imps_gini=rf.feature_importances_
std_gini = np.std([tree.feature_importances_ for tree in rf.estimators_], axis=0) # 计算标准差
indices_gini = np.argsort(imps_gini) # 将imps_gini中的元素从小到大排列,提取其在排列前对应的index(索引)输出plt.title('Feature Importance')
# plt.barh():横向的柱状图,可以理解为正常柱状图旋转了90°
plt.barh(range(len(indices_gini)), imps_gini[indices_gini], yerr=std_gini[indices_gini],color='c', align='center')
plt.yticks(range(len(indices_gini)), features[indices_gini])
plt.xlabel('Gini Importance')
plt.show()

1.4 Permutation Importance(permutation_importances)

# 从相同的随机数种子出发,可以得到相同的随机数序列
np.random.seed(10)
imps_perm, std_perm = permutation_importances(rf, X_train, y_train,oob_classifier_accuracyfeatures = 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='c', align='center')
plt.yticks(range(len(indices_perm)), features[indices_perm])
plt.xlabel('Permutation Importance')
plt.show()

1.5 Boruta

forest = RandomForestClassifier(n_estimators=200,min_samples_leaf=5,n_jobs=-1,oob_score=True,random_state=42)
feat_selector = BorutaPy(forest, verbose=2,max_iter=50)np.random.seed(10)
import time
start = time.time()
feat_selector.fit(X_train.values, y_train.values)
end = time.time()
print(end - start)# 获取运行时间

迭代发生变化的节点:

BorutaPy finished running.

Iteration: 50 / 50
Confirmed: 8
Tentative: 0
Rejected: 2
169.35201215744019

print('明确的参数: \n',list(np.array(X_train.columns)[feat_selector.ranking_==1]))
print('\n待定的参数: \n',list(np.array(X_train.columns)[feat_selector.ranking_==2]))
print('\n拒绝的参数: \n',list(np.array(X_train.columns)[feat_selector.ranking_>=3]))

明确的参数:
[‘fixed acidity’, ‘volatile acidity’, ‘citric acid’, ‘chlorides’, ‘total sulfur dioxide’, ‘density’, ‘sulphates’, ‘alcohol’]

待定的参数:
[‘free sulfur dioxide’]

拒绝的参数:
[‘residual sugar’, ‘pH’]


2. 特征选择和性能比较

2.1 基于基尼重要性的特征选择

删除基尼重要性小于0.05的参数(3个):‘pH’,‘residual sugar’,‘free sulfur dioxide’

X_train_gini=X_train.drop(['pH','residual sugar','free sulfur dioxide'],axis=1)
X_test_gini=X_test.drop(['pH','residual sugar','free sulfur dioxide'],axis=1)rf_gini = RandomForestClassifier(n_estimators=300, # 森林里(决策)树的数目min_samples_leaf=5,n_jobs=-1,oob_score=True,random_state=42)
rf_gini.fit(X_train_gini, y_train)

2.2 基于排序重要性的特征选择

删除排序重要性小于0.003的参数(6个):‘chlorides’,‘pH’,‘residual sugar’,‘fixed acidity’,‘free sulfur dioxide’,‘citric acid’

X_train_perm=X_train.drop(['chlorides','pH','residual sugar','fixed acidity','free sulfur dioxide','citric acid'],axis=1)
X_test_perm=X_test.drop(['chlorides','pH','residual sugar','fixed acidity','free sulfur dioxide','citric acid'],axis=1)rf_gini = RandomForestClassifier(n_estimators=300, # 森林里(决策)树的数目min_samples_leaf=5,n_jobs=-1,oob_score=True,random_state=42)
rf_gini.fit(X_train_gini, y_train)

2.3 基于Boruta的特征选择

删除Boruta的拒绝变量(2个):‘residual sugar’, ‘pH’

X_train_boruta=X_train.drop(['pH','residual sugar'],axis=1)
X_test_boruta=X_test.drop(['pH','residual sugar'],axis=1)rf_gini = RandomForestClassifier(n_estimators=300, # 森林里(决策)树的数目min_samples_leaf=5,n_jobs=-1,oob_score=True,random_state=42)
rf_gini.fit(X_train_gini, y_train)

2.4 预测性能比较

print('**************************** 原模型 ****************************')
print('\n')
print(classification_report(y_test, rf.predict(X_test)))print ('\n')print('****************** 基于基尼重要性的特征选择 ******************')
print('\n')
print(classification_report(y_test, rf_gini.predict(X_test_gini)))print ('\n')print('****************** 基于排序重要性的特征选择 ******************')
print('\n')
print(classification_report(y_test, rf_perm.predict(X_test_perm)))print ('\n')print('******************** 基于Boruta的特征选择 ********************')
print('\n')
print(classification_report(y_test, rf_boruta.predict(X_test_boruta)))

**************************** 原模型 ****************************

          precision    recall  f1-score   support0       0.90      0.97      0.93       2741       0.67      0.39      0.49        46accuracy                           0.88       320
macro avg       0.79      0.68     0.71       320
weighted avg    0.87      0.88     0.87       320

****************** 基于基尼重要性的特征选择 ******************

          precision    recall  f1-score   support0       0.90      0.97      0.93       2741       0.67      0.39      0.49        46accuracy                           0.88       320
macro avg       0.79      0.68     0.71       320
weighted avg    0.87      0.88     0.87       320

****************** 基于排序重要性的特征选择 ******************

           precision    recall  f1-score   support 0       0.89      0.99      0.94       2741       0.76      0.28      0.41        46accuracy                           0.88       320
macro avg       0.83      0.63     0.67       320
weighted avg    0.87      0.88     0.86       320

******************** 基于Boruta的特征选择 ********************

          precision    recall  f1-score   support0       0.90      0.97      0.93       2741       0.67      0.39      0.49        46accuracy                           0.88       320
macro avg       0.79      0.68     0.71       320
weighted avg    0.87      0.88     0.87       320

相比之下,排序重要性的特征选择方法稍好一些。基于Boruta的特征选择只删除了pH和原始模型的结果是一致的,并未对模型产生很大的影响。

机器学习笔记 十七:基于Gini Importance、Permutation Importance、Boruta的随机森林模型重要性评估的比较相关推荐

  1. 【ML】基于机器学习的心脏病预测研究(附代码和数据集,随机森林模型)

    写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌. 之前创作过心脏病预测研究文章如下: [ML]基于机器学 ...

  2. 随机森林特征重要性(Variable importance)评估方法

    Random Forest Variable importance 算法介绍 实现 算法流程 分类 回归 实验 实验1:waveform数据集(分类) 实验2:superconductivity数据集 ...

  3. R语言使用randomForest包构建随机森林模型(Random forests)、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB

    R语言使用randomForest包中的randomForest函数构建随机森林模型(Random forests).使用importance函数查看特征重要度.使用table函数计算混淆矩阵评估分类 ...

  4. R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度、使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异)

    R语言随机森林模型:计算随机森林模型的特征重要度(feature importance)并可视化特征重要度.使用少数重要特征拟合随机森林模型(比较所有特征模型和重要特征模型在测试集上的表现差异) 目录

  5. 机器学习笔记 十九:由浅入深的随机森林模型之分类

    随机森林学习内容 1. 集成学习 2.sklearn中的集成算法 2.1 sklearn中的集成算法模块ensemble 2.2 RandomForestClassifier 2.2.1 参数 2.2 ...

  6. kaggle项目:基于随机森林模型的心脏病患者预测分类!

    公众号:尤而小屋 作者:Peter 编辑:Peter 大家好,我是Peter~ 新年的第一个项目实践~给大家分享一个新的kaggle案例:基于随机森林模型(RandomForest)的心脏病人预测分类 ...

  7. python随机森林变量重要性_python机器学习之随机森林(七)

    机器学习之随机森林,供大家参考,具体内容如下 1.Bootstraping(自助法) 名字来自成语"pull up by your own bootstraps",意思是依靠你自己 ...

  8. 机器学习预测股票收益(一)之随机森林模型

    机器学习预测股票收益(一)之随机森林模型 前言 一.导入库和数据 二.处理数据以及计算特征变量 三.使用随机森林回归预测股票收益 1.构建训练集和测试集 2.查看预测结果 四.根据预测结果构建long ...

  9. Python量化交易05——基于多因子选择和选股策略(随机森林,LGBM)

    参考书目:深入浅出Python量化交易实战 在机器学习里面的X叫做特征变量,在统计学里面叫做协变量也叫自变量,在量化投资里面则叫做因子,所谓多因子就是有很多的特征变量. 本次带来的就是多因子模型,并且 ...

  10. 随机森林模型_观点速递65|使用随机森林模型模拟短期空气污染效应:基于交通和气象数据...

    概念 · 解读 随机森林:机器学习中的一种集成算法,它属于"装袋"类型,通过组合多棵决策树,最终结果通过投票或取均值,使得整体模型的结果具有较高的精确度和稳定性. 决定系数(R2) ...

最新文章

  1. access“idno”字段改为文本型_结构化文本计算示例(一)
  2. linux acl 权限 给任何用户或用户组设置任何文件/目录的访问权限
  3. xpath解析库的语法及使用
  4. 线程id 获取线程名称_016 线程及初步网络编程
  5. k8s springboot 文件_Springboot整合Spring Cloud Kubernetes读取ConfigMap支持自动刷新配置的教程...
  6. 15天玩转redis —— 第四篇 哈希对象类型
  7. 图:[PPT双屏技术-知识竞赛方案策划]华中师范大学-城市与环境科学学院-城环学院地理知识竞赛胜利闭幕.
  8. pythonlinux安装 pandas_linux pandas安装
  9. 计算机怎么关闭u盘系统还原,电脑系统还原错误怎么办
  10. 屏幕上1像素代表的实际距离是多少?
  11. 链家网页爬虫_爬虫-链家网租金数据
  12. 灰度图片及彩色图片像素点统计及显示
  13. H5游戏开发包括哪些游戏类型
  14. shutdown immediate 太慢,需要进行进程查杀
  15. 工业物联网的价值有哪些
  16. REID计算机网络,什么是行人重识别(ReID)?为什么要ReID?
  17. 华为1+X认证网络系统管理与运维中级实验
  18. STM32寄存器配置USART1串口及USART->BRR值的计算
  19. 控制QTextEdit中字体颜色
  20. python 生存分析_生存分析之KM法

热门文章

  1. 皮卡丘为什么不进化_皮卡丘为什么不进化 真是原因让人感动哭
  2. 无线移动通信技术快速发展历程和趋向(转)
  3. 效率是绳,质量是命!——浅析如何运用UML来提高手游团队的绳命质量
  4. Android 高德地图自定义定位图标的显示
  5. Python beautiful soup解析html获得数据
  6. selenium 能定位成功 不能输入 和点击的解决办法
  7. UnicodeTOGB,能够将Unicode串转换成GB码
  8. JavaWeb学习-动态代理-2-invoke()方法和动态代理Waiter类练习
  9. Cacti之交换机端口无法正常显示
  10. 这是互联网变得越来越敌对的7种方式