特征选择之递归特征消除(REF)
系列文章目录
第一章 特征选择之相关性分析
第二章 特征选择之卡方检验
第三章特征选择之递归特征消除(REF)
文章目录
系列文章目录
前言
一、REF是什么?
包装方法
二、REF原理以及分析
三、使用自有数据集的代码实现
1、代码
2、输出结果
3、绘制柱状图直观展示
(1)代码
(2)效果图
4、绘制标记图直观展示
(1)代码
(2)效果图
五、绘制不同特征数量下的模型性能曲线
1、作用 :
2、代码
3、效果图
六、使用在线公有数据集代码操作
1、代码
2、输出结果
总结
前言
特征选择是机器学习中非常重要的一步,它有助于提高模型的性能、降低过拟合风险、减少计算成本等。在众多特征选择方法中,递归特征消除(Recursive Feature Elimination,简称REF)是一种被广泛应用的方法。
一、REF是什么?
REF是一种包装方法,通过递归地训练模型,并在每一轮中消除对模型性能贡献较小的特征,从而逐步精炼特征集合。这种迭代的方式能够帮助我们找到对模型预测最有贡献的特征,简化模型的复杂度,提高模型的泛化能力。
包装方法
包装方法通过将特征选择过程与某个具体的机器学习算法结合起来来评估特征的优劣。它通过训练一个模型,评估每一组特征的表现,从而选择最优的特征子集。由于包装方法依赖于机器学习模型,它通常计算量较大,适用于特征维度较小的情况。
二、REF原理以及分析
1、原理
递归地从模型中移除不重要的特征,直到达到指定的特征数量。
2、分析
被 RFE 选中的特征可认为是相对有效的特征。
三、使用自有数据集的代码实现
1、代码
import matplotlib
matplotlib.use('TkAgg')
import pandas as pd
import numpy as np
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取文件
df = pd.read_excel('C:/Users/LENOVO/Desktop/单因素.xlsx')
# 确定特征和目标变量,排除住院号列
target_column = '结局'
X = df.drop(columns=['住院号', target_column])
y = df[target_column]
# 对特征数据进行缩放
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 使用 Logistic Regression 模型进行 RFE 特征选择
model = LogisticRegression(max_iter=1000,)
# 这里假设根据实际情况选择 2 个特征,你可以根据需要调整
rfe = RFE(estimator=model, n_features_to_select=6)
X_rfe = rfe.fit_transform(X_scaled, y)
# 训练模型并评估
X_train, X_test, y_train, y_test = train_test_split(X_rfe, y, test_size=0.2, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Accuracy with selected features: {accuracy_score(y_test, y_pred)}")
# 查看哪些特征被选中
selected_features = [X.columns[i] for i in range(len(X.columns)) if rfe.support_[i]]
print("Selected features:", selected_features)
2、输出结果
重要性程度越靠后越高,CEA最高
3、绘制柱状图直观展示
(1)代码
在前代码的基础上添加
plt.figure(figsize=(10, 6))
plt.bar(feature_names, feature_ranking)
plt.xlabel('Features')
plt.ylabel('Ranking')
plt.title('RFE Feature Ranking')
plt.xticks(rotation=45)
plt.show()
(2)效果图
在 RFE 中,排名数值越低代表特征越重要,那么柱状图中柱子越低的特征就越重要。在这种情况下,柱子高度反映的是特征的排名顺序,高度最低的柱子对应的特征在模型中对预测目标变量的贡献最大,是最关键的特征。
4、绘制标记图直观展示
(1)代码
在前代码的基础上添加
# 获取特征选择结果
selected_features = rfe.support_
feature_names = X.columns
# 绘制标记图
plt.figure(figsize=(10, 2))
plt.bar(feature_names, selected_features, color=['green' if s else 'red' for s in selected_features])
plt.xlabel('Features')
plt.ylabel('Selected')
plt.title('RFE Feature Selection Result')
plt.xticks(rotation=45)
plt.show()
(2)效果图
可以用简单的标记图来直观地展示哪些特征被选中。
五、绘制不同特征数量下的模型性能曲线
1、作用 :
不同特征数量下的性能评估,可以根据模型的准确率,来判断选择几个特征能够使模型比较稳定
2、代码
import matplotlib
matplotlib.use('TkAgg')
import pandas as pd
import numpy as np
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 读取文件
df = pd.read_excel('C:/Users/LENOVO/Desktop/单因素.xlsx')
# 确定特征和目标变量,排除住院号列
target_column = '结局'
X = df.drop(columns=['住院号', target_column])
y = df[target_column]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
feature_sizes = np.arange(1, X.shape[1] + 1)
accuracies = []
for n_features in feature_sizes:
model = LogisticRegression(max_iter=200)
rfe = RFE(estimator=model, n_features_to_select=n_features)
X_train_rfe = rfe.fit_transform(X_train, y_train)
X_test_rfe = rfe.transform(X_test)
model.fit(X_train_rfe, y_train)
y_pred = model.predict(X_test_rfe)
accuracy = accuracy_score(y_test, y_pred)
accuracies.append(accuracy)
# 绘制性能曲线
plt.figure(figsize=(10, 6))
plt.plot(feature_sizes, accuracies, marker='o')
plt.xlabel('Number of Selected Features')
plt.ylabel('Accuracy')
plt.title('Model Accuracy vs Number of Selected Features')
plt.xticks(feature_sizes)
plt.grid(True)
plt.show()
3、效果图
当特征数量为 2、3、4 时,模型的准确率能稳定在约 0.835 的水平,这个准确率在当前模型评估中相对较高。
因此,可以通过该方法提前确定好选择几个特征数量,可以保证模型稳定,然后再通过柱状图或者标记图来确定是哪几个特征。
六、使用在线公有数据集代码操作
其他如柱状图、标记图同样用法。
1、代码
#导入必要的库
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#加载数据集
data=load_iris()
X=pd.DataFrame(data.data,columns=data.feature_names)
y=pd.Series(data.target)
#使用Logistic Regression模型进行RFE特征选择
model=LogisticRegression(max_iter=200)
rfe=RFE(estimator=model,n_features_to_select=2)#选择两个特征
X_rfe=rfe.fit_transform(X,y)
#训练模型并评估
X_train,X_test,y_train,y_test=train_test_split(X_rfe,y,test_size=0.2,random_state=42)
model.fit(X_train,y_train)
y_pred=model.predict(X_test)
print(f"Accuracy with selected features:{accuracy_score(y_test,y_pred)}")
# 查看哪些特征被选中
selected_features = [data.feature_names[i] for i in range(len(data.feature_names)) if rfe.support_[i]]
print("Selected features:", selected_features)
2、输出结果
总结
递归特征消除(Recursive Feature Elimination,REF)是一种基于模型的特征选择方法,通过反复训练模型并消除对模型预测性能影响较小的特征来选择最佳特征子集。REF的总结如下:
-
工作原理:REF通过以下步骤进行特征选择:
-
在初始训练数据集上训练模型,并对特征进行排序或打分。
-
消除排名靠后的特征,重新训练模型,评估模型的性能。
-
迭代上述过程,直到满足设定的停止条件(如剩余特征数或性能阈值)。
-
-
优点:
-
在特征数量较大的情况下,REF可以帮助减少维度,提高模型效率和泛化能力。
-
REF结合了特征排序和模型选择,能够在保持模型性能的同时进行特征选择。
-
-
缺点:
-
REF的计算开销相对较大,因为需要多次训练模型。
-
REF的性能高度依赖于所选择的模型,选择不合适的模型可能导致特征选择结果不准确。
-
-
实现方法:REF可以使用各种机器学习模型实现,如线性回归、逻辑回归、支持向量机等。在Python中,可使用
sklearn.feature_selection.RFE
模块实现REF。 -
应用场景:
-
当数据集中包含大量特征时,REF可以帮助提高模型的性能和泛化能力。
-
REF适用于各种机器学习任务,如分类、回归等。
-
总的来说,递归特征消除是一种有效的特征选择技术,可在保持模型性能的同时降低维度和提高模型泛化能力。在实际应用中,根据数据集和模型的特点选择合适的特征选择方法是至关重要的。