14

Aşağıda benim boru hattım var ve bu parametrelerimi modelden ModelTransformer sınıfını kullanarak geçiremiyorum. (http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html)(Python - sklearn) Gridsearchcv tarafından ModelTransformer sınıfını özelleştirmek için parametrelere nasıl geçilir

Hata mesajı bana mantıklı geliyor, ancak bunu nasıl düzeltebileceğimi bilmiyorum. Bunu düzeltmek için bir fikrin var mı? Teşekkürler.

# 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) 

hata iletisi: ValueError: tahmincisi ModelTransformer geçersiz parametre n_estimators. Iç içe geçmiş nesneler için özel bir adlandırma kuralı vardır.

+0

Sorduğunuz için teşekkürler - Aynı soru vardı. Sana başka bir şey sormama izin ver. * Self.model.fit'in (* args, ** kwargs) * neden çalıştığını biliyor musunuz? Demek istediğim, genellikle uygun yöntemi çağırırken n_estimatörler gibi hipermetrelerden geçmezsiniz, ancak, sınıf örneğini tanımlarken, örneğin, rfc = RandomForestClassifier (n_estimators = 100), oluşturduğunuzda rfc.fit (X, y) – drake

+0

@drake bir ModelTransformer örneğiyle, bir modelde parametrelerini geçmeniz gerekir. Örneğin, ModelTransformer (RandomForestClassifier (n_jobs = -1, random_state = 1, n_estimators = 100))). Ve burada self.model.fit (* args, ** kwargs) çoğunlukla self.model.fit (X, y) anlamına gelir. – nkhuyu

+0

Teşekkürler, @nkhuyu. Bunun nasıl çalıştığını biliyorum. Nedenini soruyordum. Self.model = model olduğundan, self.model = RandomForestClassifier (n_jobs = -1, random_state = 1, n_estimators = 100). Anladım * args paketini açıyor (X, y), ama ben anlamıyorum çünkü self.model zaten hiperparametreleri bildiğinde fit metodundaki kwargs. – drake

cevap

15

GridSearchCVpipeline tanımına göre, ess.rfc.n_estimators anlamına gelir ve ess__rfc__n_estimators senin durumda, Açıkçası, ModelTransformer örnekleri konusu malları yok

ModelTransformer(RandomForestClassifier(n_jobs=-1, random_state=1, n_estimators=100))) 

özelliğine n_estimators işaret ediyor.

Düzeltme işlemi kolaydır: ModelTransformer'un altında yatan nesneye erişmek için model alanını kullanmanız gerekir. Yani, ızgara parametreleri

parameters = { 
    'ess__rfc__model__n_estimators': (100, 200), 
} 

Not; haline kodunuzdaki tek sorun bu değil. GridSearchCV'de birden fazla iş kullanmak için kopyaladığınız tüm nesneleri kullanmanız gerekir. Bu, get_params ve set_params yöntemlerini uygulayarak başarılır, bunları BaseEstimator karışımından ödünç alabilirsiniz.

+0

Bu PS üzerinde biraz genişletebilir misin? Ben aynı sorun var nerede ben gridsearchcv boru hattı özelliği sendika ile kullanmaya çalıştığınızda hata alıyorum AttributeError: 'SelectColumns' nesnesinin 'get_params' özniteliği vardır, burada SelectColumns boru hattı için yazdığım bir sınıftır. –

+7

@B_Miner, 'SelectColumns' sınıfınızı yukarıda belirtilen 'set_params' sağlayan ['BaseEstimator'] (http://scikit-learn.org/stable/modules/generated/sklearn.base.BaseEstimator.html) 'den miras almalısınız. ve 'get_params'. Alternatif olarak, kendi olanlarınızı uygulayabilirsiniz, ancak çoğu zaman istemezsiniz. –

+2

BaseEstimatorMixin'i arıyordum. BaseEstimator'dan miras aldım ve bir çekicilik gibi çalıştı, teşekkürler! –

İlgili konular