0

Я начал использовать scikit для изучения извлечения текста. Когда я использую стандартную функцию CountVectorizer и TfidfTransformer в конвейере, и когда я пытаюсь объединиться с новыми функциями (конкатенацией матрицы), у меня возникает проблема измерения строк.FeatureUnion in scikit klearn и несовместимый размер строки

Это мой трубопровод:

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

Это мой класс AddNEd, который добавляет 30 новостей особенности на каждом документов (образец).

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 

И первая часть моей основной программе

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) 

Но я получаю этот результат:

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) 

и, конечно, исключение IndexError

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

Когда я имеют параметры X в функции преобразования n (класс AddNed), почему у меня нет формы numpy array (486, 3000) для X. У меня есть только форма (323,). Я не понимаю, потому что, если я удаляю конвейер Feature Union и AddNed(), CountVectorizer и tf_idf работают правильно с правильными функциями и правильной формой. Если у кого-то есть идея? Большое спасибо.

+0

Вы не можете удалять строки внутри Pipeline, потому что ваши преобразования влияют только на 'X', а не' y'. – David

+0

Извините, может быть, я что-то пропустил, но я не удаляю строки ... Думаю. Я хочу добавить (486, 30) новую матрицу с новой функцией (AddNed Pipeline) в матрицу (486,3000) (счетчик счетчиков трубопроводов + tdf_idf). Проблема в том, что я загружаю (load_files) 486 файлов, обрабатываю их (vectorizer + tdf_idf), но у меня нет 486 выборок (всего 323). – mathieu

+0

Я не понимаю, что происходит, особенно в 'do_something'. Если вы можете создать воспроизводимый пример, я уверен, что мы можем помочь. – David

ответ

0

Хорошо, я постараюсь дать больше объяснений. Когда я говорю do_something, я говорю do_nothing с X. В классе AddNed если переписать:

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 

В этом случае преобразования выше, я не конкатенации X матрицы и новую матрицу. Я полагаю, особенности объединение сделать это ... И мой результат:

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 

Чтобы идти дальше, просто чтобы увидеть, если если я ставлю крест проверки на gridsearchCV, просто изменить размер выборки:

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

у меня есть этот результат:

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 

конечно, если это необходимо, я могу дать весь код do_nothing_withX. Но я не понимаю, поэтому размер выборки с конвейером countvectorizer + tdf_idf не равен количеству загружаемых файлов с функцией sklearn.datasets.load_files().

0

Вы, наверное, решить ее сейчас, но кто-то может иметь ту же проблему:

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

AddNed пытается конкатенировать матрицу с разреженной матрицей, разреженная матрица должна быть преобразована в плотный матрица первая. Я нашел ту же ошибку, пытающуюся использовать результат CountVectorizer