Как сохранить и загрузить модели машинного обучения (One-vs-Rest) (PYTHON) - PullRequest
0 голосов
/ 27 декабря 2018

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

Мне известно, что код ниже сохраняет модель, которая подходит для последней категории в цикле.Как это исправить, чтобы модели для каждой категории были сохранены, чтобы при загрузке этих моделей я мог предсказать метку для нового текста?

vectorizer = TfidfVectorizer(strip_accents='unicode', 
stop_words=stop_words, 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 = ['question_body'], axis=1)

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

# Using pipeline for applying linearSVC and one vs rest classifier
SVC_pipeline = Pipeline([
                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
            ])
for category in categories:
    print('... Processing {}'.format(category))

    # train the SVC model using X_dtm & y
    SVC_pipeline.fit(x_train, train[category])
    # compute the testing accuracy of SVC
    svc_prediction = SVC_pipeline.predict(x_test)
    print("SVC Prediction:")
    print(svc_prediction)
    print('Test accuracy is {}'.format(f1_score(test[category], svc_prediction)))
    print("\n")

#save the model to disk
filename = 'svc_model.sav'
pickle.dump(SVC_pipeline, open(filename, 'wb'))

1 Ответ

0 голосов
/ 27 декабря 2018

В вашем коде несколько ошибок.

  1. Вы устанавливаете TfidfVectorizer как на поезде, так и на тесте:

    vectorizer.fit(train_text)
    vectorizer.fit(test_text)
    

    Это неправильно.Вызов fit() не является пошаговым.Он не будет учиться на обоих данных, если вызывается два раза.Самый последний звонок на fit() забудет все о прошлых звонках.Вы никогда не подходите (изучаете) что-то к тестовым данным.

    Что вам нужно сделать, это:

    vectorizer.fit(train_text)
    
  2. Конвейер работает не так, как вы думаете:

    # Using pipeline for applying linearSVC and one vs rest classifier
    SVC_pipeline = Pipeline([
                             ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
                            ])
    

    Видите, чтовы передаете LinearSVC внутри OneVsRestClassifier, поэтому он будет автоматически использовать это без необходимости Pipeline.Pipeline здесь ничего не сделает.Pipeline полезно, когда вы хотите последовательно передавать данные через несколько моделей.Примерно так:

    pipe = Pipeline([
                     ('pca', pca), 
                     ('logistic', LogisticRegression())
                    ])
    

    То, что будет сделано выше pipe, это передать данные в PCA, которые преобразуют их.Затем эти новые данные передаются в LogisticRegression и т. Д.

    Правильное использование конвейера в вашем случае может быть:

      SVC_pipeline = Pipeline([
                              ('vectorizer', vectorizer)
                              ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
                             ])
    

    См. Другие примеры здесь:

  3. Вам необходимо больше рассказать о вашем "categories".Покажите несколько примеров ваших данных.Вы нигде не используете y_train и y_test.Отличаются ли категории от "question_body"?

...