0

我有一些文本数据,我想在单个 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 的单一调用?

4

1 回答 1

0

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

为了简单起见,我根据这篇文章创建了一个 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)
于 2019-09-10T19:32:02.283 回答