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