当使用特征递归消除法(如 RFECV)选择最优特征子集时,如果每次运行产生的最优特征子集不同,这通常是因为模型训练过程中存在随机性(例如,在决策树和随机森林中的特征选择和分裂点选择,或者在交叉验证的数据划分中)。为了解决这个问题,使得特征选择过程更加稳定,您可以尝试以下几种方法:
-
设置随机种子:确保在模型训练和数据划分过程中设置固定的随机种子,以确保每次运行的结果一致。
-
增加交叉验证的折数:使用更多的交叉验证折数可以提高特征选择的稳定性,但也会增加计算时间。
-
使用稳定的模型:某些模型(如决策树)比其他模型(如逻辑回归)具有更高的随机性。尝试使用更稳定的模型可能会减少特征选择的变异性。
-
集成方法:可以通过多次运行特征选择过程并记录每个特征被选中的次数,然后选择那些被频繁选中的特征作为最终的特征集。
import pandas as pd import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.feature_selection import RFECV from sklearn.model_selection import StratifiedKFold # 假设 data 和 y 已经准备好 # data = pd.read_excel("./data/result_gen.xlsx") # y = data["PVT"] # del data["PVT"] # del data["编号"] # 设置随机种子 np.random.seed(42) # 创建一个决策树模型,设置随机种子(如果适用) estimator = DecisionTreeClassifier(random_state=42) # 创建一个带有更多折数的交叉验证生成器 cv = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) # 创建RFE选择器 selector = RFECV(estimator, step=1, scoring="accuracy", cv=cv) # 拟合数据 selector = selector.fit(data, y) # 输出选定的特征 print("Selected features:", data.columns[selector.support_]) # 输出特征排名 print("Feature ranking:", selector.ranking_)
在上述代码中,通过设置随机种子(
np.random.seed(42)
和random_state=42
)来确保每次运行的结果一致。此外,使用了StratifiedKFold
来进行更稳定的交叉验证,并设置了n_splits=10
来增加交叉验证的折数。这些改动有助于提高特征选择过程的稳定性。