Писали ли свои классы
Что проверяют
Уместность объектно-ориентированного кода там, где основной стиль это функции поверх таблиц и массивов. Смотрят, отличаете ли вы случай, когда нужен объект с состоянием, от случая, когда достаточно обычной функции.
Как отвечать
Скажите, где класс оправдан:
- преобразование с состоянием, обученным на обучающей выборке: параметры нормализации, словарь категорий, отобранные признаки. Такой объект пишут совместимым с
sklearn, с методамиfitиtransform, чтобы он вставал вPipelineи корректно вёл себя при кросс-валидации; - набор данных и модель в PyTorch, где класс требует сам фреймворк;
- конфигурация через
dataclassили модельpydanticвместо словаря со свободными ключами.
class ClipOutliers(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
self.lo_, self.hi_ = X.quantile(0.01), X.quantile(0.99)
return self
def transform(self, X):
return X.clip(self.lo_, self.hi_, axis=1)И где не оправдан: обёртка без состояния поверх чтения файла это функция, которой приделали self. Хороший ответ проговаривает эту границу вслух.
Где спотыкаются
Приносят класс-пустышку: конструктор запоминает путь, единственный метод читает файл. На вопрос, что здесь даёт класс, ответа нет, потому что состояния у объекта не появилось.
Пишут преобразование мимо интерфейса sklearn. Оно не встаёт в конвейер, поэтому его применяют ко всему набору данных до разбиения. Статистики считаются в том числе по отложенной части, метрика на валидации завышена, а на проде результат заметно хуже.
Прячут в объект тяжёлое соединение или саму модель и потом не могут отправить его в рабочие процессы: объект не сериализуется, и обучение в несколько процессов падает на этапе передачи.