Вопросы на собеседованиях

Этот пост навеян просмотром нескольких ресурсов, в которых даются перечни вопросов на собеседовании на позицию Data Scientist и ответы на них. Вопросы не всегда корректные, а ответы не всегда правильные, поэтому я решил их подробно разобрать… думаю, для новичков будет полезно.

Собеседование

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

Зачем использовать Feature selection?

Feature selection (выбор классификационных признаков) – простой и эффективный способ улучшения алгоритмов классификации. […]

  • FS имеет нормальный русский перевод: отбор (или селекция) признаков. Лучше так и спрашивать, если собеседование ведётся на русском.
  • Самое плохое, что можно сделать при ответе на вопрос ЗАЧЕМ — ответить ЧТО ЭТО (или КАК).
  • В написанной выше фразе всё плохо! Я не назвал бы отбор признаков простым, поскольку его можно делать, например, с помощью эволюционной оптимизации (хотя, это философский вопрос, что такое просто). Но это точно не метод улучшения АЛГОРИТМА, сам алгоритм не трогают — меняют лишь признаковое описание объектов. Ну и наконец, почему алгоритмов КЛАССИФИКАЦИИ? Отбор признаков можно делать в задачах регрессии и даже в задачах обучения без учителя (кластеризации, например).

Как можно ответить:

Отбор признаков используют для устранения избыточных признаков (например, которые дублируются) и нерелевантных (например, которые не имеют отношения к решению задачи) признаков, что может

  • повысить надёжность обучения (уменьшить эффект переобучения),
  • улучшить интерпретируемость решения (модель будет зависеть от небольшого числа признаков),
  • упростить поддержку решения (чем меньше входных данных, тем проще понять, из-за каких изменений входа алгоритм стал себя неадекватно вести),
  • повысить скорость работы алгоритмов (чем меньше признаков, тем быстрее),
  • удешевить решение задачи (часто получение признаков связано с денежными затратами — установка дополнительных датчиков, запросы нужной информации и т.п., здесь мы получаем возможность узнать, что чаcть признаков можно не использовать).

Методы фильтрации

Методы фильтрации основаны на статистических методах и, как правило, рассматривают каждую функцию независимо.

Можно поспорить, что только на статистических методах… конечно, статистика — это функция от выборки, поэтому если мы что-то вычисляем на основе значений признаков, то как бы используем статистический метод. Но что делать с таким методом: в задаче бинарной классификации с вещественными признаками вычислить AUC ROC для каждого признака (т.е. если бы он выдавался как ответ модели), признаки с AUC ROC близкими к 0.5 удалить? Это фильтрация… но вряд статистик назовёт это «своим» методом.

Понятно, что признак — функция от объекта, но когда мы называем его функцией, как это сделано выше, мы только сбиваем слушателя/читателя.

Overfitting

[…] Связано это с тем, что при построении модели в обучающей выборке обнаруживаются случайные закономерности, которые отсутствуют в общей совокупности. […]

Эта фраза (как и весь ответ) взята из страницы русской Википедии. И, знаете, она написана крайне неудачно. Конкретно по этой фразе: я бы не назвал это причиной переобучения, поскольку возникает много вопросов (например, что это за закономерности, которая ищет модель, например ближайший сосед, почему они случайные, неужели в детерминированном случае, когда я в модельной задаче буду генерировать выборку, переобучения не будет и т.п.)

Вот российский классик теории переобучения — Костя Воронцов пишет: переобучение возникает при использовании избыточно сложных моделей. Я бы так и рекомендовал говорить (и почитать материал на machinelearning). Тут тоже возникает вопрос: что такое сложность, почему она может быть избыточна? Но на это понятно, что отвечать.

Что такое регуляризация и чем она полезна?

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

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

  • решение существует,
  • решение единственно,
  • решение непрерывно зависит от данных.

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

Сейчас термин стал намного шире: часто любой способ борьбы с переобучением, который касается настройки модели,  в машинном обучением называют регуляризацией (начиная от dropout и заканчивая prunning).

Что такое смещение и дисперсия, и каковы их отношения в моделировании данных?

Смещение – это то, насколько далеки предсказания модели от правды, а дисперсия – степень, в которой эти предсказания различаются между итерациями модели.

Здесь я просто дам ссылку на видео. Можно написать формулу, можно объяснить на пальцах, есть известные рисунки для объяснений, но говорить, что дисперсия — степень точно не надо.

Что делать, если классы не сбалансированы?

Я бы тут уточнил вопрос: кому и когда делать? Причины дисбаланса бывают разные, иногда он устраним на этапе постановки задачи, иногда он совсем неустраним и надо продумать подходящую метрику качества, а если уже всё продумано, то часто ничего не надо делать.

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

Есть куча искусственных приёмов для восстановления баланса классов, например SMOTE. Но как показывает практика, лучше с ними не связываться, гораздо важнее подобрать правильную модель и корректно преобразовать её результаты (например, с помощью калибровки). В крайнем случае, можно использовать пересемплирование (resampling) данных, например, дублирование объектов малого класса. Для желающих сказать побольше при ответе на этот вопрос — вот ссылка.

Какими способами можно сделать модель более устойчивой к выбросам?

Выбросы обычно определяются по отношению к распределению. Они могут быть удалены на этапе предварительной обработки (до любого этапа обучения)…

Странно задавать вопрос именно в такой форме, чтобы услышать именно такой ответ! Как СДЕЛАТЬ МОДЕЛЬ устойчивой — надо до её использования повозиться с данными. Если бы вопрос был «как решить проблему выбросов», то ответ был бы корректным, причём я бы его разнёс по пунктам:

  • удаление выбросов на этапе подготовки данных (в том числе, детектирование аномальных значений, винзоризация, стат. критерии, преобразование признаков и т.п.),
  • применение т.н. робастных моделей (например, линейных с настройкой не на сумму квадратов ошибки, а на сумму модулей),
  • удаление выбросов и переобучение моделей (например, удаляя объекты, на которых модель ошибается сильнее).

А вообще, я бы попросил уточнить вопрос: хотелось бы немного знать природу выбросов, чтобы выбрать правильную стратегию решения.

П.С.

В заключение история: недавно при собеседовании соискатель спросил меня, а зачем ему помнить критерий расщепления Джини (Gini impurity)? Вряд ли на практике это понадобится…

Действительно, в большинстве случаев совсем не понадобится. Также как и среднестатистическому физику знание второго закона Ньютона, но что-то мне подсказывает, что подавляющее большинство физиков, если не все, помнят эту формулу из 3х букв. Точно также и здесь… есть маленькая формула, до которой можно дойти самому. Если Вы хоть раз в жизни задумывались, как разбить выборку на две части по значениям всего одного признака, то, наверное, приходили к выводу, что надо придумать функцию, которая принимает малые значения, если «в часть» попали объекты одного класса, и большие, если от всех классов примерно поровну. И не так много вариантов для выбора функции… В голову, в первую очередь, придёт энтропия (если Вы знаете, что это такое) и Джини (до которой можно додуматься самому). Есть, на самом деле, ещё более простой вариант (чуть позже я напишу отдельную заметку про него), но вот до него додуматься сложнее. А ещё, посмотрев на формулу Джини, Вы увидите сумму квадратов переменных (при условии, что они неотрицательны и их сумма равна 1), и узнаете задачу, которую всегда дают в курсе оптимизации при изучении условной оптимизации (и вдруг снова осознаете, что человечество решает всё время одни и те же задачи и придумало не так уж и много функций для оптимизации).

Поэтому умение описать критерий разделения Джини показывает либо то, что Вы его заучили, либо то, что Вы хоть раз серьёзно задумывались, как должен быть устроен алгоритм (бинарной) классификации. А неумение – не запомнили и не задумывались.

 

Вопросы на собеседованиях: 12 комментариев

  1. Overfitting
    > Тут тоже возникает вопрос: что такое сложность, почему она может быть избыточна? Но на это понятно, что отвечать.

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

    • > Прошу прощения, но мне не понятно что отвечать.

      Там есть гиперссылка — Вы посмотрели, что по ней? Более того, в предыдущем предложении есть рекомендация от меня — Вы ей воспользовались? Непонятно после всего этого?

      > почему, скажем, одно дерево принятия решения более сложный алгоритм, чем градиентный бустинг на деревьях?
      А почему Вы это меня спрашиваете? Я нигде этого не утверждал.

      • > Там есть гиперссылка — Вы посмотрели, что по ней?

        Гиперссылку посмотрел, но там нет определения сложности. Есть только пример в котором сложность — это количество параметров модели. И еще есть ссылки на другие статьи. Посмотрел про размерность размерность Вапника-Червоненкиса и критерий Акаике. Мне кажется, эти подходы сложно связать с переобучением. Поясните, если не согласны.

        > А почему Вы это меня спрашиваете? Я нигде этого не утверждал.

        Тут снова прошу прощения, я пропустил часть логической цепочки. Итак, есть утверждение: от увеличения сложности модели возникает переобучение. Но мы также знаем, что одно дерево переобучается легко, а бустинг — нет или крайне плохо. Значит бустинг прост, а дерево сложно. Т.е. Вы этого не утверждали, но это следует из утверждения, на которое Вы сослались.

      • Смотрите, у сложности есть разные формализации.
        Например, в критерии Акаике это число параметров
        http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D1%80%D0%B8%D1%82%D0%B5%D1%80%D0%B8%D0%B9_%D0%90%D0%BA%D0%B0%D0%B8%D0%BA%D0%B5

        но важно понимать, что это критерий для регрессионных моделей (и на самом деле, при некоторых предположениях о природе данных), т.е. это не даёт возможность сравнить, скажем, дерево и бустинг.

        или VC-размерность. На самом деле, именно она и связана с переобучением!
        Если Вы посмотрите на статью в Википедии
        https://en.wikipedia.org/wiki/VC_dimension
        то там можно даже найти формулу, как через неё выражается разность между ошибкой на обучении и тесте (там она в виде вероятностной оценки).
        Ну и, собственно, один из подходов — измерять сложность с помощью VC (но это годится только в задачах классификации).

        По поводу числа параметров, как я уже написал, в регрессионных моделях можно говорить, что регрессия на 10 признаках сложнее, чем на 5. Именно поэтому и существуют методы сокращения размерности и отбора признаков как средства борьбы с переобучением.
        Но, в целом, число параметров — очень «искусственный атрибут».
        Можно привести пример алгоритма с одним параметром, но с бесконечной VC-размерностью.
        Более того, можно искусственно запихнуть все параметры в один, используя трюк:
        (12.345, 6.78 ) -> (12.345, 06.780 ) -> (1026.374850) // чётные и нечётные позиции до и после запятой кодируют разные числа
        Поэтому смотреть надо не на формальную сложность с точки зрения человека (много параметров значит сложно), а на реальную, с точки зрения функции (насколько разнообразные алгоритмы в данном семействе существуют). Именно это и измеряют все известные формализации сложности.

        Скорее всего, я в ближайшее время напишу заметку в блоге про это…
        Но если Вы хотите пракитический способ сравнения сложностей дерева и бустинга — просто измените немного данные (добавьте шум). Алгоритм, который после настройки на новые данные, сильнее изменится (в смысле ответов на большой тестовой выборке) и будет сложнее.

  2. Большое спасибо за развернутый ответ. Получается, что сложность можно мерить только в рамках алгоритмов одного класса. Между классами можно сравнивать только используя эксперименты, а не теоретический аппарат. С удовольствием прочту Вашу заметку об этом.

    Думаю вы согласитесь, что фраза: «но на это понятно, что отвечать» была слишком оптимистичной 🙂

    • Пожалуйста! Рад, что теперь многое прояснилось… На самом деле, я и частично согласен, и не согласен с тем, что «понятно». Согласен, что тема очень сложная. И, например, я ей полностью не владею, поскольку есть целый раздел науки об этом и это прямо сейчас продолжает развиваться (это больше функан, чем ML). Но не согласен, поскольку, что отвечать на собеседовании понятно… если Вы идёте на младшего DS или обычного, то достаточно знать, что 1) есть разные формализации сложности 2) сложность характеризует разнообразие (пусть, разброс) семейства алгоримтов 3) м.б. примеры (хотя бы названия): VC-ёмкость, критерий Акаике и т.д. Спрашивать на собеседовании что-то большее из этой области, на мой взгляд, очень странно… ну если Вы не в научную лабораторию идёте.

    • Ну вот, теперь знаете, что целый новостной ресурс использует Ваши материалы безвозмездно и без ссылок. Впрочем, если посмотреть их новости… не только Ваши. А вот качества перевода и понимания сути у них хромают…

      • Добавил лицензию MIT, надеюсь, это отчасти исправит ситуацию похожую на эту. Хотя бы ссылку на оригинал указали..

  3. Добрый день!

    По несбалансированным выборкам мне очень нравится вот эта подборка от Tomas Fawcett с примерами:
    https://www.svds.com/learning-imbalanced-classes/
    Кроме того, интересно Ваше мнение по поводу статьи David Hand про ROC-кривую (достаточно популярная статья): https://spiral.imperial.ac.uk/bitstream/10044/1/18420/2/Machine%20Learning_77_1_2009.pdf
    Интересно, приходилось ли пользоваться на практике метрикой H-measure, ее реализацией:

    Нажмите для доступа к hmeasure.pdf

    Спасибо!

    С уважением,
    Никита

    • Здравствуйте, Никита! Да, это, на самом деле, самая симпатичная подборка по этой теме… как-нибудь я напишу свою — для этого блога:) По крайней мере, планы были.

      Я эту статью видел. Честно говоря, я не придал ей особого значения. Мне показалась, что аргументация недостатков AUC ROC немного надумана. Лично я H-мерой не пользовался, но несколько специалистов-рисковиков из банков говорили, что пользуются ею (как и некоторыми другими аналогами AUC ROC). Но, на самом деле, часто приходится выбирать то, что «используют все», а не то, что «более адекватно».

Оставьте комментарий