Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用保存的sklearn模型进行预测_Python_Pandas_Numpy_Scikit Learn_Logistic Regression - Fatal编程技术网

Python 利用保存的sklearn模型进行预测

Python 利用保存的sklearn模型进行预测,python,pandas,numpy,scikit-learn,logistic-regression,Python,Pandas,Numpy,Scikit Learn,Logistic Regression,我有一个保存的逻辑回归模型,我使用训练数据进行训练,并使用joblib保存。我试图用不同的脚本加载这个模型,传递新数据,并根据新数据进行预测 我收到以下错误“sklearn.exceptions.NotFitteError:CountVectorier-词汇表未安装”。是否需要重新拟合数据?我本以为能够保存模型的意义在于不必这样做 下面是我使用的代码,不包括数据清理部分。任何有助于实现预测的帮助都将不胜感激 new_df = pd.DataFrame(latest_tweets,columns=

我有一个保存的逻辑回归模型,我使用训练数据进行训练,并使用joblib保存。我试图用不同的脚本加载这个模型,传递新数据,并根据新数据进行预测

我收到以下错误“sklearn.exceptions.NotFitteError:CountVectorier-词汇表未安装”。是否需要重新拟合数据?我本以为能够保存模型的意义在于不必这样做

下面是我使用的代码,不包括数据清理部分。任何有助于实现预测的帮助都将不胜感激

new_df = pd.DataFrame(latest_tweets,columns=['text'])
new_df.to_csv('new_tweet.csv',encoding='utf-8')
csv = 'new_tweet.csv'

latest_df = pd.read_csv(csv)
latest_df.dropna(inplace=True)
latest_df.reset_index(drop=True,inplace=True)
new_x = latest_df.text

loaded_model = joblib.load("finalized_mode.sav")

tfidf_transformer = TfidfTransformer()
cvec = CountVectorizer()
x_val_vec = cvec.transform(new_x)
X_val_tfidf = tfidf_transformer.transform(x_val_vec)

result = loaded_model.predict(X_val_tfidf)
print (result)

您没有安装计数矢量器

你应该这样做

cvec = CountVectorizer()
x_val_vec = cvec.fit_transform(new_x)
X_val_tfidf = tfidf_transformer.fit_transform(x_val_vec)
类似地,
TfidTransformer
必须这样使用

cvec = CountVectorizer()
x_val_vec = cvec.fit_transform(new_x)
X_val_tfidf = tfidf_transformer.fit_transform(x_val_vec)

您的培训部分有3个部分与数据相匹配:

  • CountVectorizer
    :学习训练数据的词汇表并返回计数

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

  • 逻辑回归
    :学习特征的系数以获得最佳分类性能

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

现在,在测试部分,您正在初始化新的
CountVectorizer
TfidfTransformer
,并调用
fit()
fit\u transform()
),这将仅从新数据学习词汇表。因此,单词将少于训练单词。但随后加载了先前保存的LR模型,该模型根据训练数据等功能需要数据。因此,这个错误:

ValueError: X has 130 features per sample; expecting 223086
您需要做的是:

培训期间: 测试期间 现在你不会犯那个错误了

建议: 您应该同时使用CountVectorizer和TfidTransformer,这样您就不必一直使用两个对象

除此之外,您还应该使用管道将两个步骤结合起来:-TfidfVectorizer和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)

谢谢,现在它的意思是“result=loaded_model.predict(X_val_tfidf)AttributeError:'CountVectorizer'对象没有属性'predict'”。您确定文件
finalized_mode.sav
是经过训练的模型吗。?。根据错误,它是一个保存的
countvectorier
文件。确保正确保存经过训练的LR模型谢谢我将其保存为countvectorizer。在修复并再次运行它之后,我得到以下错误。“ValueError:X每个示例有130个功能;预期为223086”。我只使用了1个模型,所以我不确定为什么会发生这种情况。它说该模型是在具有不同数量特征的数据集上训练的。您正在尝试预测具有不同特征的数据集。试着打印你用来训练模型的X的形状和你用来预测im预测的X形状(12129)。对于训练,形状是(119703022086),我能够使用测试集(39901122086)进行预测。我读的csv少了一列,整体条目也少了很多,这就是为什么形状不同的原因吗?非常感谢你的详细回答,我真的很感激。我已经实现了管道,使事情更容易阅读,培训和测试正在进行中。我目前正在加载完成的模型到另一个脚本和输入原始文本,它给我的预测。这是正确的吗?因为流水线,我不再需要计算矢量化和tdidf了?@dmnte是的。这些已包含在管道中,因此已保存。不需要单独保存它们