特征工程之嵌入式 随机森林度量各指标的重要性(原理+Python代码)

本文介绍了嵌入式特征筛选方法在数据挖掘中的应用,特别是使用随机森林进行特征选择。文章详细阐述了随机森林的原理,以Gini指数衡量特征重要性,并提供了代码实现和结果解读。在随机森林中,特征的Gini指数越小,表明其重要性越大。通过设定阈值,可以筛选出关键特征。

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

数据来源于天池赛题:零基础入门数据挖掘 - 二手车交易价格预测
地址:https://tianchi.aliyun.com/competition/entrance/231784/introduction?spm=5176.12281957.1004.1.38b02448ausjSX

一、原理介绍

在数据挖掘中,特征工程往往是最为重要也是耗时最长的一个环节。特征工程包括了特征构造、特征筛选、特征降维几大部分。特征的好坏往往直接决定着模型的精度。嵌入式(embedding)是一种代表性的特征筛选方法。该方法结合了过滤式和包裹式,通过学习器训练,自动进行了特征选择。

下面将以随机森林对特征进行筛选。

随机森林是以决策树作为的基分类器,CART是一种典型的二叉树。在构建CART决策树过程中,以Gini指数最小的属性来作为最优划分属性。Gini指数也叫节点不纯度减少平均值,特征的Gini指数越小,说明该特征就越重要。Gini指数作为CART算法的分区准则,在决策树的每个内部结点上选择属性。其计算公式为:
G i n i ( S ) = 1 − ∑ i = 0 c − 1 p i 2 Gini(S)=1-\sum_{i=0}^{c-1}p_{i}^{2} Gini(S)=1i=0c1pi2

公式中S表示数据集,C是类,S是属于类的样本数, p i = s i S p_{i}=\frac{s_{i}}{S} pi=Ssi 是类C在集中的相对频度。

二、代码实现

#加载需要的模块
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
#导入数据
data = pd.read_csv('F:/data/used_car_train_20200313.csv', sep=' ') #sep=' '表示原数据是以空格分隔
data=data[0:100] #由于数据量较大,这里只取前100行
data.columns #查看列名
data=data.dropna(axis=0, how='any') #删除存在缺失值的行,使用参数axis = 0;删除列的参数axis = 1
data.replace("-", "1", inplace=True) #对异常值进行替换
#划分自变量与目标变量
X = data.drop(['SaleID','name','regDate','price','seller','offerType'],axis=1) #从数据集中删除目标变量和与建模不相关的变量
Y = data["price"]
#基于随机森林度量各个变量的重要性
clf = RandomForestClassifier()
clf = clf.fit(X,y)
c=clf.feature_importances_
c
std = np.std([tree.feature_importances_ for tree in clf.estimators_],
             axis=0)
indices = np.argsort(c)[::-1]
#对变量重要性画图,并依次降序排列
plt.figure()
plt.title("Feature importances")
plt.bar(range(X.shape[1]), c[indices],
       color="r", yerr=std[indices], align="center")
plt.xticks(range(X.shape[1]), indices)
plt.xlim([-1, X.shape[1]])
plt.show()

在这里插入图片描述

X.columns #这里通过显示列名,便于后面对照特征编号对应的特征名

三、结果解读

  • 从上面的图片可以看出,排序为23的特征最重要,排序为5的特征最不重要(注意Python默认是从位置0开始计算)。
  • 通过人为设定阈值=0.05(根据不同的需求也可以设置为其它值),筛选出特征 v_12v_10v_9v_11
### 关于机器学习随机森林算法进行特征选择的方法和技巧 #### 特征重要性评估 随机森林通过计算每个特征重要性来辅助特征选择。特征重要性度量基于模型训练过程中节点分裂时所使用的特征及其对目标变量的影响程度。对于每一个决策树而言,当某个特定属性被用于分割数据集时,该属性有助于减少不纯度(如基尼系数或熵),从而提高整体模型准确性。 - **平均精确率降低 (MDA)**:此方法衡量移除某一输入特征后模型性能下降的程度。如果删除某特征使得预测误差显著增加,则说明这个特征具有较高的价值[^2]。 - **均方误差(MSE) 或者 Gini 不纯度变化**:这是另一种常见的评价方式,它统计每棵树内部由于引入不同维度所带来的总的信息增益大小,并取所有树木上的平均值得到最终得分[^1]。 ```python from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier data = load_iris() X, y = data.data, data.target rf_model = RandomForestClassifier(n_estimators=100) rf_model.fit(X, y) importances = rf_model.feature_importances_ print(importances) ``` #### 递归消除法(Recursive Feature Elimination,RFE) RFE 是一种常用的特征筛选技术,尤其适合像随机森林这样的黑盒型分类器/回归器。这种方法会反复构建模型并选出最佳的(或最差的)特征子集;然后丢弃那些较差的选择直到达到预定数量为止。这不仅能够帮助识别哪些因素最为关键,还可以简化后续建模过程中的工作流程。 ```python from sklearn.feature_selection import RFE selector = RFE(estimator=rf_model, n_features_to_select=2, step=1) selector = selector.fit(X, y) ranking = selector.ranking_ print(ranking) ``` #### 嵌入式方法 Embedded Methods 嵌入式方法是在构建模型的同时完成特征选择的过程。这类方法通常会在损失函数里加入正则项以惩罚过多不必要的参数组合,进而促使优化求解倾向于保留更少却更有解释力的自变量集合。Lasso 和 ElasticNet 就是两个典型例子,不过这里主要讨论的是如何利用随机森林本身来进行此类操作——即调整 `max_features` 参数控制每次切分考虑的最大特征数目,以此间接影响哪些特征会被频繁选用参与决策逻辑的设计当中去。 ```python rf_embedded = RandomForestClassifier(max_features='sqrt') rf_embedded.fit(X, y) embedded_importance = rf_embedded.feature_importances_ print(embedded_importance) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值