1. Введение

В сфере здравоохранения точное и своевременное прогнозирование заболеваний может иметь решающее значение для результатов лечения пациентов. Одним из таких состояний является сепсис, опасная для жизни реакция на инфекцию. В этой статье мы рассмотрим, как создать API прогнозирования сепсиса с использованием платформы FastAPI. FastAPI предоставляет высокопроизводительную и простую в использовании платформу для разработки надежных API с помощью Python.

1.1 Введение в FastAPI

FastAPI — это современная и высокопроизводительная веб-инфраструктура для создания API с помощью Python. Он предлагает удобный опыт разработки и масштабируемость, что делает его популярным выбором среди разработчиков. С помощью FastAPI разработчики могут использовать возможности Python для создания надежных API-интерфейсов, которые обрабатывают сложную логику, обрабатывают большие объемы данных и предоставляют ответы в режиме реального времени. Он сочетает в себе сильные стороны популярных фреймворков, таких как Flask и Django, и обладает своими уникальными преимуществами. Построенный на основе асинхронной веб-инфраструктуры Starlette, FastAPI может эффективно обрабатывать параллельные запросы и высокие нагрузки трафика.

1.2 Почему FastAPI

  • Высокая производительность: FastAPI использует асинхронные возможности и подсказки типов для эффективной работы веб-фреймворка.
  • Простота использования: декларативный подход FastAPI и автоматически создаваемая документация упрощают разработку и обслуживание API.
  • Современные функции: FastAPI поддерживает внедрение зависимостей, OAuth2, проверку запросов и WebSocket для современной веб-разработки.
  • Безопасность типов: подсказки типов FastAPI обеспечивают проверку данных и сериализацию, повышая надежность и читабельность кода.
  • Совместимость: FastAPI легко интегрируется с популярными библиотеками и фреймворками Python, такими как SQLAlchemy и Pydantic.
  • Масштабируемость: FastAPI обрабатывает высокие нагрузки и параллельные запросы благодаря своей асинхронной архитектуре.
  • Активное сообщество: FastAPI имеет активное сообщество и исчерпывающую документацию для поддержки и обучения.

2. Подготовка модели

2. 1 Обзор существующей модели прогнозирования сепсиса

Модель прогнозирования, интегрированная в этот API, представляет собой модель классификации, специально разработанную для прогнозирования сепсиса. Он использует 23 входных признака и обеспечивает бинарный прогноз статуса сепсиса, классифицируя его как 1 (указывающий на положительный прогноз на сепсис) или 0 (представляющий отрицательный прогноз на сепсис).

2.2 Преобразование модели, пайплайна и других функций в файлы pickle

Модель классификации, преобразование столбцов и другие важные свойства процесса построения модели были сохранены в виде файлов рассола. Это обеспечивает постоянство, так как модель можно легко сохранить и загрузить в любое время, сохраняя ее состояние и параметры. Независимый от платформы характер файлов pickle обеспечивает переносимость, позволяя совместно использовать модель и развертывать ее в различных операционных системах и средах. Интеграция не вызывает затруднений, так как файлы pickle легко встраиваются в различные приложения или фреймворки.

Чтобы сохранить модель, в блокноте был запущен следующий код:

# Save the model and the columntransformer
# Navigate to the desired directory
directory = os.path.abspath(os.path.join(os.getcwd(), '..', '..', 'src', 'assets', 'ml_components'))
# Save the model as a pickle file
filename = os.path.join(directory, 'model-1.pkl')
pickle.dump(best_lgr, open(filename, 'wb'))

Чтобы сохранить Columntransformer и другие компоненты, приведенный ниже код был запущен в блокноте.

# Save columntrasnformer
filename2 = os.path.join(directory, 'preprocessor.pkl')
pickle.dump(full_pipeline, open(filename2, 'wb') )

Добавьте файлы pickle в папку проекта.

2.3 Экспорт зависимостей и требований модели.

Модель была построена с использованием конкретных зависимостей и требований, поэтому их экспорт необходим для успешного развертывания. Он фиксирует необходимые библиотеки, пакеты и конфигурации, необходимые для запуска модели. Документация обеспечивает воспроизводимость и позволяет другим воссоздать требуемую среду. Экспортируя эти зависимости, модель можно интегрировать в различные среды без проблем с совместимостью.

Чтобы экспортировать зависимости модели в файл requirements.txt, выполните в записной книжке следующий код:

pip freeze > requirements.txt

Сохраните файл require.txt в базовой папке проекта.

3. Настройка проекта

Прежде чем погрузиться в процесс разработки, необходимо настроить среду проекта. Нам нужно будет установить FastAPI и любые дополнительные зависимости, необходимые для нашего API. Мы можем использовать виртуальные среды для изоляции зависимостей проекта и обеспечения чистой среды разработки.

3.1 Создание среды

Создание виртуальной среды необходимо для разработки проекта, поскольку оно обеспечивает изоляцию зависимостей, воспроизводимость, чистую среду разработки и облегчает совместную работу. Он обеспечивает изоляцию зависимостей проекта, позволяет указывать конкретные версии пакетов, поддерживает чистую среду разработки, обеспечивает согласованные настройки для членов команды, способствует переносу и развертыванию проекта, а также улучшает организацию проекта и управление зависимостями.

Чтобы создать виртуальную среду
1. Откройте командную строку.
2. Перейдите в каталог проекта с помощью команды `cd`.

Создайте виртуальную среду в Windows с помощью следующей команды:

python -m venv myenv

Активируйте виртуальную среду в Windows с помощью следующей команды:

myenv\Scripts\activate

Создайте виртуальную среду в Linux с помощью следующей команды:

python3 -m venv myenv
 

Активируйте виртуальную среду в Linux с помощью следующей команды:

source myenv/bin/activate

3.2 Установка зависимостей и библиотек

После создания и активации среды следующим шагом будет установка необходимых зависимостей для вашего проекта. Зависимости — это дополнительные пакеты или библиотеки, которые необходимы вашему проекту для правильной работы. Установка зависимостей гарантирует наличие и доступность всех необходимых компонентов. Для установки зависимостей вы можете использовать менеджер пакетов, например pip.

Чтобы установить зависимости с помощью pip, вы можете использовать следующую команду:

pip install -r requirements.txt

Устанавливая зависимости, вы гарантируете, что ваш проект имеет доступ к необходимой функциональности и библиотекам. Важно отслеживать зависимости и их версии, чтобы поддерживать согласованность и избегать проблем с совместимостью.

3. Создание API

3.1 Разработка API

Чтобы приступить к созданию нашего API прогнозирования сепсиса, нам необходимо спроектировать конечные точки и модели данных, которые будут доступны. API будет включать конечные точки для Root, проверки работоспособности, индивидуальные прогнозы, информация о модели, пакетный прогноз и загрузка данных em>. Мы будем использовать возможности декораторов FastAPI и проверки данных с помощью Pydantic для определения конечных точек и моделей.

3.1.2 Конечные точки API

Корень:Эта конечная точка отображает приветственное сообщение: «Добро пожаловать в API Sepsis...».

Конечная точка проверки работоспособности.Ключевым аспектом любого API является конечная точка проверки работоспособности, которая позволяет нам отслеживать ее состояние. Мы реализуем простую конечную точку, которая возвращает статус API, обеспечивая его правильную работу.

Конечная точка информации о модели.Эта конечная точка предоставляет информацию о модели. Он возвращает имя модели, параметры и как категориальные, так и числовые признаки, используемые при обучении.

Индивидуальная конечная точка прогноза.Для отдельных прогнозов мы создадим конечную точку, которая принимает необходимые входные параметры и возвращает прогноз для одной записи данных. Эта конечная точка будет полезна, когда пользователи хотят делать прогнозы по одной точке данных.

Конечная точка пакетного прогнозирования.Чтобы делать прогнозы для пакета входных данных, мы создадим конечную точку, которая принимает список входных записей. Эта конечная точка будет обрабатывать данные с использованием нашей обученной модели машинного обучения и возвращать прогнозы для каждого входа.

Конечная точка загрузки данных.В реальных сценариях пользователи могут захотеть загрузить свои собственные данные для прогнозирования. Мы реализуем конечную точку, которая позволит пользователям загружать файлы данных или данные в формате JSON или CSV. API будет обрабатывать данные и возвращать прогнозы, используя нашу модель машинного обучения.

3.2 Интеграция модели в API

Чтобы делать точные прогнозы сепсиса, нам нужно интегрировать обученную модель машинного обучения в наш API. Мы рассмотрим, как загрузить модель и использовать ее для прогнозирования. Кроме того, мы обсудим методы оптимизации процесса загрузки модели, такие как кэширование загруженной модели, чтобы избежать ненужных накладных расходов.

3.2.1 Загрузка маринованной модели и преобразователя столбцов

Мы создаем функцию load_pickle, которая принимает имя файла в качестве входных данных. Он открывает файл в двоичном режиме, считывает его содержимое с помощью pickle и возвращает загруженное содержимое. Функция используется для загрузки подготовленных файлов модели, конвейера и других компонентов.

import pickle 

def load_pickle(filename):
    with open(filename, 'rb') as file:
        contents = pickle.load(file)
    return contents


model_path = os.path.join(DIRPATH, '..', 'assets', 'ml_components', 'model-1.pkl')
transformer_path = os.path.join(DIRPATH, '..', 'assets', 'ml_components', 'preprocessor.pkl')
other_components_path = os.path.join(DIRPATH, '..', 'assets', 'ml_components', 'other_compents.pkl')


# Load the trained model, pipeline, and other properties
model = load_pickle(model_path)
transformer = load_pickle(transformer_path)
other_components = load_pickle(other_components_path)

3.2.2 Обработка данных и предварительная обработка

Прежде чем делать прогнозы, нам часто нужно выполнить предварительную обработку данных. В случае прогнозирования сепсиса нам может потребоваться выполнить определенные шаги предварительной обработки входных данных, чтобы убедиться, что они находятся в правильном формате для нашей модели машинного обучения. Это может включать такие задачи, как обработка пропущенных значений, масштабирование функций или кодирование категориальных переменных.

Для обработки и предварительной обработки данных были предприняты следующие шаги:

я. Сбор и проверка входных данных

В API прогнозирования сепсиса сбор и проверка данных играют решающую роль в обеспечении точности и надежности прогнозов. В зависимости от используемой конечной точки используются разные методы для сбора и проверки входных данных.

Индивидуальная конечная точка прогноза. Для отдельных прогнозов входные данные напрямую передаются в конечную точку в виде переменных.

Конечная точка пакетного прогнозирования. В случае пакетного прогнозирования базовая модель Pydantic проверяет структурированный пакетный ввод на согласованность и точность.

Конечная точка загрузки данных. Конечная точка загрузки данных позволяет пользователям загружать файлы JSON или CSV для прогнозирования, формат и структура которых проверяются для обеспечения совместимости и обработки потенциальных ошибок.

ii. Разработка функций

После сбора и проверки данных следующим шагом будет создание функций, которые использовались для обучения модели. Это включает в себя преобразование и манипулирование необработанными данными для извлечения или создания одних и тех же входных переменных для модели прогнозирования.

def feature_engineering(data):
    data['Insurance'] = data['Insurance'].astype(int).astype(str) # run function to create new features
    # create features 
    data['All-Product']  = data['Blood Work Result-4'] * data['Blood Work Result-1']* data['Blood Work Result-2']* data['Blood Work Result-3'] * data['Plasma Glucose']* data['Blood Pressure'] * data['Age']* data['Body Mass Index'] # Multiply all numerical features

    all_labels =['{0}-{1}'.format(i, i+500000000000) for i in range(0, round(2714705253292.0312),500000000000)]
    data['All-Product_range'] = pd.cut(data['All-Product'], bins=(range(0, 3500000000000, 500000000000)), right=False, labels=all_labels)
    
    age_labels =['{0}-{1}'.format(i, i+20) for i in range(0, 83,20)]
    data['Age Group'] = pd.cut(data['Age'], bins=(range(0, 120, 20)), right=False, labels=age_labels) # create categorical features for age

    labels =['{0}-{1}'.format(i, i+30) for i in range(0, round(67.1),30)]
    data['BMI_range'] = pd.cut(data['Body Mass Index'], bins=(range(0, 120, 30)), right=False, labels=labels) # create categorical features for bodey mass index

iii. Обработка файлов JSON и CSV

Эта функция обрабатывает CSV-файлы.

Приведенная ниже функция используется для обработки файлов JSON и CSV в форматы, которые можно преобразовать в фреймы данных.

def process_json_csv(contents, file_type, valid_formats):

    # Read the file contents as a byte string
    contents = contents.decode()  # Decode the byte string to a regular string
    new_columns = return_columns() # return new_columns
    # Process the uploaded file
    if file_type == valid_formats[0]:
        data = pd.read_csv(StringIO(contents)) # read csv files
    elif file_type == valid_formats[1]:
        data = pd.read_json(contents) # read json file
    data = data.drop(columns=['ID']) # drop ID column
    dict_new_old_cols = dict(zip(data.columns, new_columns)) # get dict of new and old cols
    data = data.rename(columns=dict_new_old_cols) # rename colums to appropriate columns
    return data

iv. Делаем прогноз

Теперь нам нужно будет сделать прогноз с помощью API. Функция make_prediction была создана для достижения этой цели.

Функция `make_prediction` принимает данные, преобразователь и модель в качестве входных данных. Он выполняет различные этапы предварительной обработки данных, включая переименование столбцов, разработку функций и преобразование данных с помощью предоставленного преобразователя. Затем он объединяет категориальныеи числовыепризнаки, делает прогноз с использованием модели и возвращает прогноз ярлыки максимальная вероятность среди прогнозируемых вероятностей.

def make_prediction(data, transformer, model):
    new_columns = return_columns() 
    dict_new_old_cols = dict(zip(data.columns, new_columns))
    data = data.rename(columns=dict_new_old_cols)
    feature_engineering(data) # create new features
    transformed_data = transformer.transform(data) # transform the data using the transformer    
    combine_cats_nums(transformed_data, transformer)# create a dataframe from the transformed data 
    # make prediction
    label = model.predict(transformed_data) # make a prediction
    probs = model.predict_proba(transformed_data)
    return label, probs.max()

v. Форматирование выходных данных

Выходные данные при отправке почтового запроса в API должны быть отформатированы в правильном, легко читаемом и доступном формате. Функция output_batch принимает в качестве входных данных данные1 и метки. Затем он преобразует data1 и метки в словари и перебирает индексы словаря меток, чтобы добавить входные и выходные значения в возвращаемый_список.

# formats response 
def output_batch(data1, labels):
    data_labels = pd.DataFrame(labels, columns=['Predicted Label']) # convert label into a dataframe
    data_labels['Predicted Label'] = data_labels.apply(process_label, axis=1) # change label to understanding strings
    results_list = [] # create an empty lits
    x = data1.to_dict('index') # convert  datafram into dictionary
    y = data_labels.to_dict('index') # convert  datafram into dictionary
    for i in range(len(y)):
        results_list.append({i:{'inputs': x[i], 'output':y[i]}}) # append input and labels

    final_dict = {'results': results_list}
    return final_dict

3.2.3 Создание конечных точек

Корень-/

URL-адрес ‘/’ возвращает ответ в формате html, содержащий сообщение «Добро пожаловать в API Sepsis».

@app.get("/", response_class=HTMLResponse)
async def root(request: Request):
    return templates.TemplateResponse("index.html", {'request': request})

Конечная точка проверки работоспособности — /health

Конечная точка /health возвращает сообщение, указывающее на состояние работоспособности API.

@app.get("/health")
def check_health():
    return {"status": "ok"}

Конечная точка информации о модели — /model-info

Конечная точка /model-info возвращает некоторую информацию об используемой модели.

@app.post('/model-info')
async def model_info():
    model_name = model.__class__.__name__
    model_params = model.get_params()
    features = properties['train features']
    print(features)
    model_information =  {'model info': {
            'model name ': model_name,
            'model parameters': model_params,
            'train feature': features}
            }
    return model_information

Индивидуальная конечная точка прогнозирования

Конечная точка /predict получает входные данные и делает один прогноз. Он возвращает как входные, так и выходные данные.

# Prediction endpoint
@app.post('/predict')
async def predict(plasma_glucose: float, blood_work_result_1: float, 
                  blood_pressure: float, blood_work_result_2: float, 
                  blood_work_result_3: float, body_mass_index: float, 
                  blood_work_result_4: float, age: int, insurance: bool):
    
    # Create a dataframe from inputs 
    data = pd.DataFrame([[plasma_glucose,blood_work_result_1,blood_pressure,
                           blood_work_result_2,blood_work_result_3,body_mass_index, 
                           blood_work_result_4, age,insurance]], columns=return_columns())

    # data_copy = data.copy() # Create a copy of the dataframe
    labels, prob = make_prediction(data, transformer, model) # Get the labels  
    response = output_batch(data, labels) # output results
    return response

Конечная точка пакетного прогнозирования-/predict-batchи конечная точка загрузки данных-/upload-dataсм. в проекте на GitHub.

4. Тестирование API

Крайне важно протестировать API, чтобы убедиться в его функциональности, надежности и соответствии требованиям, выявляя и устраняя любые потенциальные проблемы или ошибки. Тестирование помогает проверить поведение API, повысить его производительность и улучшить общее взаимодействие с пользователем, гарантируя, что он соответствует желаемым стандартам и целям.

4.1 Локальный запуск API

Чтобы запустить API локально, нам нужно запустить сервер разработки FastAPI, запустив файл, содержащий определение нашего API, которым в данном случае является файл app.py.

Для этого мы можем запустить следующую команду в терминале:

python 'path/app.py'

Убедитесь, что сервер запущен и работает.

4.2 Тестирование конечных точек API

Чтобы протестировать конечные точки API, выполните следующие действия:

  1. Откройте веб-браузер и перейдите на http://127.0.0.1:8000/docs, чтобы отправлять HTTP-запросы на конечные точки API.
  2. Проверьте конечную точку проверки работоспособности, отправив запрос GET на URL-адрес работоспособности или /health. Убедитесь, что ответ указывает на то, что API работает правильно.
  3. Протестируйте конечную точку информации о модели, отправив запрос на получение информации о модели URL-/model-info
  4. Протестируйте конечную точку отдельного прогноза, отправив запрос POST на URL-адрес прогноза-predict, предоставив необходимые входные данные в виде переменных в тексте запроса. Убедитесь, что входные данные допустимы и имеют ожидаемый формат. Захватите ответ, который будет включать прогнозируемую метку и связанные с ней вероятности.
  5. Протестируйте конечную точку пакетного прогнозирования, отправив запрос POST на URL-адрес пакетного прогнозирования-/predict-batch, предоставив пакет входных данных в тексте запроса. Входные данные должны быть структурированы в соответствии с определенной базовой моделью Pydantic и соответствовать ожидаемому формату. Захватите ответ, который будет включать предсказанные метки и связанные вероятности для каждой входной записи.
  6. Протестируйте конечную точку загрузки данных, отправив запрос POST на URL-адрес загрузки данных-/upload-data, прикрепив файл (JSON или CSV), содержащий входные данные. Убедитесь, что загруженный файл имеет правильный формат и соответствует ожидаемой схеме. Захватите ответ, который будет включать предсказанные метки и связанные с ними вероятности для загруженных данных.
  7. Проанализируйте результаты теста, чтобы убедиться, что прогнозы и вероятности совпадают с ожидаемыми результатами. При необходимости внесите необходимые изменения в API или входные данные.
  8. Повторите процесс тестирования с различными входными сценариями, чтобы тщательно проверить функциональность и производительность API прогнозирования сепсиса.

4.3 Обработка ошибок и исключений

При создании API очень важно корректно обрабатывать ошибки и исключения. FastAPI предоставляет надежные возможности обработки ошибок, которые позволяют разработчикам перехватывать определенные исключения, такие как ошибки проверки или ошибки предсказания модели, и предоставлять информативные сообщения об ошибках пользователям API.

Следующий код должен был возвращать пользовательское сообщение об ошибке в случае, если файл неправильного типа загружается в конечную точку загрузки данных:

    valid_formats = ['text/csv', 'application/json']
    if file_type not in valid_formats:
        return JSONResponse(content={"error": f"Invalid file format. Must be one of: {', '.join(valid_formats)}"})

4.4 Оптимизация процесса загрузки модели

Очень важно кэшировать процесс загрузки модели с помощью модуля кэширования. Кэширование модели имеет решающее значение для повышения производительности, особенно когда загрузка модели занимает много времени. Такой подход снижает накладные расходы и повышает общую эффективность, особенно в сценариях с частым обращением к модели. Декоратор-lru_cache из модуля functools позволяет функции load_pickle, отвечающей за загрузку маринованного объекта из файла, кэшировать свои результаты. Таким образом, последующие вызовы с тем же именем файла извлекают кэшированный результат, устраняя избыточные операции ввода-вывода файлов.

from functools import lru_cache

@lru_cache(maxsize=100, )
def load_pickle(filename):
    with open(filename, 'rb') as file:
        contents = pickle.load(file)
    return contents

Скриншот приложения API

Выводы и ресурсы

Заключение

В заключение можно сказать, что использование FastAPI для создания API предоставляет организациям мощное и эффективное решение для нужд их приложений. Высокая производительность, простота использования и современные функции FastAPI делают его идеальной основой для разработки надежных и масштабируемых API.

В этой статье мы рассмотрели различные аспекты создания API прогнозирования сепсиса с помощью FastAPI, включая настройку проекта, проектирование конечных точек, интеграцию моделей машинного обучения, обработку данных и реализацию обработки ошибок. Следуя описанным шагам и рекомендациям, разработчики могут создать надежный и точный API прогнозирования сепсиса.

Ресурсы

  1. Документация FastAPI
  2. Учебное пособие по FastAPI
  3. Поваренная книга FastAPI

Вы можете найти полный код проекта на моем GitHub, где он находится в открытом доступе. Я поощряю и приветствую отзывы и комментарии от сообщества, чтобы улучшить и улучшить проект. Не стесняйтесь исследовать код, вносить предложения и вносить свой вклад в его разработку. Ваш вклад высоко ценится и ценится.