J'ai commencé à utiliser scikit learn pour l'extraction de texte. Lorsque j'utilise la fonction standard CountVectorizer et TfidfTransformer dans un pipeline et lorsque j'essaie de combiner avec de nouvelles fonctionnalités (une concaténation de matrice), j'ai un problème de dimension de ligne.FeatureUnion dans scikit klearn et dimension de ligne incompatible
Ceci est mon pipeline:
pipeline = Pipeline([('feats', FeatureUnion([
('ngram_tfidf', Pipeline([('vect', CountVectorizer()),'tfidf', TfidfTransformer())])),
('addned', AddNed()),])), ('clf', SGDClassifier()),])
Ceci est ma classe AddNEd qui ajoutent 30 nouvelles fonctionnalités sur chaque document (échantillon).
class AddNed(BaseEstimator, TransformerMixin):
def __init__(self):
pass
def transform (self, X, **transform_params):
do_something
x_new_feat = np.array(list_feat)
print(type(X))
X_np = np.array(X)
print(X_np.shape, x_new_feat.shape)
return np.concatenate((X_np, x_new_feat), axis = 1)
def fit(self, X, y=None):
return self
Et la première partie de mon programm principal
data = load_files('HO_without_tag')
grid_search = GridSearchCV(pipeline, parameters, n_jobs = 1, verbose = 20)
print(len(data.data), len(data.target))
grid_search.fit(X, Y).transform(X)
Mais j'obtenir ce résultat:
486 486
Fitting 3 folds for each of 3456 candidates, totalling 10368 fits
[CV]feats__ngram_tfidf__vect__max_features=3000....
323
<class 'list'>
(323,) (486, 30)
Et bien sûr, une exception IndexError
return np.concatenate((X_np, x_new_feat), axis = 1)
IndexError: axis 1 out of bounds [0, 1
Quand je avoir les params X dans la fonction de transformation n (classe AddNed) pourquoi je n'ai pas une forme de tableau numpy (486, 3000) pour X. Je n'ai que (323,) forme. Je ne comprends pas parce que si je supprime Feature Union et AddNed() pipeline, CountVectorizer et tf_idf fonctionnent correctement avec les bonnes fonctionnalités et la bonne forme. Si quelqu'un a une idée? Merci beaucoup.
Vous ne pouvez pas supprimer des lignes dans un Pipeline parce que vos transformations affectent seulement 'X', pas' y'. – David
Désolé, peut-être que je manque quelque chose mais je ne supprime pas les lignes ... je pense. Je souhaite ajouter une nouvelle matrice (486, 30) avec une nouvelle fonctionnalité (AddNed Pipeline) à une matrice (486,3000) (Pipeline countizer vectorizer + tdf_idf). Le problème est que je charge 486 fichiers (load_files), je les traite (vectorizer + tdf_idf) mais je n'ai pas 486 samples (seulement 323). – mathieu
Je ne comprends pas ce qui se passe, surtout dans 'do_something'. Si vous pouvez créer un exemple reproductible, je suis sûr que nous pouvons aider. – David