1

J'ai des vecteurs de flottants que j'ai créés à partir de l'algorithme doc2vec, et leurs étiquettes. Quand je les utilise avec un classificateur simple, cela fonctionne normalement et donne une précision attendue. Code de travail est ci-dessous:Le pipeline Scikit-learn pour les mêmes données et étapes échoue à classifier

from sklearn.svm import LinearSVC 
import pandas as pd 
import numpy as np 

train_vecs #ndarray (20418,100) 
#train_vecs = [[0.3244, 0.3232, -0.5454, 1.4543, ...],...] 
y_train #labels 
test_vecs #ndarray (6885,100) 
y_test #labels 

classifier = LinearSVC() 
classifier.fit(train_vecs, y_train) 
print('Test Accuracy: %.2f'%classifier.score(test_vecs, y_test)) 

Mais maintenant, je veux le déplacer dans un pipeline, parce que dans l'avenir je prévois de faire une union fonction avec des caractéristiques différentes. Ce que je fais est de déplacer les vecteurs dans une trame de données, puis d'utiliser 2 transformateurs personnalisés pour i) sélectionner la colonne, ii) changer le type de tableau. Etrangement les mêmes données exactes, avec exactement la même forme, le type et le type .. donne une précision de 0,0005. Ce qui n'a aucun sens pour moi, cela devrait donner une précision presque égale. Après le transformateur ArrayCaster, les formes et les types des entrées sont exactement les mêmes que précédemment. Le tout a été vraiment frustrant.

from sklearn.svm import LinearSVC 
import pandas as pd 
import numpy as np 
from sklearn.pipeline import Pipeline 
from sklearn.base import BaseEstimator, TransformerMixin 

# transformer that picks a column from the dataframe 
class ItemSelector(BaseEstimator, TransformerMixin): 

    def __init__(self, column): 
     self.column = column 

    def fit(self, X, y=None, **fit_params): 
     return self 

    def transform(self, X): 
     print('item selector type',type(X[self.column])) 
     print('item selector shape',len(X[self.column])) 
     print('item selector dtype',X[self.column].dtype) 
     return (X[self.column]) 

# transformer that converts the series into an ndarray 
class ArrayCaster(BaseEstimator, TransformerMixin): 
    def fit(self, x, y=None): 
     return self 

    def transform(self, data): 
     print('array caster type',type(np.array(data.tolist()))) 
     print('array caster shape',np.array(data.tolist()).shape) 
     print('array caster dtype',np.array(data.tolist()).dtype) 
     return np.array(data.tolist()) 


train_vecs #ndarray (20418,100) 
y_train #labels 
test_vecs #ndarray (6885,100) 
y_test #labels 

train['vecs'] = pd.Series(train_vecs.tolist()) 
val['vecs'] = pd.Series(test_vecs.tolist()) 


classifier = Pipeline([ 
      ('selector', ItemSelector(column='vecs')), 
      ('array', ArrayCaster()), 
      ('clf',LinearSVC())]) 

classifier.fit(train, y_train) 
print('Test Accuracy: %.2f'%classifier.score(test, y_test)) 

Répondre

0

Ok désolé pour cela .. Je l'ai compris. L'erreur est assez ennuyante à remarquer. Tout ce que je devais faire est de les convertir en liste et de les placer dans la base de données, au lieu de les convertir en séries. Modifier cette

train['vecs'] = pd.Series(train_vecs.tolist()) 
val['vecs'] = pd.Series(test_vecs.tolist()) 

dans:

train['vecs'] = list(train_vecs) 
val['vecs'] = list(test_vecs)