web-dev-qa-db-fra.com

Tableau de tableau Singleton (<train de fonctions à 0x7f3a311320d0>, dtype = object) ne peut pas être considéré comme une collection valide

Je ne sais pas comment réparer. Toute aide apprécie beaucoup. J'ai vu thi Vectorisation: collection non valide mais je ne suis pas sûr de l'avoir comprise

    train = df1.iloc[:,[4,6]]
            target =df1.iloc[:,[0]]

            def train(classifier, X, y):
                X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)

                classifier.fit(X_train, y_train)
                print ("Accuracy: %s" % classifier.score(X_test, y_test))
                return classifier

        trial1 = Pipeline([
            ('vectorizer', TfidfVectorizer()),
            ('classifier', MultinomialNB()),
        ])

        train(trial1, train, target)

erreur ci-dessous:

    ----> 6 train(trial1, train, target)

    <ipython-input-140-ac0e8d32795e> in train(classifier, X, y)
          1 def train(classifier, X, y):
    ----> 2     X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)
          3 
          4     classifier.fit(X_train, y_train)
          5     print ("Accuracy: %s" % classifier.score(X_test, y_test))

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/model_selection/_split.py in train_test_split(*arrays, **options)
       1687         test_size = 0.25
       1688 
    -> 1689     arrays = indexable(*arrays)
       1690 
       1691     if stratify is not None:

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in indexable(*iterables)
        204         else:
        205             result.append(np.array(X))
    --> 206     check_consistent_length(*result)
        207     return result
        208 

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
        175     """
        176 
    --> 177     lengths = [_num_samples(X) for X in arrays if X is not None]
        178     uniques = np.unique(lengths)
        179     if len(uniques) > 1:

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in <listcomp>(.0)
        175     """
        176 
    --> 177     lengths = [_num_samples(X) for X in arrays if X is not None]
        178     uniques = np.unique(lengths)
        179     if len(uniques) > 1:

    /home/manisha/anaconda3/lib/python3.5/site-packages/sklearn/utils/validation.py in _num_samples(x)
        124         if len(x.shape) == 0:
        125             raise TypeError("Singleton array %r cannot be considered"
    --> 126                             " a valid collection." % x)
        127         return x.shape[0]
        128     else:

    TypeError: Singleton array array(<function train at 0x7f3a311320d0>, dtype=object) cannot be considered a valid collection.

 ____

Je ne sais pas comment réparer. Toute aide apprécie beaucoup. J'ai vu thi Vectorisation: collection non valide mais je ne suis pas sûr de l'avoir comprise

7
manisha

Cette erreur survient parce que votre fonction train masque votre variable train et qu'elle est donc transmise à elle-même.

Explication:

Vous définissez un train variable comme ceci:

train = df1.iloc[:,[4,6]]

Après quelques lignes, vous définissez un train de méthodes comme ceci:

def train(classifier, X, y):

Donc, ce qui se passe réellement, c'est que votre version précédente de train est mise à jour avec la nouvelle version. Cela signifie que la variable train ne pointe pas maintenant vers l'objet Dataframe comme vous le souhaitez, mais pointe vers la fonction que vous avez définie. Dans l'erreur, il est effacé.

array(<function train at 0x7f3a311320d0>, dtype=object)

Voir le train de fonctions à l'intérieur de la déclaration d'erreur.

Solution:

Renommez l'un d'eux (la variable ou la méthode). Suggestion: renommez la fonction en utilisant un autre nom tel que training ou training_func ou quelque chose du genre.

5
Vivek Kumar

J'ai eu la même erreur dans un autre contexte (sklearn train_test_split) et la raison était simplement que j'avais passé un argument de position en tant qu'argument mot-clé, ce qui avait entraîné une mauvaise interprétation de la fonction appelée.

7
dopexxx

Une variante de la première réponse - une autre raison pour laquelle vous pourriez l'obtenir est si un nom de colonne dans vos données est identique à un attribut/une méthode de l'objet contenant les données. 

Dans mon cas, j'essayais d'accéder à la colonne "count" dans le dataframe "df" avec la syntaxe apparemment légale df.count. 

Cependant, le compte est considéré comme un attribut des objets de la base de données pandas. La collision de noms résultante crée l'erreur (plutôt confuse).

1
Info5ek