0

Ich habe begonnen, scikit lernen für die Extraktion von Texten zu verwenden. Wenn ich Standardfunktion CountVectorizer und TfidfTransformer in einer Pipeline verwende und wenn ich versuche, mit neuen Features (eine Konkatenz der Matrix) zu kombinieren, habe ich ein Problem Zeilendimension.FeatureUnion in scikit klearn und inkompatible Zeilendimension

Dies ist meine Pipeline:

pipeline = Pipeline([('feats', FeatureUnion([ 
('ngram_tfidf', Pipeline([('vect', CountVectorizer()),'tfidf', TfidfTransformer())])), 
('addned', AddNed()),])), ('clf', SGDClassifier()),]) 

Dies ist meine Klasse AddNEd, die auf jedes Dokument (Probe) 30 Nachrichten Funktionen hinzuzufügen.

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 

Und der erste Teil meines Hauptprogrammes

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) 

Aber ich habe dieses Ergebnis:

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) 

Und natürlich eine Indexerror Ausnahme

return np.concatenate((X_np, x_new_feat), axis = 1) 
IndexError: axis 1 out of bounds [0, 1 

Als ich habe die params X in transform functio n (Klasse AddNed), warum ich kein numpy Array (486, 3000) für X habe. Ich habe nur (323,) Form. Ich verstehe das nicht, denn wenn ich Feature Union und AddNed() -Pipeline lösche, funktionieren CountVectorizer und tf_idf ordnungsgemäß mit den richtigen Features und der richtigen Form. Wenn jemand eine Idee hat? Vielen Dank.

+0

gefunden. Sie können Zeilen innerhalb einer Pipeline nicht entfernen, da Ihre Transformationen nur 'X' und nicht' y' betreffen. – David

+0

Sorry, vielleicht vermisse ich etwas, aber ich entferne keine Zeilen ... denke ich. Ich mag eine (486, 30) neue Matrix mit neuen Features (AddNed Pipeline) zu einer (486,3000) Matrix (Pipeline Zählung vectorizer + tdf_idf) hinzuzufügen. Das Problem ist, dass ich zu laden (load_files) 486 Dateien, ich verarbeiten sie zu (vectorizer + tdf_idf), aber ich habe keine 486 Proben (nur 323). – mathieu

+0

Ich verstehe nicht, was vor sich geht, besonders in 'do_something'. Wenn Sie ein reproduzierbares Beispiel erstellen können, sind wir sicher, dass wir Ihnen helfen können. – David

Antwort

0

OK, ich werde versuchen, mehr zu erklären. Als ich do_something sagen, sage ich do_nothing mit X. In der Klasse AddNed wenn ich umschreiben:

def transform (self, X, **transform_params): 
    print(X.shape) #Print X shape on first line before do anything 
    print(type(X)) #For information 
    do_nothing_withX #Construct a new matrix with a shape (number of samples, 30 new features) 
    x_new_feat = np.array(list_feat) #Get my new matrix in numpy array 
    print(x_new_feat.shape) 
    return x_new_feat 

In diesem Fall oben verwandeln, ich verketten nicht X-Matrix und neue Matrix. Ich nehme an Features Vereinigung tun ... Und mein Ergebnis:

486 486 #Here it is a print (data.data, data.target) 
Fitting 3 folds for each of 3456 candidates, totalling 10368 fits 
[CV] clf__alpha=1e-05, vect__max_df=0.1, clf__penalty=l2, feats__tfidf__use_idf=True, feats__tfidf__norm=l1, clf__loss=hinge, vect__ngram_range=(1, 1), clf__n_iter=10, vect__max_features=3000 
(323, 3000) # X shape Matrix 
<class 'scipy.sparse.csr.csr_matrix'> 
(486, 30) # My new matrix shape 
Traceback (most recent call last): 
File "pipe_line_learning_union.py", line 134, in <module> 
grid_search.fit(X, Y).transform(X) 
..... 
File "/data/maclearnVE/lib/python3.4/site-packages/scipy/sparse/construct.py", line 581, in bmat 
raise ValueError('blocks[%d,:] has incompatible row dimensions' % i) 
ValueError: blocks[0,:] has incompatible row dimensions 

Um weiter zu gehen, nur um zu sehen, wenn, wenn ich auf gridsearchCV eine Kreuzvalidierung setzen, nur Stichprobengröße zu ändern:

grid_search = GridSearchCV(pipeline, parameters, cv=2, n_jobs = 1, verbose = 20) 

ich habe dieses Ergebnis:

486 486 
Fitting 2 folds for each of 3456 candidates, totalling 6912 fits 
[CV] ...... 
(242, 3000) #This a new sample size due to cross validation 
<class 'scipy.sparse.csr.csr_matrix'> 
(486, 30) 
.......... 
ValueError: blocks[0,:] has incompatible row dimensions 

natürlich, wenn es notwendig ist, kann ich den gesamten Code von do_nothing_withX geben. Aber was ich nicht verstehe, ist, warum Sample-Größe mit der Pipeline countvectorizer + Tdf_idf ist es nicht gleich der Anzahl der Dateien mit slearn.datasets.load_files() -Funktion laden.

0

Sie wahrscheinlich es jetzt gelöst haben, aber jemand anderes das gleiche Problem haben:

(323, 3000) # X shape Matrix 
<class 'scipy.sparse.csr.csr_matrix'> 

AddNed versucht, eine Matrix mit einer Sparse Matrix, die spärliche Matrix werden soll umgewandelt verketten zu dichte Matrix zuerst. Ich habe den gleichen Fehler bei der Verwendung des Ergebnisses CountVectorizer