python 2.7 - (Python-sklearn) Cómo pasar parámetros a la clase ModelTransformer personalizada por gridsearchcv
python-2.7 machine-learning (1)
GridSearchCV
tiene una convención de nomenclatura especial para objetos anidados. En su caso, ess__rfc__n_estimators
significa ess.rfc.n_estimators
y, según la definición de la pipeline
, apunta a la propiedad n_estimators
de
ModelTransformer(RandomForestClassifier(n_jobs=-1, random_state=1, n_estimators=100)))
Obviamente, ModelTransformer
instancias de ModelTransformer
no tienen dicha propiedad.
La solución es fácil: para acceder al objeto subyacente de ModelTransformer
uno necesita usar el campo de model
. Así, los parámetros de la rejilla se convierten
parameters = {
''ess__rfc__model__n_estimators'': (100, 200),
}
PD: no es el único problema con tu código. Para utilizar varios trabajos en GridSearchCV, debe hacer que todos los objetos que está usando puedan copiarse. Esto se logra mediante la implementación de los métodos get_params
y set_params
, puede tomarlos prestados de la BaseEstimator
.
A continuación se muestra mi canalización y parece que no puedo pasar los parámetros a mis modelos utilizando la clase ModelTransformer, la cual tomo del enlace ( http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html )
El mensaje de error tiene sentido para mí, pero no sé cómo solucionarlo. ¿Algúna idea de cómo arreglar esto? Gracias.
# 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)
Mensaje de error: ValueError: Parámetro n_estimators no válido para el estimador ModelTransformer.