python-2.7 machine-learning parameter-passing scikit-learn cross-validation

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.