RFE递归式特征消除

                                    RFE递归式特征消除

1 声明

本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。

2 RFE递归式特征消除简介

RFE(Recursive Feature Elimination)是特征选择的算法.它的工作原理是从训练数据集中的所有特征开始搜索特征子集,并成功地删除特征,直到保留所需的数量。这是通过对给定的算法模型进行拟合,按重要性对特征进行排序,丢弃最不重要的特征,并重新拟合模型来实现的。这个过程不断重复,直到特定数量的特征被保留下来。RFE的执行过程如下:

  1. 初始的特征集为所有可用的特征。
  2. 使用当前特征集进行建模,然后计算每个特征的重要性。
  3.  删除最不重要的一个(或多个)特征,更新特征集。
  4. 跳转到步骤2,直到完成所有特征的重要性评级。

3 RFE代码示例

import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
pd.options.display.max_columns = None
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.feature_selection import RFECV
data=pd.read_csv('../input/titanic.csv')
# 数据清洗,删除无用特征,axis=1是按照列操作。
data.drop(['Ticket', 'PassengerId'], axis=1, inplace=True)
# 分类变量转换,通过Dataframe的repalce结合字典映射。
gender_mapper = {'male': 0, 'female': 1}
data['Sex'].replace(gender_mapper, inplace=True)
#提取Title字段里的提取出称谓并做二值化转换。
data['Title'] = data['Name'].apply(lambda x: x.split(',')[1].strip().split(' ')[0])
data['Title'] = [0 if x in ['Mr.', 'Miss.', 'Mrs.'] else 1 for x in data['Title']]
data = data.rename(columns={'Title': 'Title_Unusual'})
data.drop('Name', axis=1, inplace=True)

data['Cabin_Known'] = [0 if str(x) == 'nan' else 1 for x in data['Cabin']]
data.drop('Cabin', axis=1, inplace=True)

#对Embarked字段进行One-Hot编码,生成哑变量
emb_dummies = pd.get_dummies(data['Embarked'], drop_first=True, prefix='Embarked')
data = pd.concat([data, emb_dummies], axis=1)
data.drop('Embarked', axis=1, inplace=True)
# 用均值填充age字段
data['Age'] = data['Age'].fillna(int(data['Age'].mean()))

# 删除相关性高的特征,当前数据集特征无强相关性,所以correlated_features集合为空。
correlated_features = set()
correlation_matrix = data.drop('Survived', axis=1).corr()

for i in range(len(correlation_matrix.columns)):
    for j in range(i):
        if abs(correlation_matrix.iloc[i, j]) > 0.8:
            colname = correlation_matrix.columns[i]
            correlated_features.add(colname)
data.drop(correlated_features)

#定义X(所有特征)和Target、y(目标变量)
X = data.drop('Survived', axis=1)
target = data['Survived']
# random_state=101,随机种子,为了数据的可再现。
rfc = RandomForestClassifier(random_state=101)
'''
estimator:某个模型实例,这里用的是随机森林
step:每次迭代时要删除的特征个数
cv:交叉验证,用StratifiedKFold并指定K是10
scoring:指定优化时的度量方法,这里选择是'accuracy',精确度。

'''
rfecv = RFECV(estimator=rfc, step=1, cv=StratifiedKFold(10), scoring='accuracy')
rfecv.fit(X, target)
#
print('优化后的特征个数是: {}'.format(rfecv.n_features_))

#调用grid_scores_画图。
plt.figure(figsize=(16, 9))
plt.title('RFE_交叉验证', fontsize=18, fontweight='bold', pad=20)
plt.xlabel('被选择的特征', fontsize=14, labelpad=20)
plt.ylabel('% 选择的分类数', fontsize=14, labelpad=20)
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_, color='#303F9F', linewidth=3)
plt.show()

4 总结

### 如何使用RFE递归特征消除解决回归问题 在处理回归问题时,递归特征消除RFE)是一种有效的特征选择方法。通过逐步移除不重要的特征并重新构建模型来评估剩余特征的重要性,最终保留最重要的几个特征。 #### RFE工作原理概述 RFE的核心思想是从原始特征集合出发,在每次迭代过程中去除权重最小的特征,并重复此过程直到达到预定数量的重要特征[^1]。 #### 实现代码示例 下面展示了如何使用`sklearn`中的`RFE`类结合支持向量机回归器(SVR)来进行特征选择: ```python from sklearn.datasets import make_friedman1 from sklearn.feature_selection import RFE from sklearn.svm import SVR # 创建模拟数据集 X, y = make_friedman1(n_samples=50, n_features=10, random_state=123) # 初始化SVR模型作为估计器 clf = SVR(kernel="linear") # 设置要选择的特征数目以及每轮淘汰的比例 rfe = RFE(estimator=clf, n_features_to_select=5, step=1) # 训练RFE对象 rfe.fit(X, y) # 输出被选中特征的位置和排名情况 print("Selected features:", rfe.support_) print("Feature ranking:", rfe.ranking_) # 获取转换后的特征矩阵 X_selected = rfe.transform(X) ``` 这段代码创建了一个线性核的支持向量回归器实例,并将其传递给`RFE`构造函数;接着指定了希望选出多少个最重要特征(`n_features_to_select`)及每次迭代应删除多少比例的特征(`step`);最后调用了`.fit()`方法完成训练,并打印出了各个特征的选择状态和支持度得分[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShenLiang2025

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值