参考:http://blog.csdn.net/zjuPeco/article/details/77371645?locationNum=7&fps=1

一般情况下,数据集的特征成百上千,因此有必要从中选取对结果影响较大的特征来进行进一步建模,相关的方法有:主成分分析、lasso等,这里我们介绍的是通过随机森林来进行筛选。

用随机森林进行特征重要性评估的思想比较简单,主要是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献大小。

贡献度的衡量指标包括:基尼指数(gini)、袋外数据(OOB)错误率作为评价指标来衡量。

衍生知识点:权重随机森林的应用(用于增加小样本的识别概率,从而提高总体的分类准确率)

随机森林/CART树在使用时一般通过gini值作为切分节点的标准,而在加权随机森林(WRF)中,权重的本质是赋给小类较大的权重,给大类较小的权重。也就是给小类更大的惩罚。权重的作用有2个,第1点是用于切分点选择中加权计算gini值,表达式如下:

其中,N表示未分离的节点,NL和NR分别表示分离后的左侧节点和右侧节点,Wi为c类样本的类权重,ni表示节点内各类样本的数量,Δi是不纯度减少量,该值越大表明分离点的分离效果越好。

第2点是在终节点,类权重用来决定其类标签,表达式如下:

参考文献:随机森林针对小样本数据类权重设置     https://wenku.baidu.com/view/07ba98cca0c7aa00b52acfc789eb172ded639998.html

这里介绍通过gini值来进行评价,我们将变量的重要性评分用VIM来表示,gini值用GI表示,假设有m个特征X1,X2,...Xc,现在要计算出每个特征Xj的gini指数评分VIMj,即第j个特征在随机森林所有决策树中节点分裂不纯度的平均改变量,gini指数的计算公式如下表示:

其中,k表示有k个类别,pmk表示节点m(将特征m逐个对节点计算gini值变化量)中类别k所占的比例。

特征Xj在节点m的重要性,即节点m分枝前后的gini指数变化量为:

其中GIl和GIr分别表示分枝后两个新节点的gini指数。

如果特征Xj在决策树i中出现的节点在集合M中,那么Xj在第i棵树的重要性为:

假设随机森林共有n棵树,那么:

最后把所有求得的重要性评分进行归一化处理就得到重要性的评分:

通过sklearn中的随机森林返回特征的重要性:

from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
importances = forest.feature_importances_
#样例的输出结果如下所示
 1) Alcohol                        0.1824832) Malic acid                     0.1586103) Ash                            0.1509484) Alcalinity of ash              0.1319875) Magnesium                      0.1065896) Total phenols                  0.0782437) Flavanoids                     0.0607188) Nonflavanoid phenols           0.0320339) Proanthocyanins                0.025400
10) Color intensity                0.022351
11) Hue                            0.022078
12) OD280/OD315 of diluted wines   0.014645
13) Proline                        0.013916

举个样例:

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
df.head()
train, test = df[df['is_train']==True], df[df['is_train']==False]
features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)
preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])
clf.feature_importances_#返回特征重要性的结果:[ 0.085598  ,  0.01877088,  0.45324092,  0.4423902 ]

sklearn.metrics中的评估方法介绍:

1、sklearn.metrics.roc_curve(true_y. pred_proba_score, pos_labal)
#返回roc曲线的3个属性:fpr, tpr,和阈值
import numpy as np
from sklearn.metrics import roc_curve
y = np.array([1,1,2,2])
pred = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, pred, pos_label=2)
fpr      # array([ 0. ,  0.5,  0.5,  1. ])
tpr      # array([ 0.5,  0.5,  1. ,  1. ])
thresholds      #array([ 0.8 ,  0.4 ,  0.35,  0.1 ])
from sklearn.metrics import auc
metrics.auc(fpr, tpr) 2、sklearn.metrics.auc(x, y, reorder=False)
#计算AUC值,其中x,y分别为数组形式,根据(xi,yi)在坐标上的点,生成的曲线,计算AUC值3、sklearn.metrics.roc_auc_score(true_y, pred_proba_y)
#直接根据真实值(必须是二值)、预测值(可以是0/1,或是prob)计算出auc值

参考:http://blog.csdn.net/cherdw/article/details/54971771

网格搜索调参:

grid.fit():运行网格搜索

grid_scores_:给出不同参数情况下的评价结果

best_params_:描述了已取得最佳结果的参数的组合

best_score_:成员提供优化过程期间观察到的最好的评分

param_test1= {'n_estimators':range(10,71,10)}    #对参数'n_estimators'进行网格调参
gsearch1= GridSearchCV(estimator = RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt' ,random_state=10), param_grid =param_test1, scoring='roc_auc',cv=5)
gsearch1.fit(X,y)
gsearch1.grid_scores_,gsearch1.best_params_, gsearch1.best_score_     #输出调参结果,并返回最优下的参数
#输出结果如下:
([mean:0.80681, std: 0.02236, params: {'n_estimators': 10},  mean: 0.81600, std: 0.03275, params:{'n_estimators': 20},  mean: 0.81818, std: 0.03136, params:{'n_estimators': 30},  mean: 0.81838, std: 0.03118, params:{'n_estimators': 40},  mean: 0.82034, std: 0.03001, params:{'n_estimators': 50},  mean: 0.82113, std: 0.02966, params:{'n_estimators': 60},  mean: 0.81992, std: 0.02836, params:{'n_estimators': 70}],
{'n_estimators':60},  0.8211334476626017)
#多个特征的网格搜索,如下所示
param_test2= {'max_depth':range(3,14,2),'min_samples_split':range(50,201,20)}
gsearch2= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60, min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10),  param_grid = param_test2,scoring='roc_auc',iid=False, cv=5)
gsearch2.fit(X,y)
gsearch2.grid_scores_,gsearch2.best_params_, gsearch2.best_score_
#通过查看袋外准确率(oob)来判别参数调整前后准确率的变化情况
rf1= RandomForestClassifier(n_estimators= 60, max_depth=13, min_samples_split=110,  min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10)
rf1.fit(X,y)
print(rf1.oob_score_)    #通过每次对1-3个特征进行网格搜索,重复此过程直到遍历每个特征,并得到最终的调参结果。  

转载于:https://www.cnblogs.com/xiaochouk/p/8583255.html

特征筛选(随机森林)相关推荐

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

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

  2. 数据与特征对随机森林的影响(特征对比、特征降维、考虑性价比)

    数据与特征对随机森林的影响(特征对比.特征降维.考虑性价比)_PanDawson的博客-CSDN博客_随机森林降维

  3. 随机森林c++_科研快报第91期:综合多特征使用随机森林和自相似性参数的极化SAR海面溢油检测...

    Multi-Feature Based Ocean Oil Spill Detection for Polarimetric SAR Data Using Random Forest and the ...

  4. 随机森林筛选特征Matlab,特征筛选(随机森林)

    随机森林能够度量每个特征的重要性,我们可以依据这个重要性指标进而选择最重要的特征.sklearn中已经实现了用随机森林评估特征重要性,在训练好随机森林模型后,直接调用feature_importanc ...

  5. 特征筛选———贷款用户是否会逾期

    一.学习要求 分别对前面预处理的数据使用IV值和随机森林进行特征筛选 二.基础知识 1.IV值 计算过程是根据该特征所命中黑白样本的比率与总黑白样本的比率,来对比和计算其关联程度 IV 值的取值范围是 ...

  6. 使用随机森林(Random Forest)进行特征筛选并可视化

    使用随机森林(Random Forest)进行特征筛选并可视化 随机森林可以理解为Cart树森林,它是由多个Cart树分类器构成的集成学习模式.其中每个Cart树可以理解为一个议员,它从样本集里面随机 ...

  7. python随机森林筛选变量_一种基于随机森林的改进特征筛选算法

    刘云翔 陈斌 周子宜 摘  要: 肝癌是一种我国高发的消化系统恶性肿瘤,患者死亡率高,威胁极大.而其预后情况通常只能通过医生的专业知识和经验积累来粗略判断,准确率较差.因此文中在分析随机森林算法的基本 ...

  8. 随机森林RF中的特征重要性的计算公式VIM

    特征重要性评估 现实情况下,一个数据集中往往有成百上前个特征,如何在其中选择比结果影响最大的那几个特征,以此来缩减建立模型时的特征数是我们比较关心的问题.这样的方法其实很多,比如主成分分析,lasso ...

  9. 利用随机森林对特征重要性进行评估 方法一

    https://hal.archives-ouvertes.fr/file/index/docid/755489/filename/PRLv4.pdf 前言 随机森林是以决策树为基学习器的集成学习算法 ...

最新文章

  1. 12 个超燃的 IntelliJ IDEA 插件!
  2. windows2003 mstsc 远端连线,减少可会话数目 ,同一用户只允许一个会话
  3. Dubbo设置超时时间
  4. OpenCV方形检测Square Detection的实例(附完整代码)
  5. 【Python】Matplotlib绘制各式各样的圆形
  6. 电脑c盘怎么清理_电脑C盘内存不足?三分钟教你彻底清理C盘空间,瞬间多出10个G...
  7. Thinkphp列表搜索排序-----查
  8. python怎么做一个动态烟花_简单烟花效果.py python firework demo
  9. 基于 Flink、ClickHouse 的舆情分析系统:系统架构设计说明书
  10. 3、ARM嵌入式系统:按键 初始化
  11. 实现数据开放共享的方法
  12. 解决sublime text2字体显示模糊问题
  13. mysql中根据出生年月日计算年龄。
  14. WIFI驱动配置实战(Linux驱动开发篇)
  15. 微信小程序-全局数据共享
  16. XSS安全漏洞修复解决方案
  17. 基于Android的学生管理系统的设计与实现
  18. 如何设计好一款iOS游戏UI的细节
  19. 软件设计师知识点100条(21~40)
  20. 解决windows下无法创建以“.”开头的文件夹或者文件

热门文章

  1. 使用Xdoclet和Ant构建Hibernate映射和配置文件
  2. Android自定义Layout
  3. ACM模板--邻接矩阵 无向图
  4. Java多线程编程总结
  5. linux命令tar
  6. innodb和myisam的区别
  7. C语言实现:将一个字符串插入到另一个字符串的指定位置
  8. springcloud(四):熔断器Hystrix
  9. vue组件级路由钩子函数介绍,及实际应用
  10. script type=text/template是干什么的,为什么要把html写在js中? 这是什么编程语言风格,都能这样用吗?...