sklearn学习——递归特征消除法(RFE)

sklearn学习——递归特征消除法(RFE)

1 作用

  1. 消除特征之间的冗余,选取最优特征组合。
  2. 降低特征维数。

2 步骤

  1. 将筛选的k个特征作为初始特征子集输入到随机森林分类器中,计算得到每个特征的重要性,并利用交叉验证方法得到初始特征子集的分类精度;
  2. 从当前特征子集中移除特征重要性最低的一个特征,得到一个新的特征子集,再次输入到随机森林分类器中,计算新的特征子集中每个特征的重要性,并利用交叉验证方法得到新的特征子集的分类精度。
  3. 递归的重复步骤2,直至特征子集为空,最后一共得到k个不同特征数量的特征子集,选择分类精度最高的特征子集作为最优特征组合

3 数据

WFs1

4 代码实现

import pandas as pd
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import RFECV
from sklearn.feature_selection import RFE
# 1.读取训练数据集
data = pd.read_csv(r"WFs1.csv")
X = data.iloc[:, 1:]
Y = data.iloc[:, 0]
print(X.shape)

# 1.标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X)

# 2.构建RF模型
RFC_ = RFC()                               # 随机森林
c = RFC_.fit(X, Y).feature_importances_    # 特征重要性
print("重要性:")
print(c)

# 3. 交叉验证递归特征消除法
selector = RFECV(RFC_, step=1, cv=10)       # 采用交叉验证,每次排除一个特征,筛选出最优特征
selector = selector.fit(X, Y)
X_wrapper = selector.transform(X)          # 最优特征
score =cross_val_score(RFC_ , X_wrapper, Y, cv=10).mean()   # 最优特征分类结果
print(score)
print("最佳数量和排序")
print(selector.support_)                                    # 选取结果
print(selector.n_features_)                                 # 选取特征数量
print(selector.ranking_)                                    # 依次排数特征排序


# 4.递归特征消除法
selector1 = RFE(RFC_, n_features_to_select=3, step=1).fit(X, Y)       # n_features_to_select表示筛选最终特征数量,step表示每次排除一个特征
selector1.support_.sum()
print(selector1.ranking_)                                             # 特征排除排序
print(selector1.n_features_)                                          # 选择特征数量
X_wrapper1 = selector1.transform(X)                                   # 最优特征
score =cross_val_score(RFC_, X_wrapper1, Y, cv=9).mean()
print(score)

# 5.递归特征消除法和曲线图选取最优特征数量
score = []                                                            # 建立列表
for i in range(1, 8, 1):
    X_wrapper = RFE(RFC_, n_features_to_select=i, step=1).fit_transform(X, Y)    # 最优特征
    once = cross_val_score(RFC_, X_wrapper, Y, cv=9).mean()                      # 交叉验证
    score.append(once)                                                           # 交叉验证结果保存到列表
print(max(score), (score.index(max(score))*1)+1)                                 # 输出最优分类结果和对应的特征数量
print(score)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 8, 1), score)
plt.xticks(range(1, 8, 1))
plt.show()








5 结果

在这里插入图片描述

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值