2 votes

Comment trouver une erreur Python spécifique?

Je suis en train d'écrire le classificateur suivant pour tester sci-kit.

...

class MyClassifier():
    def fit(self, x_train, y_train):
        self.x_train = x_train
        self.y_train = y_train
        return

    def predict(self, x_test):
        prediction = []
        for row in x_test:
            label = self.closest(row)
            prediction.append(label)
        return prediction

    def closest(self, row):
        best_dist = euc(row, self.x_train[0])
        best_index = 0
        for i in range(1, len(self.x_train)):
            dist = euc(row, self.x_train[0])
            if dist < best_dist:
                best_dist = dist
                best_index = i
        return self.y_train[best_index]

Et plus tard, je veux utiliser mon propre classificateur :

# Utiliser mon propre Classifier
classifer = MyClassifier()
print(classifer)
classifer = classifer.fit(x_train, y_train)
prediction = classifer.predict(x_test)
print(prediction)
print(y_test)

Quand je l'exécute, j'obtiens l'erreur suivante :

<__main__.MyClassifier object at 0x103ec5668>
Traceback (most recent call last):
  File "/.../NewClassifier.py", line 72, in 
    prediction = classifer.predict(x_test)
AttributeError: 'NoneType' object has no attribute 'predict'

Qu'est-ce qui ne va pas avec la fonction predict()?

3voto

Patrick Artner Points 29630

Votre classmethod

def fit(self, x_train, y_train):
    self.x_train = x_train
    self.y_train = y_train
    return

ne renvoie rien, donc elle renvoie implicitement None.

Par conséquent, classifer = classifer.fit(x_train, y_train) écrase la variable nommée classifer de type MyClassifier avec un None.

Un None n'a pas de méthode que vous pouvez appeler - c'est le message d'erreur exact que vous avez obtenu.

Vous devriez changer classifer = classifer.fit(x_train, y_train) simplement en

classifer.fit(x_train, y_train)

ainsi vous conservez la variable nommée classifer en tant qu'instance de votre classe au lieu de "l'écraser" avec None.


Cela devrait résoudre le problème :

# Utiliser mon propre Classifier
classifer = MyClassifier()
print(classifer)
classifer.fit(x_train, y_train)
prediction = classifer.predict(x_test)
print(prediction)
print(y_test)

2voto

Rezkin Points 202

Je recommande d'utiliser le débogueur intégré de Python, pdb. Si vous ajoutez import pdb;pdb.set_trace() avant votre instruction classifer = MyClassifier(), vous pouvez voir chaque variable et interagir avec votre code.

Maintenant, vous écrasez votre instanciation de classe.

-> print(classifer)
(Pdb) n
<__main__.MyClassifier object at 0x7f7fe2f139e8>  // Il s'agit de votre objet classifer
-> classifer = classifer.fit("test", "test2")
(Pdb) classifer
-> prediction = classifier.predict(x_test)
(Pdb) classifer
(Pdb)

Donc, parce que vous nommez la variable de la même manière, vous écrasez votre classe précédente.

Vous avez classifer = MyClassifier() et ensuite classifer = classifer.foo donc, il perd sa référence d'origine à MyClassifier().

Deuxièmement, votre fonction fit(x_train, y_train) ne retourne rien.

Avoir:

def fit(self, x_train, y_train):
        self.x_train = x_train
        self.y_train = y_train
        return

Est la même chose que:

def fit(self, x_train, y_train):
        self.x_train = x_train
        self.y_train = y_train
        return None

C'est ce que vous obtenez:

(Pdb) print(classifer)
None

Et donc, c'est pourquoi vous recevez AttributeError: 'NoneType' object has no attribute 'predict' car classifer est None.

Je ne suis pas sûr de ce que la fonction fit est censée retourner, mais j'imagine que c'est self. Ainsi, le code suivant fonctionne pour moi pour résoudre votre erreur, mais comme je ne sais pas ce que x_train, y_train, x_test et y_test sont censés être, je n'ai pas pu exécuter tout votre code. Néanmoins, cela résout le problème pour lequel vous avez posé la question.

class MyClassifier():
    def fit(self, x_train, y_train):
        self.x_train = x_train
        self.y_train = y_train
        return self // Doit retourner quelque chose, et d'après le contexte, cela semble être votre intention.

    def predict(self, x_test):
        prediction = []
        for row in x_test:
            label = self.closest(row)
            prediction.append(label)
        return prediction

    def closest(self, row):
        best_dist = euc(row, self.x_train[0])
        best_index = 0
        for i in range(1, len(self.x_train)):
            dist = euc(row, self.x_train)
            if dist < best_dist:
                best_dist = dist
                best_index = i
        return self.y_train[best_index]

classifier = MyClassifier()
print(classifier)
classifier2 = classifier.fit("test", "test2")
prediction = classifier2.predict(x_test)
print(prediction)
print(y_test)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X