我有一些文本数据,我想在一个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的单个通用管道和单个调用? >
答案 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)