簡體   English   中英

我們可以使用 FastAPI 直接在 model.predict() 內部使用 Pydantic 模型(Basemodel)嗎?如果不能,為什么?

[英]Can we use Pydantic models (Basemodel) directly inside model.predict() using FastAPI, and if not ,why?

我將 Pydantic model ( Basemodel ) 與 FastAPI 一起使用並將輸入轉換為dictionary ,然后將其轉換為 Pandas DataFrame以將其分配給model.predict() function 進行機器學習預測,如下所示:

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 模型,我也可以直接工作並避免進行轉換和循環。

首先,您應該為變量/對象使用更具描述性的名稱。 例如:

@app.post('/predict')
def predict(inputs: List[Inputs]):
    for input in inputs:
    # ...

您不能將 Pydantic model 直接傳遞給predict() function,因為它接受數據array ,而不是 Pydantic model。下面列出了可用選項。

選項1

你可以使用:

prediction = model.predict([[input.f1, input.f2, input.f3]])[0]

選項 2

如果您不想使用 Pandas DataFrame,如您的問題所示,即

df = pd.DataFrame([input.dict()])
prediction = model.predict(df)[0]

然后,您可以使用__dict__方法獲取 model 中所有屬性的值並將其轉換為list

prediction = model.predict([list(input.__dict__.values())])[0]

或者,最好使用 Pydantic 的.dict()方法:

prediction = model.predict([list(input.dict().values())])[0]

選項 3

您可以避免循環遍歷單個項目並多次調用predict() function,方法是使用以下代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM