2017-08-31 3 views
0

J'ai une trame de données qui se présente comme suit:Faire face à Sparse Matrices et de multiples fonctions numériques lorsque l'algorithme de formation

        description  priority CDT JDT 
0 Create Help Index Fails with seemingly incorre...  P3 0 0  
1 Internal compiler error when compiling switch ...  P3 0 1  
2 Default text sizes in org.eclipse.jface.resour...  P3 0 0  
3 [Presentations] [ViewMgmt] Holding mouse down ...  P3 0 0  
4 Parsing of function declarations in stdio.h is...  P2 1 0  

PDE Platform Web Tools priorityLevel 
0   0   0    2 
1   0   0    2 
2   1   0    2 
3   1   0    2 
4   0   0    1 

Je suis actuellement en train de former un algorithme ML qui prendrait le texte 'description' ainsi que la reste des entités numériques sauf 'priority' (mis au rebut) et 'priorityLevel' (étiquettes vraies).

Il s'agit essentiellement d'une application NLP. La question que je vais avoir est que 'description' doit d'abord passer par une fonction 'CountVectorizer()':

X = df['description'] cv = CountVectorizer() X = cv.fit_transform(X)

La sortie qui retourne est incompatible avec le reste de la trame de données quand je vais passer à l'algorithme de formation.

Je dois être en mesure de combiner X après avoir été vectorisée, ainsi df[['CDT', 'JDT', 'PDE', 'Platform', 'Web Tools']] en une seule variable afin de diviser et de train:

X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2,random_state=101)

nb = MultinomialNB() nb.fit(X_train, y_train)

En substance, X devrait contenir le texte vectorisé, avec les variables numériques. Tous les efforts ont jusqu'ici échoué.

J'ai essayé de le faire à travers un pipeline ainsi:

pipeline = Pipeline([ ('bow', CountVectorizer()), # strings to token integer counts. ('classifier', MultinomialNB()), ])

pipeline.fit(X_train,y_train)

Mais j'obtiens des erreurs indiquant que les tailles sont incompatibles.

Est-ce que quelqu'un connaît un moyen plus facile d'accomplir l'apport de la matrice clairsemée retournée par le vectorizer avec les numériques pour que je puisse former l'algorithme?

Toute aide est appréciée.

Edit:

J'ai formé cet algorithme sans problème que ce soit en utilisant uniquement le texte vectorisé. Mon problème se pose lorsque j'essaie d'intégrer des fonctionnalités supplémentaires dans l'ensemble d'apprentissage.

Répondre

0

Selon votre code, vous pouvez compter la fréquence des mots d'informations texte par CountVectorizer()
Mais quand vous appelle code comme ceci:

X = cv.fit_transform(X) 

Vous obtiendrez des données de type <'scipy.sparse.csr.csr_matrix'>, au lieu de <'numpy.ndarray'>. Donc, quand vous faites la fusion de données, il peut y avoir des problèmes.
Vous pouvez utiliser ce code pour obtenir des données de type <'numpy.ndarray'>

X = cv.fit_transform(X).toarray() 

Et les données ressemble à ceci:

print X 
[[1 1 0 0 1] 
[1 0 0 1 1] 
[1 0 1 0 1]] 
print type(x) 
<type 'numpy.ndarray'>