递归特征消除(Recursive Feature Elimination, RFE)是一种特征选择方法,它通过递归减少特征数量来寻找最优的特征子集。在本例中,将使用交叉验证来自动调整所选特征的数量,以优化模型的准确率。
构建了一个分类任务,该任务使用了3个信息特征。引入2个额外的冗余(即相关)特征,使得所选特征会根据交叉验证的折数而变化。其余特征是非信息性的,因为它们是随机抽取的。
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=500, n_features=15, n_informative=3, n_redundant=2, n_repeated=0, n_classes=8, n_clusters_per_class=1, class_sep=0.8, random_state=0)
创建了RFE对象,并计算了交叉验证分数。评分策略“accuracy”优化了正确分类样本的比例。
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold
min_features_to_select = 1 # 考虑的最小特征数量
clf = LogisticRegression()
cv = StratifiedKFold(5)
rfecv = RFECV(estimator=clf, step=1, cv=cv, scoring="accuracy", min_features_to_select=min_features_to_select, n_jobs=2)
rfecv.fit(X, y)
print(f"Optimal number of features: {rfecv.n_features_}")
在当前情况下,模型发现3个特征(对应于真实的生成模型)是最优化的。
通过绘制图表,可以进一步注意到3到5个选定特征的等效分数平台(相似的均值和重叠的误差条)。这是引入相关特征的结果。实际上,RFE选择的最优模型可能在这个范围内,具体取决于交叉验证技术。当选择的特征超过5个时,测试准确率会下降,这是因为保留非信息性特征会导致过拟合并因此对模型的统计性能不利。
import matplotlib.pyplot as plt
import pandas as pd
cv_results = pd.DataFrame(rfecv.cv_results_)
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Mean test accuracy")
plt.errorbar(x=cv_results["n_features"], y=cv_results["mean_test_score"], yerr=cv_results["std_test_score"])
plt.title("Recursive Feature Elimination with correlated features")
plt.show()
(0分钟0.517秒)