RFE递归式特征消除
RFE递归式特征消除
1 声明
本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。
2 RFE递归式特征消除简介
RFE(Recursive Feature Elimination)是特征选择的算法.它的工作原理是从训练数据集中的所有特征开始搜索特征子集,并成功地删除特征,直到保留所需的数量。这是通过对给定的算法模型进行拟合,按重要性对特征进行排序,丢弃最不重要的特征,并重新拟合模型来实现的。这个过程不断重复,直到特定数量的特征被保留下来。RFE的执行过程如下:
- 初始的特征集为所有可用的特征。
- 使用当前特征集进行建模,然后计算每个特征的重要性。
- 删除最不重要的一个(或多个)特征,更新特征集。
- 跳转到步骤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(反向特征消除)进行数据降维
1 直接使用skl库即可 skl含有的rfe库可以直接以多个变量为目标进行数据降维(主要特征提取),该代码源于2020年华为杯数模比赛b题,项目代码以及数据见:https://github.com/x ...
- 利用多项式特征生成与递归特征消除解决特征组合与特征选择问题
目录 项目背景 技术栈 实现 数据 代码 总结 项目背景 无论是对于什么数据都存在两个非常经典的问题:问题一是,数据与标签之间,数据与数据之间的一些实际关系很难搞清楚.有些时候特征A,特征B可能都与标 ...
- 使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法
在caret(short for classification and regression training)包中有多个函数可以实现特征选择,总的分为封装法和过滤法.封装法,将特征选择过程与训练过程 ...
- python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...
引言 基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种python封装的经典特征降维方法,递归特征消除(RFE)与极限树(Extra-Trees, ET).其中,RFE整合了两种不同的超参数, ...
- R语言基于递归特征消除RFE(Recursive Feature Elimination)进行特征筛选(feature selection)
R语言基于递归特征消除RFE(Recursive Feature Elimination)进行特征筛选(feature selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可 ...
- 使用RFECV、递归特征消除 (Recursive Feature Elimination)进行特征筛选详解及实战
使用RFECV.递归特征消除 (Recursive Feature Elimination)进行特征筛选详解及实战 包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征. 所 ...
- 特征选择之支持向量机递归特征消除(SVM-RFE)
支持向量机递归特征消除(下文简称SVM-RFE)是由Guyon等人在对癌症分类时提出来的,最初只能对两类数据进行特征提取.它是一种基于Embedded方法. 支持向量机 支持向量机广泛用于模式识别,机 ...
- R语言使用caret包的rfe函数进行特征筛选、选择、特征消除RFE(Recursive Feature Elimination)进行特征筛选(feature selection)
R语言使用caret包的rfe函数进行特征筛选.选择.特征消除RFE(Recursive Feature Elimination)进行特征筛选(feature selection) 目录
- 递归特征消除和K折交叉验证(以决策树回归为例)
与特征选择不同的是递归特征消除后不会输出权值 导入相应模块 import matplotlib.pyplot as plt import numpy as np import pandas as pd ...
最新文章
- 无法量产自动驾驶汽车的企业,与谷歌公司差在哪儿
- mysql如何提高其查询速度的方法
- 数据表格搜索php代码_手把手教学:提取PDF各种表格文本数据(附代码)
- com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围
- Java操作Kafka创建Topic、Producer、Consumer
- 菜鸟学习数据科学家 5 大误区
- springboot接收浏览器发送delete请求( method not allowed 405解决方法)
- Nginx + PHP(php-fpm)遇到的502 Bad Gateway错误
- 关于ssm框架的整理(三) 2021-05-11
- java unicode32_【JAVA SE基础篇】32.String类入门
- php无线级输出数据,thinkphp5.0无限极分类及格式化输出
- 游戏开发之C++类中的static、const梳理总结(C++基础)
- mysql的skip-slave-start参数
- 《学习之道》第二章专注思维和发散思维
- 软件资格证考试——初级程序员
- U3D游戏开发工程师正确入行姿势指南
- Linux——(1)基本命令
- python tk checkbutton_Python tkinter之CheckButton(多选框)
- Jeecg-Boot简介
- Node-RED使用指南:22:定制化Node的使用方法