(Python - sklearn)如何通过 gridsearchcv 将参数传递给自定义 ModelTransformer class
(Python - sklearn) How to pass parameters to the customize ModelTransformer class by gridsearchcv
下面是我的管道,似乎我无法使用 ModelTransformer 类将参数传递给我的模型,我从 link (http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html)
错误消息对我来说很有意义,但我不知道如何解决这个问题。知道如何解决这个问题吗?谢谢。
# define a pipeline
pipeline = Pipeline([
('vect', DictVectorizer(sparse=False)),
('scale', preprocessing.MinMaxScaler()),
('ess', FeatureUnion(n_jobs=-1,
transformer_list=[
('rfc', ModelTransformer(RandomForestClassifier(n_jobs=-1, random_state=1, n_estimators=100))),
('svc', ModelTransformer(SVC(random_state=1))),],
transformer_weights=None)),
('es', EnsembleClassifier1()),
])
# define the parameters for the pipeline
parameters = {
'ess__rfc__n_estimators': (100, 200),
}
# ModelTransformer class. It takes it from the link
(http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html)
class ModelTransformer(TransformerMixin):
def __init__(self, model):
self.model = model
def fit(self, *args, **kwargs):
self.model.fit(*args, **kwargs)
return self
def transform(self, X, **transform_params):
return DataFrame(self.model.predict(X))
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, refit=True)
错误信息:
ValueError:估算器 ModelTransformer 的参数无效 n_estimators。
GridSearchCV
对嵌套对象有特殊的命名约定。在你的例子中 ess__rfc__n_estimators
代表 ess.rfc.n_estimators
,并且根据 pipeline
的定义,它指向
的 属性 n_estimators
ModelTransformer(RandomForestClassifier(n_jobs=-1, random_state=1, n_estimators=100)))
显然,ModelTransformer
个实例没有这样的 属性。
修复很简单:为了访问 ModelTransformer
的基础对象,需要使用 model
字段。所以,网格参数变为
parameters = {
'ess__rfc__model__n_estimators': (100, 200),
}
P.S. 这不是您的代码的唯一问题。为了在 GridSearchCV 中使用多个作业,您需要使您正在使用的所有对象都可复制。这是通过实现方法 get_params
和 set_params
实现的,你可以从 BaseEstimator
mixin.
借用它们
下面是我的管道,似乎我无法使用 ModelTransformer 类将参数传递给我的模型,我从 link (http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html)
错误消息对我来说很有意义,但我不知道如何解决这个问题。知道如何解决这个问题吗?谢谢。
# define a pipeline
pipeline = Pipeline([
('vect', DictVectorizer(sparse=False)),
('scale', preprocessing.MinMaxScaler()),
('ess', FeatureUnion(n_jobs=-1,
transformer_list=[
('rfc', ModelTransformer(RandomForestClassifier(n_jobs=-1, random_state=1, n_estimators=100))),
('svc', ModelTransformer(SVC(random_state=1))),],
transformer_weights=None)),
('es', EnsembleClassifier1()),
])
# define the parameters for the pipeline
parameters = {
'ess__rfc__n_estimators': (100, 200),
}
# ModelTransformer class. It takes it from the link
(http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html)
class ModelTransformer(TransformerMixin):
def __init__(self, model):
self.model = model
def fit(self, *args, **kwargs):
self.model.fit(*args, **kwargs)
return self
def transform(self, X, **transform_params):
return DataFrame(self.model.predict(X))
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, refit=True)
错误信息: ValueError:估算器 ModelTransformer 的参数无效 n_estimators。
GridSearchCV
对嵌套对象有特殊的命名约定。在你的例子中 ess__rfc__n_estimators
代表 ess.rfc.n_estimators
,并且根据 pipeline
的定义,它指向
n_estimators
ModelTransformer(RandomForestClassifier(n_jobs=-1, random_state=1, n_estimators=100)))
显然,ModelTransformer
个实例没有这样的 属性。
修复很简单:为了访问 ModelTransformer
的基础对象,需要使用 model
字段。所以,网格参数变为
parameters = {
'ess__rfc__model__n_estimators': (100, 200),
}
P.S. 这不是您的代码的唯一问题。为了在 GridSearchCV 中使用多个作业,您需要使您正在使用的所有对象都可复制。这是通过实现方法 get_params
和 set_params
实现的,你可以从 BaseEstimator
mixin.