2016-11-10 2 views
1

Ich möchte eine Pipeline in sklearn verwenden, wie folgt aus:sklearn Pipeline fit: Attribute: untere nicht gefunden

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) 

Allerdings erhalte ich diese Fehlermeldung:

AttributeError: lower not found 

ich ausgesehen haben in diesem Beitrag:

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

aber ich vorbei eine Liste von Bytes an den Vektorizer, so dass das Problem nicht sein sollte.

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]) 

Jetzt bekomme ich den Fehler:

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

2. 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

warte, warum hast du einen Zug gemacht, Test Split und dann kfold? Falten werden normalerweise verwendet, wenn Sie nicht genug zum Testen haben. Sie falten auch auf die corpus.data, die sich wahrscheinlich von Ihrem X_train unterscheidet, der 50% kürzer wäre. – Ale

+0

@Ale: Okay, ich glaube ich habe kfold falsch verstanden. Ich dachte, es wäre eine Möglichkeit, Test- und Trainingsdaten zu mischen. Die zweite Bearbeitung wirft keinen Fehler auf, aber wie verwende ich jetzt die Funktion predyd()? – user3813234

+0

das ist, wo Sie die Indizes verwenden, in der kfold, um Zug und Testdaten zu extrahieren, siehe meine bearbeitete Antwort. Oder benutze kfold nicht und trainiere auf X_train und test auf X_test – Ale

Antwort

3

Sie sind nicht richtig in die Pipeline verwenden. Sie müssen die Daten nicht vektorisiert weitergeben, die Idee ist, dass die Pipeline die Daten vektorisiert.

# 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

Vielen Dank für Ihre Antwort! Ich habe meinen Code geändert, aber ich erhalte jetzt einen neuen Fehler! Könntest du noch einen Blick darauf werfen? – user3813234

+0

@ user3813234 die Falten sollten zu corpus.data und corpus.target erfolgen – Ale

Verwandte Themen