我们可以使用 FastAPI 直接在 model.predict() 中使用 Pydantic 模型(BaseModel)吗?如果不能,为什么?

问题描述 投票:0回答:1

我将 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 模型之外),我可以直接工作并避免经历转换和循环。 首先,您应该为变量/对象使用更具描述性的名称。例如:

python machine-learning fastapi prediction pydantic
1个回答
0
投票

您无法将 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()}

或者(如果您不想使用 Pandas DataFrame):

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()}

© www.soinside.com 2019 - 2024. All rights reserved.