随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能,因此,随机森林也被誉为“代表集成学习技术水平的方法”。
一、随机森林rf简介
只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:
用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集。
用抽样得到的样本集生成一棵决策树。在生成的每一个结点:
随机不重复地选择d个特征;
利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数、增益率或者信息增益判别)。
重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。
用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。
下图比较直观地展示了随机森林算法(图片出自文献2):
图1:随机森林算法示意图
没错,就是这个到处都是随机取值的算法,在分类和回归上有着极佳的效果,是不是觉得强的没法解释~
然而本文的重点不是这个,而是接下来的特征重要性评估。
二、特征重要性评估
现实情况下,一个数据集中往往有成百上前个特征,如何在其中选择比结果影响最大的那几个特征,以此来缩减建立模型时的特征数是我们比较关心的问题。这样的方法其实很多,比如主成分分析,lasso等等。不过,这里我们要介绍的是用随机森林来对进行特征筛选。
用随机森林进行特征重要性评估的思想其实很简单,说白了就是看看每个特征在随机森林中的每棵树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。
好了,那么这个贡献是怎么一个说法呢?通常可以用基尼指数(gini index)或者袋外数据(oob)错误率作为评价指标来衡量。
我们这里只介绍用基尼指数来评价的方法,首先对另一种方法做个简单介绍。
的定义为:在 rf 的每棵树中,使用随机抽取的训练自助样本建树,并计算袋外数据 oob)的预测错误率,然后随机置换变量x,的观测值后再次建树并计算 oob 的预测错误率,最后计算两次 oob 错误率的差值经过标准化处理后在所有树中的平均值即为变量 ,的置换重要性 ()
我们将变量重要性评分(variable importance measures)用 来表示,将gini指数用 来表示,假设有 个特征 ,,,,, 棵决策树, 个类别,现在要计算出每个特征 的gini指数评分 ,亦即第 个特征在rf所有决策树中节点分裂不纯度的平均改变量。
第 棵树节点 的 指数的计算公式为:
其中, 表示有 个类别, 表示节点 中类别 所占的比例。直观地说,就是随便从节点 中随机抽取两个样本,其类别标记不一致的概率。
特征 在第 棵树节点 的重要性,即节点 分枝前后的 指数变化量为:
其中,和 分别表示分枝后两个新节点的指数。如果,特征 在决策树 i 中出现的节点为集合,那么 在第 棵树的重要性为:
三、举个例子
值得庆幸的是,sklearn已经帮我们封装好了一切,我们只需要调用其中的函数即可。
我们以uci上葡萄酒的例子为例,首先导入数据集。
import pandas as pdurl = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'df = pd.read_csv(url, header = none)df.columns = ['class label', 'alcohol', 'malic acid', 'ash', 'alcalinity of ash', 'magnesium', 'total phenols', 'flavanoids', 'nonflavanoid phenols', 'proanthocyanins', 'color intensity', 'hue', 'od280/od315 of diluted wines', 'proline'] 然后,我们来大致看下这时一个怎么样的数据集
import numpy as npnp.unique(df['class label']) 输出为
array([1, 2, 3], dtype=int64) 可见共有3个类别。然后再来看下数据的信息:
df.info() 输出为
rangeindex: 178 entries, 0 to 177data columns (total 14 columns):class label 178 non-null int64alcohol 178 non-null float64malic acid 178 non-null float64ash 178 non-null float64alcalinity of ash 178 non-null float64magnesium 178 non-null int64total phenols 178 non-null float64flavanoids 178 non-null float64nonflavanoid phenols 178 non-null float64proanthocyanins 178 non-null float64color intensity 178 non-null float64hue 178 non-null float64od280/od315 of diluted wines 178 non-null float64proline 178 non-null int64dtypes: float64(11), int64(3)memory usage: 19.5 kb 可见除去class label之外共有13个特征,数据集的大小为178。
按照常规做法,将数据集分为训练集和测试集。
try: from sklearn.cross_validation import train_test_splitexcept: from sklearn.model_selection import train_test_splitfrom sklearn.ensemble import randomforestclassifierx, y = df.iloc[:, 1:].values, df.iloc[:, 0].valuesx_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)feat_labels = df.columns[1:]forest = randomforestclassifier(n_estimators=10000, random_state=0, n_jobs=-1)forest.fit(x_train, y_train) 好了,这样一来随机森林就训练好了,其中已经把特征的重要性评估也做好了,我们拿出来看下。
importances = forest.feature_importances_indices = np.argsort(importances)[::-1]for f in range(x_train.shape[1]): print(%2d) %-*s %f % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]])) 输出的结果为
1) color intensity 0.182483 2) proline 0.158610 3) flavanoids 0.150948 4) od280/od315 of diluted wines 0.131987 5) alcohol 0.106589 6) hue 0.078243 7) total phenols 0.060718 8) alcalinity of ash 0.032033 9) malic acid 0.02540010) proanthocyanins 0.02235111) magnesium 0.02207812) nonflavanoid phenols 0.01464513) ash 0.013916 对的就是这么方便。
如果要筛选出重要性比较高的变量的话,这么做就可以
threshold = 0.15x_selected = x_train[:, importances > threshold]x_selected.shape 输出为
(124, 3) 瞧,这不,帮我们选好了3个重要性大于0.15的特征了吗~
三星显示器的首款采用新型节能OLED面板的手机
风光互补供电系统在水文水利方面的运用途径
超高清视频在金融银行领域应用需满足哪些条件
一文读懂电机与驱动器的各相顺序错位
法国EDF预计国内核电产量将在2020年急剧下降至300太瓦时 今年夏季和秋季可能必须暂停许多核反应堆
利用随机森林进行特征重要性评估
台积电的下一步是什么?英特尔龙头不保?
诺基亚手机要搭载Flyme6?和魅族合作或已成事实
2020年03期新材料企业家成长营“山东站”标杆企业游学,邀您一起参与!
MIUI9什么时候出?MIUI9最新消息:小米内部已经用上了MIUI9
什么是放大器的非线性失真
英特尔的野心:下一代VR设备从基因里就带我的技术
科百科技发布智慧农业物联网新品 可连接传感器上千个、覆盖农田6000亩
加入Touch Bar的iPhone8还将拥有脸部扫描仪?三星S8慌了
自动驾驶导航:福特请出无人机给激光雷达替补
能源数采网关实现IEC104协议对接能源管理系统
华为将AI整合到其光伏业务中,将见证云、AI和5G技术的全面融合
人工智能行业将会取得什么成就
选购网络摄像机时须考虑三大因素
工业机器人由些体系构成