递归特征消除与交叉验证

递归特征消除(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秒)

  • Jupyter笔记本:
  • Python源代码:
  • 压缩包:
  • 平衡模型复杂度和交叉验证分数
  • 自定义带有交叉验证的网格搜索的重新拟合策略
  • 管道ANOVA SVM
  • 事后调整决策函数的截止点
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485