Рассылка загрузки NotFitedError: CountVectorizer - Словарь не установлен - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь классифицировать спам-сообщения, используя scikit machine learning.once, я выгружаю и векторизатор, и классификатор в соответствующие файлы .pkl и импортирую tem в temp.py для прогнозирования. Я получаю эту ошибку:

raise NotFittedError(msg % {'name': type(estimator).__name__})
NotFittedError: CountVectorizer - Vocabulary wasn't fitted

Когда я строю модель, сохраняю модель с именем (my_model.pkl), (vectorizer.pkl) и перезагружаю свое ядро, но когда я загружаю сохраненную модель (sample.pkl) во время прогнозирования образца текста, он дает тот же Volcubary ошибка не найдена.

app.py:

import pandas as pd
df = pd.read_csv('spam.csv', encoding="latin-1")
#Drop the columns not needed
df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)

#Create a new column label which has the same values as v1 then set the ham and spam values to 0 and 1 which is the standard format for our prediction
df['label'] = df['v1'].map({'ham': 0, 'spam': 1})

#Create a new column having the same values as v2 column
df['message'] = df['v2']

#Now drop the v1 and v2
df.drop(['v1', 'v2'], axis=1, inplace=True)

#print(df.head(10))

from sklearn.feature_extraction.text import CountVectorizer

bow_transformer = CountVectorizer().fit_transform(df['message'])

from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report

#Split the data
X_train, X_test, y_train, y_test = train_test_split(bow_transformer, df['label'], test_size=0.33, random_state=42)

#Naive Bayes Classifier
clf = MultinomialNB()
clf.fit(X_train,y_train)
clf.score(X_test,y_test)

y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

pickle.dump(bow_transformer, open("vector.pkl", "wb"))
pickle.dump(clf, open("my_model.pkl", "wb"))

temp.py ::: Я делаю прогноз в этом файле

from sklearn.feature_extraction.text import CountVectorizer


cv=CountVectorizer()


vectorizer = pickle.load(open("my_model.pkl", "rb"))
selector = pickle.load(open("vector.pkl", "rb"))

test_set=["heloo how are u"]

new_test=cv.transform(test_set)

1 Ответ

1 голос
/ 19 апреля 2020

В вашем app.py вы выбираете матрицу документа вместо векторизатора,

pickle.dump(bow_transformer, open("vector.pkl", "wb"))

, где bow_transformer

bow_transformer = CountVectorizer().fit_transform(df['message'])

И в ваш temp.py когда вы откручиваете его, у вас просто есть матрица термина документа. Правильный способ выбрать это будет:

bow_transformer = CountVectorizer().fit(df['message'])
bow_transformer_dtm = bow_transformer.transform(df['message'])

Теперь вы можете выбрать bow_transformer, используя

pickle.dump(bow_transformer, open("vector.pkl", "wb"))

, который будет преобразователем вместо матрицы термина документа.

И в вашем temp.py вы можете снять его и использовать, как показано ниже:

selector = pickle.load(open("vector.pkl", "rb"))
test_set=["heloo how are u"]
new_test=selector.transform(test_set)

Надеюсь, это поможет!

...