Модель линейной регрессионной нагрузки не предсказывает, как ожидалось - PullRequest
0 голосов
/ 17 марта 2019

Я обучил модель линейной регрессии со sklearn для оценки 5 звезд, и это достаточно хорошо. Я использовал Doc2vec для создания своих векторов и сохранил эту модель. Затем я сохраняю модель линейной регрессии в другой файл. Я пытаюсь загрузить модель Doc2vec и модель линейной регрессии и попытаться предсказать другой обзор.

В этом прогнозе есть что-то очень странное: независимо от того, какое входное значение оно всегда прогнозирует около 2.1-3.0.

Дело в том, что у меня есть предположение, что оно предсказывает в среднем 5 (что составляет 2,5 +/-), но это не так. При обучении модели я напечатал прогнозное значение и фактическое значение тестовых данных, и они обычно находятся в диапазоне 1-5. Поэтому я думаю, что с загрузочной частью кода что-то не так. Это мой код загрузки:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from bs4 import BeautifulSoup
from joblib import dump, load
import pickle
import re

model = Doc2Vec.load('../vectors/750000/doc2vec_model')

def cleanText(text):
    text = BeautifulSoup(text, "lxml").text
    text = re.sub(r'\|\|\|', r' ', text) 
    text = re.sub(r'http\S+', r'<URL>', text)
    text = re.sub(r'[^\w\s]','',text)
    text = text.lower()
    text = text.replace('x', '')
    return text

review = cleanText("Horrible movie! I don't recommend it to anyone!").split()
vector = model.infer_vector(review)

pkl_filename = "../vectors/750000/linear_regression_model.joblib"
with open(pkl_filename, 'rb') as file:  
    linreg = pickle.load(file)

review_vector = vector.reshape(1,-1)
predict_star = linreg.predict(review_vector)
print(predict_star)

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Ваш пример кода показывает импорт как joblib.dump, так и joblib.load - даже если ни один из них не используется в этом отрывке.И суффикс вашего файла говорит о том, что модель могла быть изначально сохранена с joblib.dump(), а не с ванильным огурцом.

Но этот код показывает, что файл загружается только через обычный pickle.load() - что может быть источником ошибки.

Документы joblib.load() предполагают, что его load() может выполнять такие действия, как загрузка массивов-пустышек из нескольких отдельных файлов, созданных его собственным dump().(Как ни странно, документы dump() менее понятны по этому вопросу, но предположительно dump() имеет возвращаемое значение, которое может быть список имен файлов.)

Вы можете проверить, гдефайл был сохранен для дополнительных файлов, которые кажутся связанными, и попробуйте использовать joblib.load() вместо простого выбора, чтобы проверить, загружает ли это более функциональную / более полную версию вашего linreg объекта.

0 голосов
/ 17 марта 2019

( Обновление: Я пропустил токенизацию .split(), выполняемую в коде вопроса после .cleanText(), так что это не реальная проблема. Но держать ответ для справки и потому, что реальная проблемабыл обнаружен в комментариях.)

Очень часто пользователи получают таинственно слабые результаты от Doc2Vec, когда они предоставляют простую строку для infer_vector().Doc2Vec infer_vector() требует список слов, не строка.

Если предоставить строку, функция будет видеть ее как слова со списком из одного символа - в соответствии с моделированием строк в Python как со списком символов, а также с типом-сочетанием символов и односимвольных символов.строки.Большинство этих односимвольных слов, вероятно, не известны модели, а те, которые могут быть - 'i', 'a' и т. Д. - не очень значимы.Таким образом, предполагаемый вектор документов будет слабым и бессмысленным.(И это не удивительно, что такой вектор, поданный к вашей линейной регрессии, всегда дает среднее прогнозируемое значение.)

Если вы разбите текст на ожидаемый список слов, ваши результаты должны улучшиться,

Но в более общем смысле слова, предоставленные для infer_vector(), должны быть предварительно обработаны и токенизированы точно , однако учебные документы были.

(Справедливый тест на вменяемость того,Чтобы правильно сделать вывод, нужно вывести векторы для некоторых из ваших обучающих документов, а затем запросить модель Doc2Vec для тегов doc, ближайших к этим повторно выведенным векторам. В общем случае тег / идентификатор того же самого документа должен бытьлучший результат или, по крайней мере, один из лучших. Если это не так, могут быть другие проблемы с данными, параметрами модели или выводом.)

...