2014-07-01 4 views
5

nicht zu setzen scheint. Ich habe die Klasse BernoulliRBM von scikit-learn geändert, um Gruppen von sichtbaren Softmax-Einheiten zu verwenden. In dem Verfahren fügte ich ein zusätzliches Array Numpy visible_config als Klassenattribut, das in dem Konstruktor initialisiert wird wie folgt verwendet:Python scikit-learn: Objekt kann nicht geklont werden, da der Konstruktor den Parameter

self.visible_config = np.cumsum(np.concatenate((np.asarray([0]), 
           visible_config), axis=0)) 

wo visible_config ist ein Numpy Array als Eingabe an den Konstruktor übergeben. Der Code läuft ohne Fehler, wenn ich die Funktion fit() direkt zum Trainieren des Modells verwende. Allerdings, wenn ich die GridSearchCV Struktur verwenden, erhalte ich die folgenden Fehler

Cannot clone object SoftmaxRBM(batch_size=100, learning_rate=0.01, n_components=100, n_iter=100, 
    random_state=0, verbose=True, visible_config=[ 0 21 42 63]), as the constructor does not seem to set parameter visible_config 

Dies scheint ein Problem in der Gleichheitsprüfung zwischen der Instanz der Klasse und seiner Kopie von sklearn.base.clone erstellt werden, weil visible_config nicht richtig kopiert werden . Ich bin mir nicht sicher, wie ich das beheben soll. Es heißt in der Dokumentation, dass sklearn.base.clone eine deepcopy() verwendet, sollte also nicht visible_config auch kopiert werden? Kann mir bitte jemand erklären, was ich hier versuchen kann? Vielen Dank!

Antwort

3

Ohne Ihren Code zu sehen, ist es schwer zu sagen, was genau falsch läuft, aber Sie verstoßen hier gegen eine API-Konvention von scikit-learn. Der Konstruktor in einem Schätzer sollte nur Attribute zu den Werten setzen, die der Benutzer als Argumente übergibt. Die gesamte Berechnung sollte in fit erfolgen, und wenn fit das Ergebnis einer Berechnung speichern muss, sollte dies in einem Attribut mit einem abschließenden Unterstrich (_) geschehen. Diese Konvention macht clone und Meta-Schätzer wie GridSearchCV funktionieren.

(*) Wenn Sie jemals einen Schätzer in der Hauptcodebasis sehen, der gegen diese Regel verstößt, wäre das ein Fehler und Patches sind willkommen.

+0

Sie haben Recht. Vielen Dank! Durch das Entfernen des Berechnungsschritts und das Übergeben der vorberechneten 'visible config' in den Konstruktor wurde das Problem behoben. – user1953384

+0

Jeder, der dies versucht, stellt sicher, dass Sie Ihr Modell nicht in den __init__ klonen. Zum Beispiel 'Klasse NewAlgo (Basestimator, Otherestimator): def __init __ (sefl, Modell): self.model = Klon (Modell)' tu das nicht <- –

Verwandte Themen