2016-11-10 2 views
1

Я хотел бы использовать трубопровод в sklearn, как это:sklearn трубопровод подходит: AttributeError: нижний не найден

corpus = load_files('corpus/train') 

stop_words = [x for x in open('stopwords.txt', 'r').read().split('\n')] # Uppercase! 

countvec = CountVectorizer(stop_words=stop_words, ngram_range=(1, 2)) 

X_train, X_test, y_train, y_test = train_test_split(corpus.data, corpus.target, test_size=0.9, 
                random_state=0) 
x_train_counts = countvec.fit_transform(X_train) 
x_test_counts = countvec.transform(X_test) 

k_fold = KFold(n=len(corpus.data), n_folds=6) 
confusion = np.array([[0, 0], [0, 0]]) 

pipeline = Pipeline([ 
    ('vectorizer', CountVectorizer(stop_words=stop_words, ngram_range=(1, 2))), 
    ('classifier', MultinomialNB()) ]) 

for train_indices, test_indices in k_fold: 

    pipeline.fit(x_train_counts, y_train) 
    predictions = pipeline.predict(x_test_counts) 

Однако, я получаю эту ошибку:

AttributeError: lower not found 

Я смотрел на этом посту:

AttributeError: lower not found; using a Pipeline with a CountVectorizer in scikit-learn

, но я передаю список байтов к vectorizer, так что не должно быть проблемой.

EDIT

corpus = load_files('corpus') 

stop_words = [x for x in open('stopwords.txt', 'r').read().split('\n')] 

X_train, X_test, y_train, y_test = train_test_split(corpus.data, corpus.target, test_size=0.5, 
                random_state=0) 

k_fold = KFold(n=len(corpus.data), n_folds=6) 
confusion = np.array([[0, 0], [0, 0]]) 

pipeline = Pipeline([ 
    ('vectorizer', CountVectorizer(stop_words=stop_words, ngram_range=(1, 2))), 
    ('classifier', MultinomialNB())]) 

for train_indices, test_indices in k_fold: 
    pipeline.fit(X_train[train_indices], y_train[train_indices]) 
    predictions = pipeline.predict(X_test[test_indices]) 

Теперь я получаю ошибку:

TypeError: only integer arrays with one element can be converted to an index 

2ND EDIT

corpus = load_files('corpus') 

stop_words = [y for x in open('stopwords.txt', 'r').read().split('\n') for y in (x, x.title())] 

k_fold = KFold(n=len(corpus.data), n_folds=6) 
confusion = np.array([[0, 0], [0, 0]]) 

pipeline = Pipeline([ 
    ('vectorizer', CountVectorizer(stop_words=stop_words, ngram_range=(1, 2))), 
    ('classifier', MultinomialNB())]) 

for train_indices, test_indices in k_fold: 
    pipeline.fit(corpus.data, corpus.target) 
+0

Подождите, почему вы сделали поезд, испытали раскол, а затем kfold? складки обычно используются, когда у вас недостаточно тестов. Также вы складываетесь на corpus.data, который, вероятно, отличается от вашего X_train, который будет на 50% короче. – Ale

+0

@Ale: Хорошо, я думаю, что неправильно понял kfold. Я думал, что это способ перетасовать тестовые и обучающие данные. Второе редактирование не вызывает ошибку, но как теперь я могу использовать функцию pred()? – user3813234

+0

, где вы используете индексы, в kfold, для извлечения данных поезда и тестирования, см. Мой отредактированный ответ. Или не используйте kfold и поезд на X_train и тест на X_test – Ale

ответ

3

Вы не правильно с помощью трубопровода. Вам не нужно передавать данные в векторе, идея состоит в том, что конвейер векторизует данные.

# This is done by the pipeline 
# x_train_counts = countvec.fit_transform(X_train) 
# x_test_counts = countvec.transform(X_test) 

k_fold = KFold(n=len(corpus.data), n_folds=6) 
confusion = np.array([[0, 0], [0, 0]]) 

pipeline = Pipeline([ 
    ('vectorizer', CountVectorizer(stop_words=stop_words, ngram_range=(1, 2))), 
    ('classifier', MultinomialNB()) ]) 

# also you are not using the indices... 
for train_indices, test_indices in k_fold: 

    pipeline.fit(corpus.data[train_indices], corpus.target[train_indices]) 
    predictions = pipeline.predict(corpus.data[test_indices]) 
+0

Спасибо за ваш ответ! Я изменил свой код, но теперь я получаю новую ошибку! Не могли бы вы посмотреть еще? – user3813234

+0

@ user3813234 складки должны быть сделаны на corpus.data и corpus.target – Ale