我正在使用 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。谁能帮我解决这里的问题?
在调用
RFECV()
之前尝试添加以下内容:
np.random.seed(1)
你可以用你最喜欢的种子代替它,例如,
np.random.seed(12)
如果 12 是你最喜欢的种子。
一旦确定了种子,就不要更改种子并验证每次运行代码时确实可以重现相同的一组值。