Как сохранить классификатор scikit-learn, который использует векторизатор, конвейер и GridSearchV? - PullRequest
0 голосов
/ 01 августа 2020

Я построил классификатор настроений, выполнив следующие действия:

load dataset with pandas

count = CountVectorizer()
bag = count.fit_transform(x)
bag.toarray()
tfidf = TfidfTransformer(use_idf=True, norm="l2",smooth_idf=True)
tfidf.fit_transform(bag).toarray()

from collections import Counter

vocab = Counter()
for text in x:
    for word in text.split(" "):
        vocab[word] += 1

import nltk
from nltk.corpus import stopwords
stop = stopwords.words('english')

vocab_reduced = Counter()
for w, c in vocab.items():
    if not w in stop:
        vocab_reduced[w]=c

def preprocessor(text):
    """ Return a cleaned version of text
    """
    # Remove HTML markup
    text = re.sub('<[^>]*>', '', text)
    # Save emoticons for later appending
    emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text)
    # Remove any non-word character and append the emoticons,
    # removing the nose character for standarization. Convert to lower case
    text = (re.sub('[\W]+', ' ', text.lower()) + ' ' + ' '.join(emoticons).replace('-', ''))
    
    return text

from nltk.stem import PorterStemmer

porter = PorterStemmer()

def tokenizer(text):
    return text.split()

def tokenizer_porter(text):
    return [porter.stem(word) for word in text.split()]

tfidf = TfidfVectorizer(strip_accents=None,
                        lowercase=False,
                        preprocessor=None)

param_grid = [{'vect__ngram_range': [(1, 1)],
               'vect__stop_words': [stop, None],
               'vect__tokenizer': [tokenizer, tokenizer_porter],
               'vect__preprocessor': [None, preprocessor],
               'vect__use_idf':[False],
               'vect__norm':[None],
               "clf__alpha":[0,1],
               "clf__fit_prior":[False,True]},
                ]
multi_tfidf = Pipeline([("vect", tfidf),
                       ( "clf", MultinomialNB())])
gs_multi_tfidf = GridSearchCV(multi_tfidf, param_grid,
                              scoring="accuracy",
                              cv=5,
                              verbose=1,
                              n_jobs=-1)
gs_multi_tfidf.fit(X_train,y_train)

Я попытался сохранить конвейер с помощью joblib и сохранить оба, классификатор и конвейер, чтобы затем использовать его для веб-сайта. Но каждый раз, когда я пытался, ничего не получалось. Я получил либо ValueError: not enough values to unpack (expected 2, got 1) (при сохранении конвейера и классификатора), либо TypeError: 'module' object is not callable при использовании классификатора.

1 Ответ

0 голосов
/ 01 августа 2020

Пожалуйста, попробуйте использовать следующее. Любая конкретная c причина, по которой вы не включаете CountVectorizer () и TfidfTransformer ()? Также следует точно указать, как вы пытались сохранить модель.

multi_tfidf = Pipeline([("vect", TfidfVectorizer()),
                       ( "clf", MultinomialNB())])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...