2015-01-05 2 views
1

Я совершенно новый для sklearn. Я использую Pipeline для использования Vectorizer и классификатора вместе в проблеме с интеллектуальным анализом текста. Вот мой код:Проблемы с конвейерами в sklearn

def create_ngram_model(): 
tfidf_ngrams = TfidfVectorizer(ngram_range=(1, 3), 
analyzer="word", binary=False) 
clf = GaussianNB() 
pipeline = Pipeline([('vect', tfidf_ngrams), ('clf', clf)]) 
return pipeline 


def get_trains(): 
    data=open('../cleaning data/cleaning the sentences/cleaned_comments.csv','r').readlines()[1:] 
    lines=len(data) 
    features_train=[] 
    labels_train=[] 
    for i in range(lines): 
     l=data[i].split(',') 
     labels_train+=[int(l[0])] 
     a=l[2] 
     features_train+=[a] 
    return features_train,labels_train 

def train_model(clf_factory,features_train,labels_train): 
    features_train,labels_train=get_trains() 
    features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(features_train, labels_train, test_size=0.1, random_state=42) 
    clf=clf_factory() 
    clf.fit(features_train,labels_train) 
    pred = clf.predict(features_test) 
    accuracy = accuracy_score(pred,labels_test) 
    return accuracy 

X,Y=get_trains() 
print train_model(create_ngram_model,X,Y) 

Функции, возвращаемые с get_trains(), являются строками. Я получаю эту ошибку.

clf.fit(features_train,labels_train) 
    File "C:\Python27\lib\site-packages\sklearn\pipeline.py", line 130, in fit 
    self.steps[-1][-1].fit(Xt, y, **fit_params) 
    File "C:\Python27\lib\site-packages\sklearn\naive_bayes.py", line 149, in fit 
    X, y = check_arrays(X, y, sparse_format='dense') 
    File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 263, in check_arrays 
    raise TypeError('A sparse matrix was passed, but dense ' 
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array. 

Я столкнулся с этой ошибкой много раз. Затем я просто изменил функции на features_transformed.toarray(), но так как здесь я использую конвейер, я не могу этого сделать, поскольку преобразованная функция возвращается автоматически. Я также пробовал создать новый класс, который возвращает feature_transformed.toarray(), но это слишком бросало ту же ошибку. Я много искал, но не получал. Пожалуйста помоги!!

ответ

0

Есть 2 варианта:

  1. Использование разреженных данных, совместимый классификатор. Например, в документации указано, что Bernoulli Naive Bayes и Multinomial Naive Bayes поддерживают разреженный ввод для fit.

  2. Добавить «уплотнитель» к трубопроводу. Судя по всему, вы получили это неправильно, это один работал для меня (когда мне нужно уплотнить мои скудные данные по пути):

    class Densifier(object): 
        def fit(self, X, y=None): 
         pass 
        def fit_transform(self, X, y=None): 
         return self.transform(X) 
        def transform(self, X, y=None): 
         return X.toarray() 
    

    Убедитесь, что введен в трубопровод это прямо перед Classificator.

+0

Привет, я изменил мой трубопровод к трубопроводу = Pipeline ([('Vect', tfidf_ngrams), ('уплотнить', уплотнитель), ('CLF', КТМ)]). Он по-прежнему дает ошибку Xt = transform.fit_transform (Xt, y, ** fit_params_steps [имя]) ТипError: unbound метод fit_transform() должен быть вызван с экземпляром Densifier в качестве первого аргумента (вместо этого был получен экземпляр csr_matrix) – user2443048

+0

@ user2443048, который ошибка? Теперь вы нарушили свой конвейер, включив класс вместо экземпляра (объект). Замените «Densifier» на 'Densifier()' –

+0

Теперь он дает ошибку памяти. Я думаю, я должен использовать SelectPercentile, чтобы выбрать 10-20% лучших функций, но на самом деле точно не знаю, как я могу связать его с конвейером. – user2443048

Смежные вопросы