为什么我的 grid_scores_ 来自 RFECV,与具有来自 RFECV 的最佳特征的相同交叉验证模型的分数不同?

问题描述 投票:0回答:1

我正在使用 sklearn 的 RFECV 来为我的分类问题找到最佳特征集。我的 X 具有 217 个数字特征,用于二进制标签 y。我像这样确定最佳特征集:

min_features_to_select = 3  
cv = RepeatedStratifiedKFold(n_splits=2, n_repeats=50, random_state=1)
model = LogisticRegression(penalty='l1', solver="liblinear")
rfecv = RFECV(estimator=model, step=1, cv=cv,
                  scoring="roc_auc", min_features_to_select=min_features_to_select)

rfecv.fit(X, y)

为了可视化 rfecv 过程,我根据 RFECV 的网格分数绘制了特征数量的范围

plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score (nb of correct classifications)")
plt.plot(range(min_features_to_select, len(rfecv.grid_scores_) + min_features_to_select), rfecv.grid_scores_)
plt.show()

refcv_supp = rfecv.get_support()
optimal_features = list(features[refcv_supp])

看起来像这样:

RFECV 的所有特征子集的 grid_scores 位于 0.660 左右。我将这个分数作为 RFECV 中使用的模型的性能,每组特定的特征,由 roc_auc 表示。

现在,当我分离出最佳特征集,并将其输入完全相同的交叉验证模型时,性能看起来完全不像图中描述的分数......

refcv_supp = rfecv.get_support()
optimal_features = list(features[refcv_supp])
X = X.loc[:,np.array(optimal_features)]

model = LogisticRegression(penalty='l1', solver="liblinear")
cv = RepeatedStratifiedKFold(n_splits=2, n_repeats=100, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='roc_auc', cv=cv, n_jobs=-1, error_score='raise')

score = np.mean(n_scores)
std = np.std(n_scores)

这导致平均 roc_auc 为 0.896,std 为 0.046。谁能帮我解决这里的问题?

python scikit-learn classification logistic-regression rfe
1个回答
0
投票

在调用

RFECV()
之前尝试添加以下内容:

np.random.seed(1)    

你可以用你最喜欢的种子代替它,例如,

np.random.seed(12)
如果 12 是你最喜欢的种子。

一旦确定了种子,就不要更改种子并验证每次运行代码时确实可以重现相同的一组值。

© www.soinside.com 2019 - 2024. All rights reserved.