为什么我在python中的sklearn中使用管道获取不同的值而没有管道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我在python中的sklearn中使用管道获取不同的值而没有管道相关的知识,希望对你有一定的参考价值。

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

我的管道代码如下。

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

即使两种方法的概念相似,我也会得到不同的结果和不同的选择特征(如结果部分所示)。但是,我得到相同的超参数值。

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

如果需要,我很乐意提供更多细节。

答案

在带管道的情况下,

在将RFECV应用于最终估计器之前,使用基本模型(RandomForestClassifier(random_state = 42, class_weight="balanced"))执行特征选择(grid_searchCV)。

在没有管道的情况下,

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

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

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

为啥我在 Sklearn 管道中的 OneHotEncoding 后得到的列比预期的多?

如何在 python 中的 sklearn 中的不同管道中获取特征名称

logit 和 sklearn 管道的一种热编码

Python,sklearn:使用 MinMaxScaler 和 SVC 的管道操作顺序

将多个预处理步骤应用于 sklearn 管道中的列