python - 从 GridSearchCV 中为 cross_val_predict 提取最佳管道

标签 python machine-learning scikit-learn grid-search

如何从合适的 GridSearchCV 中提取最佳管道,以便将其传递给 cross_val_predict

直接传递适合的GridSearchCV对象导致cross_val_predict再次运行整个网格搜索,我只想让最好的pipeline受制于cross_val_predict 评估。

我的独立代码如下:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import StratifiedKFold
from sklearn import metrics

# fetch data data
newsgroups = fetch_20newsgroups(remove=('headers', 'footers', 'quotes'), categories=['comp.graphics', 'rec.sport.baseball', 'sci.med'])
X = newsgroups.data
y = newsgroups.target

# setup and run GridSearchCV
wordvect = TfidfVectorizer(analyzer='word', lowercase=True)
classifier = OneVsRestClassifier(SVC(kernel='linear', class_weight='balanced'))
pipeline = Pipeline([('vect', wordvect), ('classifier', classifier)])
scoring = 'f1_weighted'
parameters = {
            'vect__min_df': [1, 2],
            'vect__max_df': [0.8, 0.9],
            'classifier__estimator__C': [0.1, 1, 10]
            }
gs_clf = GridSearchCV(pipeline, parameters, n_jobs=8, scoring=scoring, verbose=1)
gs_clf = gs_clf.fit(X, y)

### outputs: Fitting 3 folds for each of 12 candidates, totalling 36 fits

# manually extract the best models from the grid search to re-build the pipeline
best_clf = gs_clf.best_estimator_.named_steps['classifier']
best_vectorizer = gs_clf.best_estimator_.named_steps['vect']
best_pipeline = Pipeline([('best_vectorizer', best_vectorizer), ('classifier', best_clf)])

# passing gs_clf here would run the grind search again inside cross_val_predict
y_predicted = cross_val_predict(pipeline, X, y)
print(metrics.classification_report(y, y_predicted, digits=3))

我目前正在做的是从 best_estimator_ 手动重建管道。但是我的管道通常有更多的步骤,例如 SVD 或 PCA,有时我会添加或删除步骤并重新运行网格搜索来探索数据。在下面手动重建管道时,必须始终重复此步骤,这很容易出错。

有没有办法直接从拟合 GridSearchCV 中提取最佳管道,以便我可以将其传递给 cross_val_predict

最佳答案

y_predicted = cross_val_predict(gs_clf.best_estimator_, X, y)

作品与返回:

Fitting 3 folds for each of 12 candidates, totalling 36 fits
[Parallel(n_jobs=4)]: Done  36 out of  36 | elapsed:   43.6s finished
             precision    recall  f1-score   support

          0      0.920     0.911     0.916       584
          1      0.894     0.943     0.918       597
          2      0.929     0.887     0.908       594

avg / total      0.914     0.914     0.914      1775

[编辑] 当我再次尝试仅传递 pipeline(原始管道)的代码时,它返回相同的输出(传递 best_pipeline 也是如此)。因此,您可以只使用管道本身,但我并不是 100% 同意这一点。

关于python - 从 GridSearchCV 中为 cross_val_predict 提取最佳管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45151043/

相关文章:

python - 扩展 Cython 类时,__cinit__() 恰好需要 2 个位置参数

c# - 为什么在使用 XMPP 时,多次聊天发送时会收到 'service unavailable'?

python - 尝试理解 python 矩阵中索引切片的语法

python - 在A和B之间交换元素以获得总和相等

machine-learning - 二进制交叉熵损失在自动编码器上如何工作?

python - 如何将多维列变成单值向量以用于sklearn pandas中的训练数据

python - 安装包 'sklearn' 失败

python - 谁能告诉我为什么我的 else 语句出现无效语法错误?

machine-learning - 姓名拼写检查机器学习

python - 在 scikit-learn 中实现词袋