注意
转到结尾 下载完整的示例代码。或通过JupyterLite或Binder在浏览器中运行此示例
带交叉验证的递归特征消除#
一个使用交叉验证自动调整所选特征数量的递归特征消除 (RFE) 示例。
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
数据生成#
我们使用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对象并计算交叉验证分数。“准确率”评分策略优化了正确分类样本的比例。
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold
min_features_to_select = 1 # Minimum number of features to consider
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_}")
Optimal number of features: 3
在本例中,发现具有3个特征的模型(对应于真实的生成模型)是最优的。
特征数量与交叉验证分数的关系图#
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 \nwith correlated features")
plt.show()
从上图可以进一步注意到,对于3到5个选定特征,存在等效分数的平台期(相似的平均值和重叠误差条)。这是引入相关特征的结果。事实上,根据交叉验证技术,RFE选择的最佳模型可能在此范围内。超过5个选定特征后,测试准确率下降,即保留非信息特征会导致过拟合,因此不利于模型的统计性能。
脚本总运行时间:(0分钟0.523秒)
相关示例
平衡模型复杂度和交叉验证分数
使用交叉验证的网格搜索的自定义重拟合策略
流水线方差分析 SVM
事后调整决策函数的截止点