дерево выходных решений в конвейерном режиме - PullRequest
1 голос
/ 20 сентября 2019

Привет, поскольку я новичок в методах машинного обучения с использованием библиотеки sklearn, я пытаюсь включить дерево решений в конвейер, а затем сделать прогноз и вывод модели, но, выполнив следующий код, я получил предупреждение:

У объекта 'Pipeline' нет атрибута 'tree _'

Поэтому мне интересно, не поддерживает ли конвейер вывод дерева, и как я могу решить эту проблему?Я также попытался использовать класс solution_tree напрямую, но получил еще одно предупреждение: установка элемента массива с последовательностью.Я знаю, что это происходит, потому что у меня есть векторы с другим измерением, но я все еще не знаю, как справиться с ситуацией.

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.pipeline import Pipeline

from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_text
from sklearn import tree


# a function that reads the corpus, tokenizes it and returns the documents
# and their labels
def read_corpus(corpus_file, use_sentiment):
    documents = []
    labels = []
    with open(corpus_file, encoding='utf-8') as f:
        for line in f:
            tokens = line.strip().split()

            documents.append(tokens[3:])

            if use_sentiment:
                # 2-class problem: positive vs negative
                labels.append( tokens[1] )
            else:
                # 6-class problem: books, camera, dvd, health, music, software
                labels.append( tokens[0] )

    return documents, labels

# a dummy function that just returns its input
def identity(x):
    return x

# read the data and split i into train and test
X, Y = read_corpus('/Users/dengchenglong/Downloads/trainset', use_sentiment=False)
split_point = int(0.75*len(X))
Xtrain = X[:split_point]
Ytrain = Y[:split_point]
Xtest = X[split_point:]
Ytest = Y[split_point:]

# let's use the TF-IDF vectorizer
tfidf = False

# we use a dummy function as tokenizer and preprocessor,
# since the texts are already preprocessed and tokenized.
if tfidf:
    vec = TfidfVectorizer(preprocessor = identity,
                          tokenizer = identity)
else:
    vec = CountVectorizer(preprocessor = identity,
                          tokenizer = identity)


# combine the vectorizer with a Naive Bayes classifier
classifier = Pipeline( [('vec', vec),
                        ('cls', tree.DecisionTreeClassifier())])


# train the classifier on the train dataset
decision_tree = classifier.fit(Xtrain, Ytrain)


# predict the labels of the test data 
Yguess = classifier.predict(Xtest)
tree.plot_tree(classifier.fit(Xtest, Ytest)) 
# report performance of the classifier
print(accuracy_score(Ytest, Yguess))
print(classification_report(Ytest, Yguess))

1 Ответ

0 голосов
/ 20 сентября 2019

Что если вы попробуете это:

from sklearn.pipeline import make_pipeline

# combine the vectorizer with a Naive Bayes classifier
clf = DecisionTreeClassifier()
classifier = make_pipeline(vec,clf)

Как кажется, перед использованием конвейера вы должны инициировать модель, которую вы пытаетесь применить.Дайте мне знать, если это работает, а если нет, то ошибки, которые он возвращает.От: Документация Scikit-learn Пример из: Создание примера конвейера с деревьями

...