为啥我在 python 的 sklearn 中使用管道和没有管道得到不同的值

Posted

技术标签:

【中文标题】为啥我在 python 的 sklearn 中使用管道和没有管道得到不同的值【英文标题】:Why do I get different values with pipline and without pipline in sklearn in python为什么我在 python 的 sklearn 中使用管道和没有管道得到不同的值 【发布时间】:2019-09-04 09:26:51 【问题描述】:

我正在使用recursive feature elimination with cross-validation (rfecv)GridSearchCVRandomForest 分类器,如下使用管道不使用管道

我的代码with pipeline如下。

X = df[my_features_all]
y = df['gold_standard']

#get development and testing sets
x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=0)

from sklearn.pipeline import Pipeline

#cross validation setting
k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
#this is the classifier used for feature selection
clf_featr_sele = RandomForestClassifier(random_state = 42, class_weight="balanced")
rfecv = RFECV(estimator=clf_featr_sele, step=1, cv=k_fold, scoring='roc_auc')

param_grid = 'n_estimators': [200, 500],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [3,4,5]
    

#you can have different classifier for your final classifier
clf = RandomForestClassifier(random_state = 42, class_weight="balanced")
CV_rfc = GridSearchCV(estimator=clf, param_grid=param_grid, cv= k_fold, scoring = 'roc_auc', verbose=10, n_jobs = 5)

pipeline  = Pipeline([('feature_sele',rfecv),('clf_cv',CV_rfc)])

pipeline.fit(x_train, y_train)

结果是(有管道):

Optimal features: 29
Best hyperparameters: 'max_depth': 3, 'max_features': 'auto', 'n_estimators': 500
Best score: 0.714763

我的代码没有管道如下。

X = df[my_features_all]
y = df['gold_standard']

#get development and testing sets
x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=0)

#cross validation setting
k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)

clf = RandomForestClassifier(random_state = 42, class_weight="balanced")

rfecv = RFECV(estimator=clf, step=1, cv=k_fold, scoring='roc_auc')

param_grid = 'estimator__n_estimators': [200, 500],
    'estimator__max_features': ['auto', 'sqrt', 'log2'],
    'estimator__max_depth' : [3,4,5]
    

CV_rfc = GridSearchCV(estimator=rfecv, param_grid=param_grid, cv= k_fold, scoring = 'roc_auc', verbose=10, n_jobs = 5)
CV_rfc.fit(x_train, y_train)

结果是(没有管道):

Optimal features: 4
Best hyperparameters: 'max_depth': 3, 'max_features': 'auto', 'n_estimators': 500
Best score: 0.756835

尽管这两种方法的概念相似,但我得到了不同的结果不同的选定特征(如上面结果部分所示)。但是,我得到了相同的超参数值。

我只是想知道为什么会发生这种差异。哪种方法(不使用管道使用管道?)最适合执行上述任务?

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

【参考方案1】:

在管道案例中,

特征选择 (RFECV) 是使用基础模型 (RandomForestClassifier(random_state = 42, class_weight="balanced")) 在最终估计器上应用 grid_searchCV 之前进行的。

在没有管道的情况下,

对于每个超参数组合,对应的估计器用于特征选择(RFECV)。因此,这会很耗时。

【讨论】:

非常感谢您的出色回答。我真的很感激:)

以上是关于为啥我在 python 的 sklearn 中使用管道和没有管道得到不同的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 python 中获取 sklearn 中的***谓词的结果不同?

我在 python 中使用 sklearn 进行文本分类的管道配置

当我使用较小的浮点数时,为啥 sklearn 中的 KNN 实现会变慢?

为啥 auc 与 sklearn 和 R 的逻辑回归如此不同

为啥我自己的逻辑回归实现与 sklearn 不同?

为啥 sklearn Imputer 需要适配?