使用GridSearchCV测试多条管道

时间:2019-09-10 17:17:29

标签: python scikit-learn gridsearchcv

我有一些文本数据,我想在一个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 +税收(FeatureUnion简介)”部分):

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。例如,是否仍然可以让LGBMRegressor仅使用“ cont_portal”,而Logit模型仅使用“ tax_portal”,同时仍保持对GridSearchCV的单个通用管道和单个调用? >

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,因为现在意识到这主要是由于我对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)