python - 加载 sklearn 模型后无法进行预测

标签 python machine-learning scikit-learn

我使用 Scikit-Learn 创建了一个 ML 模型并保存了它。现在当我加载模型时,我在转换和预测方面遇到了麻烦。 我在 DataFrame 中有 4 个特征。前两个特征是文本的,另外两个是数字的。结果列为 1 或 0。

为了训练我的模型,我使用了 ColumnTransformerCountVectorizer 来转换和向量化文本特征。我指定了要转换/向量化的列的名称。 (文本 1 和文本 2 列)。数值列不需要矢量化,因此 remainder='passthrough' 正在解决这个问题。

部分有效代码:

features = df.iloc[:, :-1]
results = df.iloc[:, -1]

transformerVectoriser = ColumnTransformer(transformers=[('vector word 1', CountVectorizer(analyzer='word', ngram_range=(1, 1), max_features = 12000, stop_words = 'english'), 'text1'),
                                                       ('vector phrase 3', CountVectorizer(analyzer='word', ngram_range=(3, 3), max_features = 2500, stop_words = 'english'), 'text2')],
                                                      remainder='passthrough') # Default is to drop untransformed columns, passthrough == leave columns as they are

x_train, x_test, y_train, y_test = train_test_split(features, results, test_size=0.3, random_state=0)

x_train = transformerVectoriser.fit_transform(x_train)
x_test = transformerVectoriser.transform(x_test)


model = clf.fit(x_train, y_train)
y_pred = model.predict(x_test)

filename = 'ml_model.sav'
pickle.dump(model, open(filename, 'wb'))

filename = 'ml_transformer.sav'
pickle.dump(transformerVectoriser, open(filename, 'wb'))

但是当我想要加载模型并进行预测时,我得到了一个错误:

# LOADING MODEL
model = pickle.load(open('ml_model.sav','rb'))
vectorizer = pickle.load(open('ml_transformer.sav','rb'))

# MAKING PREDICTION
data_for_prediction = vectorizer.transform([data_for_prediction]) #ERROR
print(model.predict_proba(data_for_prediction))

我得到错误:

ValueError: Specifying the columns using strings is only supported for pandas DataFrames

当我训练我的模型时,我使用了 Pandas 数据框,当我想进行预测时,我只是将值放入列表中。所以 data_for_prediction 是列表,看起来像这样:

["text that should be vectorized with vectorizer that i created", "More texts that should be vectorized", 4, 7]

我认为那是错误,因为我在使用 ColumnTransformer 时使用了列名,但现在当我要进行预测时,向量化器不知道要向量化什么。 我的最终模型和矢量化器应该在 API 中使用,而 api 应该只接受 JSON,所以我不想将 JSON 转换为 DataFrame 并将其传递给模型。 有没有办法在我最终的 Flask APP 中不使用 pandas dataframe 来修复这个错误。

最佳答案

训练数据是一个包含以下列的数据框:

x_train.columns

函数 vectorizer.transform() 需要相同格式的数据,因此假设

data_f_p = ["text that should be vectorized", 4,7,0]

对应于与x_train相同的四列,你可以将它变成一个dataframe

data_f_p = pd.DataFrame([data_f_p], columns=x_train.columns)
data_f_p = vectorizer.transform(data_f_p)

关于python - 加载 sklearn 模型后无法进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71543127/

相关文章:

python - 潜在语义分析结果

python - SVM - 将字符串传递给 Python 中的 CountVectorizer 向量化每个字符?

python - Pandas:缩短多列的字符串

python - 按住键 - Python Turtle

python - 在 Tensorflow 中保存模型在 GPU 下不起作用?

python - 如何在流水线后对回归预测进行逆变换?

python - 使用 scikit-learn 进行特征选择

algorithm - Scikit 学习算法表现极差

python - language_check 远程端关闭连接无响应问题

python - 我的神经网络用直线逼近 X^2