利用随机森林进行特征选择

本文介绍随机森林中特征重要性评估方法,可通过基尼指数或袋外数据(OOB)错误率衡量。详细说明了计算特征重要性时,利用袋外数据误差的具体步骤,还以UCI上葡萄酒数据集为例展示了评估过程,方便筛选重要变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随机森林中的特征重要性


随机森林算法示意图
随机森林算法示意图

利用随机森林选择特征可参看论文Variable selection using Random Forests

用随机森林进行特征重要性评估的思想其实很简单,说白了就是看看每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。

好了,那么这个贡献是怎么一个说法呢?通常可以用基尼指数(Gini index)或者袋外数据(OOB)错误率作为评价指标来衡量。

袋外数据错误率

计算某个特征 X X 的重要性时,具体步骤如下:

1)对每一颗决策树,选择相应的袋外数据(out of bag,OOB)​计算袋外数据误差,记为errOOB1

所谓袋外数据是指,每次建立决策树时,通过重复抽样得到一个数据用于训练​决策树,这时还有大约1/3的数据没有被利用,没有参与决策树的建立。这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。

​这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

​2)随机对袋外数据OOB所有样本的特征 X X 加入噪声干扰(可以随机改变样本在特征X处的值),再次计算袋外数据误差,记为 errOOB2 e r r O O B 2

3)​假设森林中有 N N 棵树,则特征X的重要性= (errOOB2errOOB1/N ∑ ( e r r O O B 2 − e r r O O B 1 ) / N 。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即 errOOB2 e r r O O B 2 上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。

举个例子

借用利用随机森林对特征重要性进行评估的例子。

以UCI上葡萄酒的例子为例,首先导入数据集。

import pandas as pd
url = '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']

看下数据的信息:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 178 entries, 0 to 177
Data columns (total 14 columns):
Class label                     178 non-null int64
Alcohol                         178 non-null float64
Malic acid                      178 non-null float64
Ash                             178 non-null float64
Alcalinity of ash               178 non-null float64
Magnesium                       178 non-null int64
Total phenols                   178 non-null float64
Flavanoids                      178 non-null float64
Nonflavanoid phenols            178 non-null float64
Proanthocyanins                 178 non-null float64
Color intensity                 178 non-null float64
Hue                             178 non-null float64
OD280/OD315 of diluted wines    178 non-null float64
Proline                         178 non-null int64
dtypes: float64(11), int64(3)
memory usage: 19.5 KB

可见除去class label之外共有13个特征,数据集的大小为178。
按照常规做法,将数据集分为训练集和测试集。

from sklearn.cross_validation import train_test_split
from sklearn.ensemble import RandomForestClassifier
x, y = df.iloc[:, 1:].values, df.iloc[:, 0].values
x_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.025400
10) Proanthocyanins                0.022351
11) Magnesium                      0.022078
12) Nonflavanoid phenols           0.014645
13) Ash                            0.013916

对的就是这么方便。
如果要筛选出重要性比较高的变量的话,这么做就可以

threshold = 0.15
x_selected = x_train[:, importances > threshold]
x_selected.shape

输出为

(124,3)

参考资料

随机森林进行特征重要性度量的详细说明
利用随机森林做特征选择
利用随机森林对特征重要性进行评估

随机森林算法因其出色的分类性能和对特征重要性的评估能力,在特征选择领域中占据了重要位置。为了回答如何使用随机森林进行特征选择并优化分类精度,首先,我们应当理解随机森林算法的核心思想:通过构建多个决策树并进行集成学习,结合每个决策树的投票结果来进行最终预测。在特征选择方面,随机森林能够提供每棵树中特征的使用频率,这些信息可用于评估特征的重要性。 参考资源链接:[随机森林特征选择算法RFFS:提升分类性能的关键](https://wenku.youkuaiyun.com/doc/6412b6f7be7fbd1778d489e2?spm=1055.2569.3001.10343) 在进行特征选择时,可以采用RFFS算法,结合序列后向选择和广义序列后向选择,系统地筛选特征。序列后向选择方法从全部特征集合出发,逐步删除不重要的特征,直至达到预设的分类性能阈值。而广义序列后向选择则在删除特征的同时考虑重新加入其他特征,以找到最优的特征组合。这样可以确保在减少特征数量的同时,模型的分类精度不会显著下降,甚至有所提高。 以UCI数据集为例,我们首先需要加载数据集,并使用随机森林模型来评估各个特征的重要性。在Python中,我们可以使用`RandomForestClassifier`类来实现这一过程。以下是进行特征选择的步骤: 1. 加载UCI数据集,并划分训练集和测试集。 2. 使用随机森林模型训练数据,并获取特征重要性评分。 3. 应用序列后向选择和广义序列后向选择算法,根据特征重要性评分决定保留或剔除特征。 4. 在保留的特征子集上重新训练随机森林模型,评估分类精度。 5. 调整特征选择策略,优化模型性能。 在这个过程中,我们可以使用交叉验证来准确评估特征选择对分类精度的影响。此外,为了验证模型性能,可以将最终模型与未进行特征选择随机森林模型进行比较。如果新的模型在保持或提高分类精度的同时,显著减少了特征数量,那么我们可以认为特征选择是成功的。 最后,推荐查阅《随机森林特征选择算法RFFS:提升分类性能的关键》,该文详细介绍了RFFS算法的原理和实验过程,提供了理论和实践上的支持,对于理解和应用随机森林特征选择具有重要价值。 参考资源链接:[随机森林特征选择算法RFFS:提升分类性能的关键](https://wenku.youkuaiyun.com/doc/6412b6f7be7fbd1778d489e2?spm=1055.2569.3001.10343)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值