Типичное собеседование #3. Позиция Senior Data Scientist. Rejected!
Вставка
- Опубліковано 3 чер 2024
- На этот раз мы встретились уже с опытным кандидатом в Data Science.
Будет много разноплановых практических вопросов по ML!
Канал Александра: t.me/datafeeling
Канал Андрея t.me/dzis_science
Таймкоды встречи:
0:00:00 - Расказ о кандидате
0:09:23 - Фидбек #1
0:10:50 - Первый вопрос по Python
0:16:36 - Второй вопрос по Python
0:17:36 - Задачка на Python
0:23:39 - Фидбек по Python
0:27:26 - Первая задача на SQL
0:29:57 - Вторая задача на SQL
0:40:04 - Фидбек по SQL
0:41:30 - Задача на ML с одним таргетом
0:54:10 - Оценка модели не тесте
1:01:14 - Выбросы и аномалии в датасете (спойлер: их нет)
1:02:17 - Feature Engneering и улучшение точности
1:04:36 - Нормализация (StandardScaler) VS Стандартизация (MinMaxScaler)
1:08:35 - Задача на ML с двумя таргетами
1:18:45 - Метод максимизации правдоподобия
1:22:02 - Будстрап и статистические критерии
1:26:35 - Фидбек по ML
1:31:53 - Разбор резюме
1:36:23 - Общий фидбек
Чет с такими познаниями у обоих я начал бояться за будущее технологий))
В случае с временными рядами - не понял зачем такая сложность. Вроде все определяется по первой колонке - т.е. первые значения всех рядов, точки откуда они исходят - они не перекрываются между и отсюда и идеальное предсказание должно быть.
Очень полезный видос. Но обратите внимание, пожаулйстаЮ на громкость звука "перемотки".. Очень громко, и бьет по ушам.. Либо может поменять звук? Либо сделать его сильно тише.
Как насчёт собеседования на позицию ML Engineer (с секцией по Deep Learning)?
когда ждать следующую серию?)
Собеседования на ML Engineer проводите? Было бы интересно
def uniq(string):
unique = list(set(string))
P=fact(len(string))
for el in unique:
P=P/(string.count(el))
return P
Привет. Крутая запись!
Вопрос про задачку с двумя таргетами.
1) Кажется, это частный подход - когда уникальных лейблов #2 мало. inference затянется на переборе 2 лейбла. На примере рекомендаций обуви нужно перебрать больше размеров. Это применимо только если во 2 лейбле мало уникальных классов?
2) Как информация о неправильном 2 таргете закладывается в модель при обучении?
А можно, пожалуйста, ссылку на данные, чтобы покрутить?)
Мне кажется по начальному значению без всяких моделей уже точность будет 100%, хотел бы это проверить (я про классификацию)
0:16:36 не заработает, так как 1e{number} это вещественное число, а функция range принимает целые числа
А нельзя в первой задачке по питону просто длину слова факториал взять?
я думаю большей части аудитории интересны собесы джунов
0:41:30 завели парня не туда советами. Эти данные по первым признакам дают точность 1.0. Даже одного признака достаточно.
Да, можно тупо было по первому дню классифицировать. В точке старта классы не пересекаются.
Точно, сразу это видно. Решающее дерево сходу дало бы 100. Ох уж эти сеньоры.. 😊
По-моему самый простой вариант решения задачи по питону - найти длину строки и вычислить факториал
Этого недостаточно
Надо еще поделить на факториалы количества всех повторяющихся символов
Короче просто задачка на полиномиальный коэффициент, вопрос в том как оптимальнее его посчитать
тоже не понял танцев вокруг этой задачи. количество символов и факториал. Если там есть повторяющиеся символы, можно их отсечь через set()
по sql я решил, легкие задачки, но пока на джуна даже не берут )
Сейчас принцип у всех выпускники вшэ, бауманка и т. п. Райдер у ребят.
можешь сказать насколько стоит углубляться в SQL? Где учить именно с перспективой связки Python + MySql?
factorial(len(n))
Задача из ЕГЭ просто)
def perms(s):
n = len(s)
d = dict()
for e in s:
if e in d.keys():
d[e] += 1
else:
d[e] = 1
div = 1
for v in d.values():
div *= fact(v)
return int(fact(n) / div)
def fact(n):
if n == 0:
return 1
else:
return n * fact(n - 1)
Я понимаю, что факториал - это кол-во всех возможных комбинаций. Очевидно этого недостаточно чтобы найти кол-во уникальных, т.к. буквы могут повторяться.
div в твоем коде - это количество всех перестановок, среди букв, где каждая буква - позиция, а ее кол-во повторений в строке - кол-во значений для позиции.
Я вот не могу связать магию в голове, как поделив комбинации на эти, странные для меня, перестановки, получается число уникальных комбинаций.
Я бы сделал часть с факториалом, потом запулил бы все в set() и не додумался бы до деления на перестановки))
@@mrleggard формулы из комбинаторики и ничего более
@@mrleggard обычная комбинаторика. Факториал от длины это всевозможные с повторениями. Потом надо поделить на факториал количества каждой из букв. Допустим букв 'a' 2, поэтому делим на 2! = 2, потому что в любом зафиксированном слове можно поставить буквы 'a' двумя способами, которые мы посчитали различными. И так для любого.
Комбинаторика, 9 класс. На 1 курсе в вузе на дискретной математике тоже проходится, но уже как повтор школьной программы
Почему в большинстве собеседований на позицию Data Scientist, выложенных на UA-cam, никто не спрашивает Deep Learning? Как по мне это максимально странно, особенно для сеньора. Учитывая тот факт, что основы DL в большинстве случаев должен знать даже стажёр.
Data Scientist это довольно широкая и размытая должность. Ищи по запросу deep learning interview
очень часто, как и в этом случае, под дата саентистом скрывается обычный аналитик. Лучше поискать собесы на позицию machine learning engineer (CV, NLP) - вот там у ребят серьезный уровень
Решение питоновской задачи без учета уникальности : "def perms(a):
if len(a)==1:
return(1)
else:
t=2
for i in range(2, len(a)):
t=t*(i+1)
return(t)"
Это неверно вы проверьте кейсы 'abc' должно быть 6
для 'aab' должно быть 3, а вы просто факториал считаете
@@Igor-sp7tw Это не готовое решение, я лишь показал начало решения. И я написал что решение без учета уникальности.
А как это люди, у которых два года опыта, собеседуют людей с 10-летним опытом? 🤔
Потому что есть вопросы и конкретные на них ответы, которые характеризуют уровень собеседуемого
Нет никакой необходимости собеседующему знать все, что знает собеседуемый
Дядя Джун: "Господи, какая же это всё х**ня"
вопрос про magic функцию дурацкий. если % то на одной строке, %% то много строк. это решается за одну секунду когда ты неверно запустил код и исправил. в чем тут синьорность
за 15 лет в программировании (с БД) мне ни разу не пригодились оконные функции - нафига вы их спрашиваете? ну чего там нельзя сделать без гула?
блин реально "напишите быструю сортировку"
потому что программирование != анализ данных, в реальности источники данных могут быть вообще ни разу не френдли, придется самому возиться с приведением данных в нужный формат.
@@noname-bi7ve И? При чём тут оконные функции? Это специфический инструмент который никто не будет держать в уме, а когда реально понадобится просто загуглит и за 5 минут всё себе сделает. Или вообще даже не зная про них спокойно сделает группировку и по группам посчитает что ему там нужно, тем более что реально адекватной сложности задача через эту ерунду решается запросом размером со стену. Попробуйте сделать запрос где вам нужно найти "подозрительные" события в общем логе пользователей, подозрительные это те между которыми меньше n секунд и типо события отличается (например, зашёл на сайт и через 1 сек вышел, а порог 10 сек). Как сделаете посмотрите на результат и спросите себя а так точно вот делают или дальше собесов дай бог люди только слышали про них.
@@warpme оконки это несложно, удобно и реально часто используется, если ты работаешь с данными. На собесах большой запрос не дадут. Все остальное - отмазки.
Разница в том, сколько времени ты потратишь на то, чтобы написать то, что тебе нужно. И в том, сколько времени ты потом будешь исправлять свои ошибки, нагуглив какую-нибудь хрень, не особо поняв при этом, что к чему
@@noname-bi7veоконки не часто используется у аналитиков, а тут вообще собес на DS
мне показалось это не синьор а шеф бургер джуниор за 199р в кфс.
Скажите, если я не прав. Зачем проводить ручной анализ данных, если можно запустить классификатор: случайный лес или градиентный бустинг и он тебе вернет вклад признаков в целевую переменную? И тогда мы бы увидели какие признаки вносят шум, а какие оказывают воздействие на таргет
Эксплоративный анализ данных же нужен не только для отбора признаков. К тому же иногда невыгодно сначала обучать модель, а потом из обученной модели получать информативность признаков. Представь себе, что у тебя есть 2000 признаков и целевая переменная. Если у тебя при этих 2000 признаках будет ещё и много наблюдений (скажем, пару миллионов), то обучать на таком датасете даже простейший классификатор типа дерева решений (не говоря уже про ансамбли) будет крайне затратно по времени и нерационально. Рационально в такой ситуации будет сначала сделать эксплоративный анализ данных и снизить размерность с помощью PCA / t-SNE / UMAP, тем самым оставив из исходных 2000 признаков только 5-10% наиболее информативных. Такой подход поможет избежать проклятия размерности и существенно увеличит скорость обучения модели, а также её качество.
@@user-mq7xq1hi2q Мне показалось, что данные анализировались/исследовались вручную, поэтому и задал вопрос о рациональности такого подхода. Как по мне, то я считаю, что следует использовать подход, основанный на автоматизированном выборе признаков.
Что же касается вашего примера 2000 признаков и пара миллионов примеров, то я полагаю ни кто не будет обучать на всех этим примерах классификатор для выбора признаков. Для этого часто применяют стохастический подход. Быстро и с приемлемым качеством. Когда вы приводите задачи понижения размерности, тот же t-SNE, вы же не обучаете на 2000 признаков и 2 млн примеров, иначе расчеты могут уйти на крайне продолжительное время.
Кстати, после понижения размерности, выражение "остается не 5-10% наиболее информативных". Это совершенно новые признаки, которые не стоит путать с ранее существующими (или я не прав?).
Строительство домов ремонт квартир в Москве и КРСК Я некорректно выразился - под 5-10% наиболее информативных признаков имелись в виду как раз сгенерированные PCA главные компоненты.
EDA необходим в любом случае:
1) Анализ пропусков/аномалий в данных, возможно, они не случайны и объясняются особенностями предметной области. К тому же в целом полезно понимать, с чем вы работаете, особенно если в работе важна интерпретация содержательных результатов.
2) Feature Importance в деревьях не всегда информативен, хотя и позволяет забивать на мультиколлинеарность. Он не может оценить объясняющую способность признаков, которые действуют только в комбинации друг с другом (ширина и длина прямоугольника объясняют его площадь только в комбинации друг с другом, по отдельности они получат importance = 0)
Итого, если Ваши признаки имеют смысл (иначе зачем их включать), и вы хотите получить содержательный результат, простейший EDA будет не лишним. Если ваша цель - подогнать модель под метрику, возможно, EDA не так востребован.
2 мидла проводят интервью на синьора?=)
В жизни так часто бывает
Когда собеседует человек который знает хуже
А Глеб точно lead data scientist в сбере? Встречал ребят оттуда, как по мне у Глеба знаний как на аналитика данных, ну максимум ведущего аналитика)
не лид он. Ты 100% угадал, кто он
Так это известный трюк переводить ведущий как Lead) А для настоящего лида, чтоб не спутать с такими кадрами, можно использовать перевод Team Lead)
ну блин, ну не верю я, что такие простые задачи дают senior - это максы стажер какой-нибудь)
я бы сделал задачу вот так за 5 сек
from itertools import permutations
print(len(list(permutations([i for i in 'abc'], len('abc')))))
permutations([i for i in 'abc'], len('abc')) == permutations('abc'). Ну и тут повторы не учитываются. Зачастую просят без импортов решать средствами чистого питона. Хотя эта задача чисто на тервер.
@@MrLotrus хз причем здесь теорвер - чистая комбинаторика из дискры. В том и ошибка, что такие задачи просят обычно решать так, как в жизни никто не делает т.е. вручную. Лучше уже тогда какую-нить норм задачку на алгоритмы впихнуть типа кратчайшего пути. А по поводу моего синтаксиса...хз, но в онлайн идеешке без списочного выражения не прокатило)
@@hopelesssuprem1867 да, верней комбинаторика. Я ее просто больше всего запомнил когда мы ее в рамках тервера изучали.
You lie
Задача из ЕГЭ просто)
def perms(s):
n = len(s)
d = dict()
for e in s:
if e in d.keys():
d[e] += 1
else:
d[e] = 1
div = 1
for v in d.values():
div *= fact(v)
return int(fact(n) / div)
def fact(n):
if n == 0:
return 1
else:
return n * fact(n - 1)
За рекурсию сразу в бан
@@MaruiInfantry почему?)
@@user-sv1em4jc7i для больших n у тебя переполнение по памяти будет/долго работать/надо в sys прописывать, ибо ограничение есть на рекурсию