R语言 使用 rfe(反向特征消除) 进行特征筛选,数据降维代码

使用caret包中的rfe实现

library(caret)
library(randomForest)


# 参数
data.class_path <- 'D:\\Merged31.csv'  # 输入文件路径
save_path <- 'D:\\Merged31_select.csv'  # 输出文件路径
label_name <- 'Class.name.0.0.'  # 标签列名
label_delete <- 'unclassified'  # 要忽略的标签
rfe_sizes <- c(1:25,30,35,40,45,50,55,60,65,75)  # 可供选择的保留特征数量

# 读取数据
data<-read.csv(data.class_path, sep = ';', header = TRUE)
# 去除未分类行
data.class<-data[data[label_name] != label_delete,]
# 将标签类型转换为数
data.class[,label_name] <- as.numeric(data.class[,label_name])

# 分割训练集和测试集
set.seed(1)
ind<-sample(2, nrow(data.class), replace = TRUE, prob = c(0.7,0.3))
training<-data.class[ind==1,]
testing<-data.class[ind==2,]
len=length(training)

# 反向特征消除RFE
rfecontrol<-rfeControl(functions=rfFuncs, method="cv", number=10)
y<-as.numeric(training[,label_name])
X<-training[,-which(names(training) == label_name)]
results<-rfe(X,y,sizes=rfe_sizes,rfeControl=rfecontrol)
print(results)
# 显示选出的特征
print(results$optVariables)
# 绘图
plot(results, type=c("g", "o"))

# 导出结果
write.csv(data[c(results$optVariables, label_name)], save_path)
cat('Result Save in', save_path)

在这里插入图片描述

附录(Python中的RFE)

Python 中的 sklearn.feature_selection.RFE 没有R语言中的rfe那么完善, 主要是无法自动筛选特征数量, 也无法自动进行n折交叉验证。因此在选出相同数量的参数的前提下, 选出的参数与R得到的结果并不相同。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入RFE方法和线性回归基模型
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVC

# 参数
n_select = 16  # 选择的特征数
data_path = r'D:\Merged31.csv'  # 输入文件路径
label_name = 'Class name(0 0)'  # 标签名称
label_delete = 'unclassified'  # 要忽略的标签
# estimator = LinearRegression()
# estimator = Ridge()
# estimator = Lasso(alpha=0.1)
# estimator = SVC(kernel="linear")
estimator = RandomForestRegressor()

np.random.seed(0)

# 读取数据
data = pd.read_csv(data_path, sep=';', header=0)
if label_delete:
    data = data[data[label_name] != label_delete].astype(float)

y = data[label_name]
X = data.drop([label_name], axis=1)
feature_names = X.columns.values

# 特征选择
X = (X - X.mean()) / (X.std() + 1e-8)  # 标准化
rfe = RFE(
    estimator=estimator,  # 基模型
    n_features_to_select=n_select,  # 选择特征数
)
sFeature = rfe.fit_transform(X, y)
print('Model Error:', rfe.score(X, y))

# 显示线性回归结果
plt.figure(figsize=(10, 8))
plt.scatter(X.iloc[:, 0], y, color='black')
plt.plot(X.iloc[:, 0], rfe.predict(X), color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
# 显示特征选择结果
plt.figure(figsize=(10, 8))
plt.bar(range(len(feature_names)), rfe.ranking_, color='b', align='center')
plt.xticks(range(len(feature_names)), feature_names, rotation=90)
plt.xlim([-1, len(feature_names)])
plt.show()

# 保存选择的特征
feature_names = feature_names[rfe.get_support()]
print('选择的特征为:', feature_names)
feature_names = np.append(feature_names, label_name)
save_path = data_path[:-4] + '_select.csv'
data[feature_names].to_csv(save_path, sep=',', index=False)

pass

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值