我使用 Scikit-Learn 创建了一个 ML 模型并保存了它。现在,当我加载模型时,我在转换和预测方面遇到了麻烦。
我在 DataFrame 中有 4 个功能。前两个特征是文本特征,另外两个特征是数字特征。结果列为 1 或 0。
为了训练我的模型,我使用了ColumnTransformer
and CountVectorizer
用于文本特征的转换和矢量化。我指定了要转换/矢量化的列的名称。
(文本 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
dataframe,当我想进行预测时,我只是将值放入列表中。所以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 并将其传递给模型。
有没有办法在不使用 pandas 的情况下修复此错误dataframe
在我最后的 Flask 应用程序中。