TypeError: get_params() fehlt 1 erforderliche positionelle argument: "selbst"
Ich versuchte zu verwenden scikit-learn
Paket mit python-3.4 zu tun, ein grid-search,
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.metrics import precision_score, recall_score, accuracy_score
from sklearn.preprocessing import LabelBinarizer
import numpy as np
pipeline = Pipeline([
('vect', TfidfVectorizer(stop_words='english')),
('clf', LogisticRegression)
])
parameters = {
'vect__max_df': (0.25, 0.5, 0.75),
'vect__stop_words': ('english', None),
'vect__max_features': (2500, 5000, 10000, None),
'vect__ngram_range': ((1, 1), (1, 2)),
'vect__use_idf': (True, False),
'vect__norm': ('l1', 'l2'),
'clf__penalty': ('l1', 'l2'),
'clf__C': (0.01, 0.1, 1, 10)
}
if __name__ == '__main__':
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, scoring='accuracy', cv = 3)
df = pd.read_csv('SMS Spam Collection/SMSSpamCollection', delimiter='\t', header=None)
lb = LabelBinarizer()
X, y = df[1], np.array([number[0] for number in lb.fit_transform(df[0])])
X_train, X_test, y_train, y_test = train_test_split(X, y)
grid_search.fit(X_train, y_train)
print('Best score: ', grid_search.best_score_)
print('Best parameter set:')
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(best_parameters):
print(param_name, best_parameters[param_name])
Jedoch läuft es nicht erfolgreich, die Fehlermeldung sieht wie folgt aus:
Fitting 3 folds for each of 1536 candidates, totalling 4608 fits
Traceback (most recent call last):
File "/home/xiangru/PycharmProjects/machine_learning_note_with_sklearn/grid search.py", line 36, in <module>
grid_search.fit(X_train, y_train)
File "/usr/local/lib/python3.4/dist-packages/sklearn/grid_search.py", line 732, in fit
return self._fit(X, y, ParameterGrid(self.param_grid))
File "/usr/local/lib/python3.4/dist-packages/sklearn/grid_search.py", line 493, in _fit
base_estimator = clone(self.estimator)
File "/usr/local/lib/python3.4/dist-packages/sklearn/base.py", line 47, in clone
new_object_params[name] = clone(param, safe=False)
File "/usr/local/lib/python3.4/dist-packages/sklearn/base.py", line 35, in clone
return estimator_type([clone(e, safe=safe) for e in estimator])
File "/usr/local/lib/python3.4/dist-packages/sklearn/base.py", line 35, in <listcomp>
return estimator_type([clone(e, safe=safe) for e in estimator])
File "/usr/local/lib/python3.4/dist-packages/sklearn/base.py", line 35, in clone
return estimator_type([clone(e, safe=safe) for e in estimator])
File "/usr/local/lib/python3.4/dist-packages/sklearn/base.py", line 35, in <listcomp>
return estimator_type([clone(e, safe=safe) for e in estimator])
File "/usr/local/lib/python3.4/dist-packages/sklearn/base.py", line 45, in clone
new_object_params = estimator.get_params(deep=False)
TypeError: get_params() missing 1 required positional argument: 'self'
Ich auch versucht, nur
if __name__ == '__main__':
pipeline.get_params()
Gibt es die gleiche Fehlermeldung.
Wer weiß, wie dieses Problem zu beheben?
Dieser Fehler ist fast immer irreführend, und tatsächlich heißt das, dass man den Aufruf einer Instanz-Methode der Klasse und nicht die Instanz (wie der Aufruf
dict.keys()
statt d.keys()
auf eine dict
namens d
). Ist best_estimator_
geben Sie ein Schätzer Art statt eine Instanz von einem estimator type? Wenn dem so ist, das ist das problem; Sie haben, um den Bau einer Schätzung aufrufen, geben Sie (mit den entsprechenden Parametern).InformationsquelleAutor Xiangru Lian | 2015-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Fehler ist fast immer irreführend und eigentlich bedeutet, dass Sie sich den Aufruf einer Instanz-Methode der Klasse und nicht die Instanz (wie der Aufruf
dict.keys()
stattd.keys()
auf einedict
namensd
).*Und das ist genau das, was hier Los ist. Die docs bedeuten, dass die
best_estimator_
Attribut, wie dieestimator
parameter für die Initialisierung, ist nicht eine schätzfunktion Instanz, es ist eine schätzfunktion Typ, und "Ein Objekt dieses Typs instanziiert wird für jeden grid-Punkt".So, wenn Sie wollen, um Methoden aufzurufen, müssen Sie zum erstellen eines Objekts dieses Typs, bei dem bei bestimmten Gitterpunkt.
Jedoch von einem schnellen Blick in die docs, wenn Sie versuchen, die Parameter, die verwendet wurden, für den speziellen Fall der beste Schätzer, welcher das beste Ergebnis, ist das nicht nur
best_params_
? (Ich entschuldige mich, dass dieser Teil ist ein bisschen eine Vermutung...)Für die
Pipeline
nennen, Sie haben definitiv eine Instanz gibt. Und das nur Dokumentation für diese Methode wird ein param-spec, die zeigt, dass es nimmt ein optionales argument,deep
. Aber unter der Decke, es ist wahrscheinlich die Weiterleitung derget_params()
Aufruf eines seiner Attribute. Und mit('clf', LogisticRegression)
, es sieht aus wie Sie sind, bauen mit der KlasseLogisticRegression
eher als eine Instanz der Klasse, so dass, wenn das ist, was es landet Weiterleitung an, das würde das problem erklären.* Der Grund der Fehlermeldung steht "missing 1 erforderliche positionelle argument: 'self'" statt "muss aufgerufen werden, auf eine Instanz" oder etwas ist, dass in Python,
d.keys()
ist effektiv verwandelte sich indict.keys(d)
, und es ist völlig legal (und manchmal sinnvoll) zu nennen, die explizit, also Python kann nicht wirklich sagen, dassdict.keys()
ist illegal, nur, es fehlt derself
argument.grid_search.fit(X_train, y_train)
. Es führt nicht die Passform.Ich finde einen Weg, es zu lösen in der anderen Antwort.
InformationsquelleAutor abarnert
Habe ich endlich das problem gelöst bekommen. Der Grund dafür ist genau wie das, was abarnert sagte.
Erstens habe ich versucht:
und es funktioniert gut.
Mit, dass die intuition, die ich modifiziert der pipeline zu sein:
Beachten Sie, dass es eine
()
nachLogisticRegression
.Diesmal funktioniert es.
()
bedeutet, dass Sie Aufruf. Aufruf einer Klasse erstellt eine Instanz der Klasse. Das ist genau das, was Sie zu tun haben, wie ich bereits in meiner Antwort.Danke!!! Ich Ihre Idee.
markieren Sie Ihre Antwort als richtig
Ich habe ähnliches problem mit lda = discriminant_analysis.LinearDiscriminantAnalysis(). Vergessen () nach der Instanziierung
InformationsquelleAutor Xiangru Lian