Введение

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

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

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

Пример

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

Пример кода

import sys
import logging

def error_message_detail(error, error_detail:sys):
    _, _, exc_tb = error_detail.exc_info()

    file_name = exc_tb.tb_frame.f_code.co_filename

    error_message = "Error occured in Python Script name [{0}] Line No. [{1}] Error Message [{2}]".format(file_name, exc_tb.tb_lineno, str(error))

    return error_message

class customException(Exception):
    def __init__(self, error_message, error_detail:sys):
        super().__init__(self, error_message)
        self.error_message = error_message_detail(error_message, error_detail=error_detail)
    
    def __str__(self):
        return self.error_message

Приведенный выше код включает функцию error_message_detail, которая генерирует подробное сообщение об ошибке. Он принимает два аргумента: error, который представляет собой сообщение об ошибке, и error_detail, который представляет собой объект sys, содержащий информацию об ошибке. Функция извлекает имя файла и номер строки, в которой произошла ошибка, и объединяет их с сообщением об ошибке для создания подробного сообщения об ошибке.

Код также включает пользовательское исключение под названием customException. Он принимает два аргумента: error_message, который представляет собой сообщение об ошибке, и error_detail, который представляет собой объект sys, содержащий информацию об ошибке. Метод __init__ класса вызывает функцию super() для инициализации базового класса Exception сообщением об ошибке. Затем он использует функцию error_message_detail для создания подробного сообщения об ошибке и сохраняет его в атрибуте error_message. Метод __str__ класса возвращает сообщение об ошибке при возникновении исключения.

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

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

import pandas as pd

def load_dataset(file_name):
    try:
        # load the dataset from file_name
        df = pd.read_csv(file_name)

    except FileNotFoundError as e:
        raise customException('File not found', error_detail=sys)

    except ValueError as e:
        raise customException('Invalid file format', error_detail=sys)

В этом примере мы перехватываем два типа исключений — FileNotFoundError и ValueError, которые могут возникнуть в процессе загрузки набора данных. Когда возникает любое из этих исключений, мы возбуждаем исключение customException и передаем сообщение об ошибке и объект sys.exc_info() в качестве аргументов. Объект sys.exc_info() предоставляет дополнительную информацию об ошибке, например номер строки и имя файла, в котором произошла ошибка.

Затем мы можем поймать исключение customException и вывести сообщение об ошибке:

try:
    load_dataset('dataset.csv')

except customException as e:
    print(e)

Здесь мы перехватываем исключение customException и печатаем сообщение об ошибке, используя метод __str__ класса customException.

Код для этого туториала показан ниже в Github. Суть доступна здесь

import sys
import logging
import pandas as pd

def error_message_detail(error, error_detail:sys):
    _, _, exc_tb = error_detail.exc_info()

    file_name = exc_tb.tb_frame.f_code.co_filename

    error_message = "Error occured in Python Script name [{0}] Line No. [{1}] Error Message [{2}]".format(file_name, exc_tb.tb_lineno, str(error))

    return error_message

class customException(Exception):

    # Constructor or Initializer
    def __init__(self, error_message, error_detail:sys):
        super().__init__(self, error_message)
        self.error_message = error_message_detail(error_message, error_detail=error_detail)
    
    # __str__ is to print() the value
    def __str__(self):
        return self.error_message


def load_dataset(file_name):
    try:
        # load the dataset from file_name
        df = pd.read_csv(file_name)
        
    except FileNotFoundError as e:
        raise customException('File not found', error_detail=sys)
        
    except ValueError as e:
        raise customException('Invalid file format', error_detail=sys)

if __name__ == "__main__":

    try:
        load_dataset('dataset.csv')
        
    except customException as e:
        print(e)

Заключение

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