随机森林做特征重要性排序和特征选择

本文深入介绍了随机森林模型,包括其工作原理、随机性特点及在特征选择中的应用。随机森林通过构建多个决策树并综合预测结果,避免了过拟合。特征重要性可以通过sklearn的`feature_importances_`属性获取。在葡萄酒数据集案例中,展示了如何使用随机森林进行特征选择,强调了特征重要性在模型构建中的作用。

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

随机森林模型介绍:

随机森林模型不仅在预测问题上有着广泛的应用,在特征选择中也有常用。

随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能。
随机森林模型在拟合数据后,会对数据属性列,有一个变量重要性的度量,在sklearn中即为随机森林模型的 feature_importances_ 参数,这个参数返回一个numpy数组对象,对应为随机森林模型认为训练特征的重要程度,float类型,和为1,特征重要性度数组中,数值越大的属性列对于预测的准确性更加重要。


随机森林(RF)简介:

只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:

  • 1、用有抽样放回的方法(bugging)从样本集中选取n个样本作为一个训练集
  • 2、用抽样得到的样本集生成一棵决策树。在生成数的每一个结点:
    • 1、随机不重复地选择d个特征
    • 2、利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数(CART数)、增益率(C4.5)或者信息增益(ID3)判别)
  • 3、重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。
  • 4、用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。
    下图比较直观地展示了随机森林算法:

在这里插入图片描述

随机森林的随机性体现在:

  • 选取样本时 有放回的随机选取。
    会导致不同的树,分别学到整体数据集的一部分特征,最终大家投票,得到最终的预测结果。

sklearn提供前剪枝技术。个人解读,

  • 1.随机森林已经通过随机选择样本和特征,保证了随机性,不用后剪枝应该也能避免过拟合

  • 2.后剪枝是为了避免过拟合,随机森林随机选择变量与树的数量,已经避免了过拟合,没必要去后剪枝了。

  • 3.一般rf要控制的是树的规模,而不是树的置信度,后剪枝的作用其实被集成方法消解了,所以用处不大。

特征重要性评估:

sklearn 已经帮我们封装好了一切。

1、 以UCI上葡萄酒的例子为例,首先导入数据集。
数据集介绍:数据集
特征:

  1. Alcohol
  2. Malic acid
  3. Ash
  4. Alcalinity of ash
  5. Magnesium
  6. Total phenols
  7. Flavanoids
  8. Nonflavanoid phenols
  9. Proanthocyanins
  10. Color intensity
  11. Hue
  12. OD280/OD315 of diluted wines
  13. Proline
# 导入数据
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']

2、数据初探

#初看数据
df.head(5)

在这里插入图片描述

# 标签类别
set(df['Class label'])  #{1, 2, 3}
df.shape # (178, 14)
# 统计缺失值
df.isna().sum()

在这里插入图片描述

df.describe()

在这里插入图片描述
可见除去class label之外共有13个特征,数据集的大小为178。无缺失值。

3、 建模
将数据集分为训练集和测试集。

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
x = df.iloc[:, 1:].values 
y = 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,max_depth=3)
forest.fit(x_train, y_train)
score = forest.score(x_test, y_test)  # score=0.98148
forest.feature_importances_

在这里插入图片描述

importances = forest.feature_importances_
indices = np.argsort(importances)[::-1] # 下标排序
for f in range(x_train.shape[1]):   # x_train.shape[1]=13
    print("%2d) %-*s %f" % \
          (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))

在这里插入图片描述
4、设置特征选择阈值:

threshold = 0.15
x_selected = x_train[:, importances > threshold]
x_selected.shape #(124, 3)

查看选择的特征具体情况。

x_selected_columns = feat_labels[importances > threshold]

Index([‘Flavanoids’, ‘Color intensity’, ‘Proline’], dtype=‘object’)

说明仅仅选择了’Flavanoids’, ‘Color intensity’, 'Proline’3列。

import pandas as pd
x_select_pd = pd.DataFrame(x_selected,columns=x_selected_columns)
x_select_pd

在这里插入图片描述
特征选择完毕。


产出:

在做特征选择是特性工程最后一步,一般先进行相关性分,消除两两变量的线性相关性,然后再进行随机森林进行重要特征的筛选。

内容概要:本文详细介绍了随机森林在数据科学领域的应用,特别是在降维、特征选择重要性排序方面的优势。首先阐述了随机森林的基础概念及其作为集成学习模型的工作机制,强调了其通过自助采样法随机特征选择提高模型泛化能力的特点。随后重点讲解了如何利用PythonScikit-learn库实现随机森林分类器,并展示了如何通过feature_importances_属性获取特征重要性得分,从而进行有效的特征选择。文中还探讨了基于随机森林的降维方法与其他传统降维技术的区别,指出前者更具直观性可解释性。此外,提供了具体的代码实例,演示了从数据准备、模型训练到特征重要性评估的完整流程,以及如何设定阈值筛选重要特征,优化模型性能。 适合人群:从事数据分析、机器学习的研究人员技术爱好者,尤其是那些希望深入了解随机森林算法及其应用场景的人士。 使用场景及目标:适用于处理高维数据集时,希望通过特征选择降维来提升模型性能的情景。具体目标包括但不限于:识别最具影响力的特征,减少不必要的计算负担,增强模型的解释力预测精度。 其他说明:文章不仅提供了理论知识,还包括大量实用的代码片段,帮助读者快速上手实践。同时提醒注意特征之间的相关性可能会对重要性评分造成的影响,建议结合实际情况灵活调整参数设置。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值