2016-04-26 8 views
0
genannt

ich vererben from sklearn.ensemble import RandomForestClassifier, und ich versuche, meinen neuen Schätzer zu drucken:Super __str__ ist nicht immer

class my_rf(RandomForestClassifier): 
    def __str__(self): 
     return "foo_" + RandomForestClassifier.__str__(self) 

gibt foo_my_rf()

ich auch versucht:

class my_rf(RandomForestClassifier): 
    def __str__(self): 
     return "foo_" + super(RandomForestClassifier, self).__str__() 

mit das gleiche Ergebnis. erwartet ist etwas ziemlich wie sklearn Standardverhalten:

 
>>> a = RandomForestClassifier() 
>>> print a 
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', 
     max_depth=None, max_features='auto', max_leaf_nodes=None, 
     min_samples_leaf=1, min_samples_split=2, 
     min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, 
     oob_score=False, random_state=None, verbose=0, 
     warm_start=False) 
>>> 

Dies ist auch das Ergebnis, wenn ich print a.__str__() verwenden.

Was fehlt mir? Danke.

im Zusammenhang mit How do I change the string representation of a Python class?

+2

Offensichtlich ist die Elternklasse '__str__' Implementierung der Name der Klasse. Du rufst es richtig an. – jonrsharpe

+0

@jonrsharpe - oops, bearbeitet die Frage, um klar zu machen, was ich suche. – ihadanny

+0

Haben Sie versucht, stattdessen das '__repr__' zu betrachten? – jonrsharpe

Antwort

0

In RandomForestClassifier sowohl __repr__ und __str__ Lookup den Namen der Klasse der Instanz sich aus (self) genannt werden. Sie sollten direkt auf den Namen der Oberklasse verweisen.

Aktualisieren So können Sie Ihre gewünschte Ausgabe erhalten, obwohl ich nicht verstehe, warum sollten Sie so etwas wollen. Es gibt einen Grund, warum RandomForestClassifier__str__ und __repr__ den tatsächlichen Namen einer Klasse zurückgeben. Auf diese Weise können Sie eval das Objekt wiederherstellen. Wie auch immer, erhalten

In [1]: from sklearn.ensemble import RandomForestClassifier 
In [2]: class my_rf(RandomForestClassifier): 
    def __str__(self): 
     superclass_name = RandomForestClassifier.__name__ 
     return "foo_" + superclass_name + "(" + RandomForestClassifier.__str__(self).split("(", 1)[1] 

In [3]: forest = my_rf() 
In [4]: print forest 
foo_RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, 
    max_features='auto', max_leaf_nodes=None, min_samples_leaf=1, 
    min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, 
    n_jobs=1, oob_score=False, random_state=None, verbose=0, 
    warm_start=False) 

Update 2 Sie keine Parameter, wenn Sie __init__ außer Kraft setzen, da in der übergeordneten Klasse __str__ und __repr__ umgesetzt werden, um die Liste der Argumente zu __init__ weitergegeben zu scannen. Sie können es deutlich sehen, indem Sie diesen Code ausführen:

In [5]: class my_rf(RandomForestClassifier): 
    def __init__(self, *args, **kwargs): 
     RandomForestClassifier.__init__(self, *args, **kwargs) 
    def __str__(self): 
     superclass_name = RandomForestClassifier.__name__ 
     return "foo_" + superclass_name + "(" + RandomForestClassifier.__str__(self).split("(", 1)[1] 
In [6]: forest = my_rf() 
In [7]: print forest 
... 
RuntimeError: scikit-learn estimators should always specify their parameters in the signature of their __init__ (no varargs). <class '__main__.my_rf'> with constructor (<self>, *args, **kwargs) doesn't follow this convention. 
+0

Auch wenn dies nicht das ist, wonach das OP gefragt hat, könnte es sein, was sie eigentlich wollen. – 5gon12eder

+0

oops, habe die Frage bearbeitet, um klarzustellen, wonach ich suche. – ihadanny

+0

@ihadanny Ich aktualisierte den Beitrag –

Verwandte Themen