我将 Pydantic 模型 (
Basemodel
) 与 FastAPI 结合使用,并将输入转换为 dictionary
,然后将其转换为 Pandas DataFrame
,将其传递到 model.predict()
函数以进行机器学习预测,如下所示:
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel
import pandas as pd
from typing import List
class Inputs(BaseModel):
f1: float,
f2: float,
f3: str
@app.post('/predict')
def predict(features: List[Inputs]):
output = []
# loop the list of input features
for data in features:
result = {}
# Convert data into dict() and then into a DataFrame
data = data.dict()
df = pd.DataFrame([data])
# get predictions
prediction = classifier.predict(df)[0]
# get probability
probability = classifier.predict_proba(df).max()
# assign to dictionary
result["prediction"] = prediction
result["probability"] = probability
# append dictionary to list (many outputs)
output.append(result)
return output
它工作得很好,我只是不太确定它是否是优化或正确的方法,因为我将输入转换两次以获得预测。另外,我不确定在有“大量”输入的情况下它是否会“快速”工作。这方面有什么改进吗?如果有一种方法(甚至除了使用 Pydantic 模型之外),我可以直接工作并避免经历转换和循环。 首先,您应该为变量/对象使用更具描述性的名称。例如:
您无法将 Pydantic 模型直接传递给
predict()
函数,因为它接受数据
array
,而不是 Pydantic 模型。下面列出了可用选项。
选项1您可以使用以下内容(下面的i
inputs
列表中的项目):
prediction = model.predict([[i.f1, i.f2, i.f3]])[0]
选项2
您可以使用
__dict__
方法获取模型中所有属性的值并将其转换为 list
:
prediction = model.predict([list(i.__dict__.values())])[0]
或者,最好,使用 Pydantic 的
dict()
方法(注:
在 Pydantic V2 中,
dict()
已被 model_dump()
取代):
prediction = model.predict([list(i.dict().values())])[0]
选项3
按如下方式使用 Pandas DataFrame:
import pandas as pd
df = pd.DataFrame([i.dict()])
prediction = model.predict(df)[0]
选项 4
您可以避免循环遍历单个项目并多次调用
predict()
import pandas as pd
df = pd.DataFrame([i.dict() for i in inputs])
prediction = model.predict(df)
probability = model.predict_proba(df)
return {'prediction': prediction.tolist(), 'probability': probability.tolist()}
inputs_list = [list(i.dict().values()) for i in inputs]
prediction = model.predict(inputs_list)
probability = model.predict_proba(inputs_list)
return {'prediction': prediction.tolist(), 'probability': probability.tolist()}