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))