python预测模型 存数据库_用保存的sklearn模型进行预测

您的培训部分有3个部分符合数据:CountVectorizer:学习训练数据的词汇表并返回计数

TfidfTransformer:从上一部分学习词汇表的计数,并返回tfidf

LogisticRegression:学习特征系数以获得最佳分类性能。

由于每个部分都在学习有关数据的知识并使用它输出转换后的数据,因此在测试新数据时,您需要拥有所有3个部分。但是您只保存了joblib中的lr,因此其他两个都丢失了,并且丢失了训练数据词汇表和计数。在

现在在您的测试部分,您将初始化新的CountVectorizer和{},并调用fit()(fit_transform()),它将只从这个新数据中学习词汇表。所以单词会比训练单词少。但随后加载了先前保存的LR模型,该模型根据诸如训练数据之类的特性来期望数据。因此出现以下错误:ValueError: X has 130 features per sample; expecting 223086

你需要做的是:

培训期间:

^{pr2}$

测试期间loaded_model = joblib.load("finalized_model.sav")

loaded_cvec = joblib.load("finalized_countvectorizer.sav")

loaded_tfidf_transformer = joblib.load("finalized_tfidftransformer.sav")

# Observe that I only use transform(), not fit_transform()

x_val_vec = loaded_cvec.transform(new_x)

X_val_tfidf = loaded_tfidf_transformer.transform(x_val_vec)

result = loaded_model.predict(X_val_tfidf)

现在你不会得到那个错误。在

建议:

您应该使用TfidfVectorizer来代替CountVectorizer和tfiddTransformer,这样就不必一直使用两个对象。在

除此之外,您还应该使用管道将两者结合起来步骤:-TfidVectorizer和LogisticRegression,因此您只需使用单个对象(这更易于保存和加载以及一般处理)。在

所以编辑培训部分如下:tfidf_vectorizer = TfidfVectorizer()

lr = LogisticRegression()

tfidf_lr_pipe = Pipeline([('tfidf', tfidf_vectorizer), ('lr', lr)])

# Internally your X_train will be automatically converted to tfidf

# and that will be passed to lr

tfidf_lr_pipe.fit(X_train, y_train)

# Similarly here only transform() will be called internally for tfidfvectorizer

# And that data will be passed to lr.predict()

y_preds = tfidf_lr_pipe.predict(x_test)

# Now you can save this pipeline alone (which will save all its internal parts)

filename = 'finalized_model.sav'

joblib.dump(tfidf_lr_pipe, filename)

测试期间,请执行以下操作:loaded_pipe = joblib.load("finalized_model.sav")

result = loaded_model.predict(new_x)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值