我使用 Scikit-Learn 创建了一个 ML 模型并保存了它。现在当我加载模型时,我在转换和预测方面遇到了麻烦。 我在 DataFrame 中有 4 个特征。前两个特征是文本的,另外两个是数字的。结果列为 1 或 0。
为了训练我的模型,我使用了 ColumnTransformer
和 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
数据框,当我想进行预测时,我只是将值放入列表中。所以 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/