【问题标题】:RFECV does not return same features for same dataRFECV 不会为相同的数据返回相同的特征
【发布时间】:2015-10-29 22:17:43
【问题描述】:

我有一个数据框 X,它由 60 个特征和约 45 万个结果组成。我的响应变量 y 是分类的(生存,没有生存)。

我想使用 RFECV 来减少 Xtrain 上我的估计器(现在是逻辑回归)的重要特征数量,我想在 ROC 曲线下获得准确度得分。 “所选功能”是所有功能的列表。

from sklearn.cross_validation import StratifiedKFold
from sklearn.feature_selection import RFECV
import sklearn.linear_model as lm

#  Create train and test datasets to evaluate each model
Xtrain, Xtest, ytrain, ytest = train_test_split(X,y,train_size = 0.70)
# Use RFECV to reduce features

#  Create a logistic regression estimator 
logreg = lm.LogisticRegression()

# Use RFECV to pick best features, using Stratified Kfold
rfecv =   RFECV(estimator=logreg, cv=StratifiedKFold(ytrain, 10), scoring='roc_auc')

# Fit the features to the response variable
X_new = rfecv.fit_transform(Xtrain[features_selected], ytrain)

我有几个问题:

a) X_new 在不同场合运行时返回不同的特征(一次它返回 5 个特征,另一次运行它返回 9 个。一个不是另一个的子集)。为什么会这样?

b) 这是否意味着一个不稳定的解决方案?虽然为 StratifiedKFold 使用相同的种子应该可以解决这个问题,但这是否意味着我需要重新考虑整个方法?

c) 一般来说,我该如何进行调优?例如,在我当前的实现中调整之前选择功能。调优会影响某些特性的重要性吗?还是我应该同时调音?

【问题讨论】:

  • a & b) 我敢打赌,如果您使用 LeaveOneOut CV,您将获得更稳定的结果 c) IMO 尝试两者,看看它如何影响 CV 分数。作为一般性评论,还有其他值得研究的特征选择方法。例如,查看我在stackoverflow.com/questions/29230019/… 的回答
  • @Ryan - 感谢您的帮助。我会检查LOOCV。关于您对问题 29230019 的回答,如果无法访问“功能重要性”,您有何建议?

标签: python scikit-learn


【解决方案1】:

在 k 折交叉验证中,原始样本被随机分成 k 个大小相等的子样本。因此,每次执行算法时得到不同的结果也就不足为奇了。 Source

有一种方法,即所谓的皮尔逊相关系数。使用这种方法,可以计算出每两个特征之间的a相关系数,目的是去除相关性高的特征。这种方法可以被认为是解决此类问题的稳定方法。 Source

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 2019-10-20
    • 2020-11-30
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多