Сохранить модель для последующего прогнозирования (OneVsRest) - PullRequest
0 голосов
/ 30 января 2019

Я хотел бы знать, как сохранить OnevsRest классификатор модель для последующего прогнозирования.

У меня возникла проблема с его сохранением, посколькуэто также подразумевает сохранение векторизатора.Я узнал в этом сообщении .

Вот модель, которую я создал:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(strip_accents='unicode', analyzer='word', ngram_range=(1,3), norm='l2')
vectorizer.fit(train_text)
vectorizer.fit(test_text)

x_train = vectorizer.transform(train_text)
y_train = train.drop(labels = ['id','comment_text'], axis=1)

x_test = vectorizer.transform(test_text)
y_test = test.drop(labels = ['id','comment_text'], axis=1)


from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.multiclass import OneVsRestClassifier

%%time

# Using pipeline for applying logistic regression and one vs rest classifier
LogReg_pipeline = Pipeline([
                ('clf', OneVsRestClassifier(LogisticRegression(solver='sag'), n_jobs=-1)),
            ])

for category in categories:
    printmd('**Processing {} comments...**'.format(category))

    # Training logistic regression model on train data
    LogReg_pipeline.fit(x_train, train[category])

    # calculating test accuracy
    prediction = LogReg_pipeline.predict(x_test)
    print('Test accuracy is {}'.format(accuracy_score(test[category], prediction)))
    print("\n") 

Любая помощь будет очень признательна.

С уважением

1 Ответ

0 голосов
/ 30 января 2019

Используя joblib, вы можете сохранить любой Scikit-learn Pipeline в комплекте со всеми его элементами, поэтому он включает также TfidfVectorizer.

Здесь я переписал ваш пример, используя первые 200 примеровнабор данных Newsgroups20:

from sklearn.datasets import fetch_20newsgroups
data = fetch_20newsgroups()

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
from sklearn.multiclass import OneVsRestClassifier

vectorizer = TfidfVectorizer(strip_accents='unicode', analyzer='word', ngram_range=(1,3), norm='l2')

x_train = data.data[:100]
y_train = data.target[:100]

x_test =  data.data[100:200]
y_test = data.target[100:200]

# Using pipeline for applying logistic regression and one vs rest classifier
LogReg_pipeline = Pipeline([
    ('vectorizer', vectorizer),
    ('clf', OneVsRestClassifier(LogisticRegression(solver='sag', 
                                                   class_weight='balanced'), 
                                n_jobs=-1))
                           ])

# Training logistic regression model on train data
LogReg_pipeline.fit(x_train, y_train)

В приведенном выше коде вы просто начинаете определять данные о поездах и тестах и ​​создаете экземпляр своего TfidfVectorizer.Затем вы определяете свой конвейер, содержащий как векторизатор, так и классификатор OVR, и подгоняете его к обучающим данным.Он научится предсказывать все классы одновременно.

Теперь вы просто сохраняете весь подобранный конвейер, как если бы он был одним предиктором, используя joblib:

from joblib import dump, load
dump(LogReg_pipeline, 'LogReg_pipeline.joblib') 

Вся ваша модель не являетсясохраняется на диск под именем «LogReg_pipeline.joblib».Вы можете отозвать его и использовать его непосредственно для необработанных данных с помощью следующего фрагмента кода:

clf = load('LogReg_pipeline.joblib') 
clf.predict(x_test)

Вы получите прогнозы для необработанного текста, поскольку конвейер автоматически его векторизирует.

...