猿问

线性回归负载模型未按预期进行预测

我已经用 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)


慕森王
浏览 224回答 2
2回答

守着星空守着你

您的示例代码显示了joblib.dump和的导入joblib.load- 即使在此摘录中都没有使用。而且,您文件的后缀暗示该模型最初可能是用 保存的joblib.dump(),而不是香草泡菜。但是,此代码显示文件仅通过普通加载pickle.load()- 这可能是错误的根源。该joblib.load()文件表明,它load()可能会做这样的事情由它自己创建多个单独的文件中加载numpy的阵列dump()。(奇怪的是,dump()文档对此不太清楚,但据说dump()有一个可能是文件名列表的返回值。)您可以检查文件的保存位置以查找似乎相关的额外文件,并尝试使用joblib.load()而不是普通的pickle,以查看是否加载了linreg对象的功能更多/更完整的版本。

肥皂起泡泡

(更新:我忽略了.split()在 之后的问题代码中进行的标记化.cleanText(),所以这不是真正的问题。但保留答案以供参考,因为真正的问题是在评论中发现的。)很常见的是,当用户Doc2Vec向infer_vector().&nbsp;Doc2Vec&nbsp;infer_vector()需要一个单词列表,而不是一个字符串。如果提供一个字符串,该函数会将其视为单字符单词列表 - 根据 Python 将字符串建模为字符列表以及字符和单字符字符串的类型合并。大部分这些单字符单词可能不被模型已知的,那些可能是-&nbsp;'i','a'等等-都没有什么意义。因此推断的文档向量将是弱且毫无意义的。(而且,这样的向量,馈入您的线性回归,总是给出中等的预测值,这并不奇怪。)如果您将文本分解为预期的单词列表,您的结果应该会有所改善。但更一般地,提供的话infer_vector()应该进行预处理和记号化的确切不过的培训文档当中。(对您是否正确进行推理的公平测试是为您的某些训练文档推断向量,然后向Doc2Vec模型询问与这些重新推断的向量最接近的文档标签。通常,同一文档的训练时间tag/ID 应该是排名靠前的结果,或者至少是排名靠前的几个结果之一。如果不是,则可能是数据、模型参数或推理中存在其他问题。)
随时随地看视频慕课网APP

相关分类

Python
我要回答