Di seguito è la mia pipeline e sembra che non posso passare i parametri ai miei modelli utilizzando la classe ModelTransformer, che prendo dal link (http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html)(Python - sklearn) Come passare parametri alla classe ModelTransformer personalizzata da gridsearchcv
Il messaggio di errore ha senso per me, ma non so come risolvere questo problema. Qualche idea su come risolvere questo problema? Grazie.
# 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)
messaggio di errore: ValueError: n_estimators parametro non valido per stimatore ModelTransformer.
Grazie per avermelo chiesto - Ho avuto la stessa domanda. Lascia che ti chieda un'altra cosa. Sai perché * self.model.fit (* args, ** kwargs) * funziona? Voglio dire che di solito non si passano iperparametri come n_estimators quando si chiama il metodo fit, ma quando si definisce l'istanza della classe, ad esempio rfc = RandomForestClassifier (n_estimators = 100), rfc.fit (X, y) – drake
@drake, quando si crea un'istanza ModelTransformer, è necessario passare un modello con i relativi parametri. Ad esempio, ModelTransformer (RandomForestClassifier (n_jobs = -1, random_state = 1, n_estimators = 100))). E qui self.model.fit (* args, ** kwargs) significa principalmente self.model.fit (X, y). – nkhuyu
Grazie, @nkhuyu. So che è così che funziona. Stavo chiedendo perché. Poiché self.model = model, self.model = RandomForestClassifier (n_jobs = -1, random_state = 1, n_estimators = 100). Capisco * args è decompressione (X, y), ma non capisco PERCHÉ è necessario ** kwargs nel metodo di adattamento quando self.model conosce già gli iperparametri. – drake