【问题标题】:Using GridSearchCV to Test Multiple Pipelines使用 GridSearchCV 测试多个管道
【发布时间】:2020-01-12 11:49:39
【问题描述】:

我有一些文本数据,我想在单个 GridSearchCV 调用中使用不同的、不同的模型集来试验多种数据转换技术。这个想法是:在具有模型 1、2 和 3 的管道中给定数据转换 A,并在具有模型 4、5 和 6 的管道中给定数据转换 B,其中 A 与 1、2 或 3 的组合或具有 4、5 或 6 的 B 会产生最佳预测结果?

目前我一直在做 2 个单独的 GridSearchCV 调用 - 一个带有一个管道,一个带有另一个,但这似乎非常低效,即使在多处理包装器中完成也是如此。我也一直在互联网上寻找一些与我想做的类似的例子。

我找到了这个小教程:https://www.kaggle.com/evanmiller/pipelines-gridsearch-awesome-ml-pipelines,但它只完成了我想做的一半。给出下面的例子(取自链接教程的“Pipeline 4.0 - contVars + tax(FeatureUnion intro)”部分):

pipeline = Pipeline([

    ('unity', FeatureUnion(
        transformer_list=[

            ('cont_portal', Pipeline([
                ('selector', PortalToColDimension(contVars)),
                ('cont_imp', Imputer(missing_values='NaN', strategy = 'median', axis=0)),
                ('scaler', StandardScaler())             
            ])),
            ('tax_portal', Pipeline([
                ('selector', PortalToColDimension(taxVars)),
                ('tax_imp', Imputer(missing_values='NaN', strategy = 'most_frequent', axis=0)),
                ('scaler', MinMaxScaler(copy=True, feature_range=(0, 3)))
            ])),
        ],
    )),
    ('column_purge', SelectKBest(k = 5)),    
    ('lgbm', LGBMRegressor()),
])

parameters = {}
parameters['column_purge__k'] = [5, 10]

grid = GridSearchCV(pipeline, parameters, scoring = 'neg_mean_absolute_error', n_jobs= 2)
grid.fit(x_train, y_train)   

print('Best score and parameter combination = ')

print(grid.best_score_)    
print(grid.best_params_)    

y_pred = grid.predict(x_valid)

看起来,虽然“cont_portal”和“tax_portal”产生了两个不同的数据转换管道(我想做的前半部分),但它们都被定向到 LGBMRegressor。例如,是否可以让“cont_portal”仅由 LGBMRegressor 使用,而“tax_portal”仅由 Logit 模型使用,同时仍保持单一的通用管道和对 GridSearchCV 的单一调用?

【问题讨论】:

    标签: python scikit-learn gridsearchcv


    【解决方案1】:

    回答我自己的问题,因为现在意识到这主要是由于我对 GridSearchCV 的幼稚。希望这可以帮助有同样问题的人!

    为简单起见,我根据this post 创建了一个 ClfSwitcher() 类。为了执行我在问题中指定的内容并拥有两个独立的流程,就这么简单:

    
    from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
    from sklearn.linear_model import LogisticRegression, SGDClassifier
    from sklearn.kernel_approximation import Nystroem
    from sklearn.pipeline import Pipeline
    from sklearn.model_selection import GridSearchCV
    
    pipeline = Pipeline([
        ('vect', TfidfVectorizer()),
        ('kernel', Nystroem(kernel='linear')),
        ('clf', ClfSwitcher()),
    ])
    
    parameters = [
        {
            'vect': [TfidfVectorizer(), CountVectorizer()],
            'kernel': [None],
            'clf__estimator':[LogisticRegression()],
            'clf__estimator__C':[100, 10, 5, 3, 1],
            'clf__estimator__random_state': [1],
            'clf__estimator__solver': ['liblinear'],
            'clf__estimator__class_weight': ['balanced']
        },
        {
            'kernel': [Nystroem(kernel='poly'), Nystroem(kernel='rbf')],
            'clf__estimator':[SGDClassifier()],
            'clf__estimator__C':[100, 10, 1, 0.1, 0.01],
            'clf__estimator__random_state': [1],
            'clf__estimator__class_weight': ['balanced']
         }
    ]
    
    gscv = GridSearchCV(pipeline, parameters, cv=5, refit=True)
    

    【讨论】:

    • 如果你想测试'vect'或'kernel'的多个参数怎么办?在参数前面加上“vect__”或“kernel__”就足够了吗?你应该把它们放在哪里?
    猜你喜欢
    • 2022-09-28
    • 2020-12-21
    • 2020-09-24
    • 2020-10-21
    • 2014-01-29
    • 2022-01-27
    • 2021-08-24
    相关资源
    最近更新 更多