Типичное собеседование #2. Позиция Middle Data Scientist. Accepted!

Поділитися
Вставка
  • Опубліковано 10 лют 2025

КОМЕНТАРІ • 61

  • @dmitrymitrofanov3920
    @dmitrymitrofanov3920 2 роки тому +4

    я знал что такой канал должен быть. И вот, нашел!

  • @Видеосъемказапрещена

    Юля молодец, отличное собеседование, удачи в поиске работы!

  • @mlpython1089
    @mlpython1089 2 роки тому +8

    Спасибо за работу.
    Логистическая регрессия по шести признакам для кредитного скоринга в ВТБ. Интересно.

    • @npc-r390
      @npc-r390 2 роки тому

      200 признаков же

    • @bogdanns2
      @bogdanns2 2 роки тому +3

      @@npc-r390 она сказала, что изначально 200, а остаётся в итоге в модели всего несколько

    • @ivanoleynikov7666
      @ivanoleynikov7666 2 роки тому

      Если использовать все 200 или даже 50, то никому не объяснишь как это работает. И какая это будет формула с таким количеством признаков

    • @IvanChetyrbok
      @IvanChetyrbok Рік тому

      @@ivanoleynikov7666 Формула таже самая, в векторном виде. Да и объяснить то тоже можно относительно просто.

  • @vadimvadim1662
    @vadimvadim1662 2 роки тому +13

    Начало положено, начало неплохое. Осталось немного отполировать неточности:
    1. лучше пусть код будет в среде, чтобы можно было проверить, что все работает, обойдемся без бумагастайл (это касается и sql, потратьте 5-10 минут и подготовьте игрушечную базу данных)
    2. не надо обрезать/ускорять куски, интересно послушать как человек думает, и сравнивать со своими мыслями (у ютуб есть замечательная функция ускорения)

  • @mind.flow777
    @mind.flow777 Рік тому

    Спасибо🙏 Все молодцы👍

  • @Extremesarova
    @Extremesarova 2 роки тому +13

    По поводу 19:42 ниже уже говорили, что решение на видео совсем неправильное во многих местах.
    - Многие оконные функции не принимают аргументов - в данном случае, все аргументы только в функции over().
    - partition by здесь не нужен - мы не будем сегментировать по разнице - мы будем сортировать по ней - поэтому будем использовать order by
    - Оконные функции применяются в последнюю очередь, поэтому в where использоваться не могут. Чтобы результат оконной функции использовать в where, нужно делать подзапрос с оконной функцией, которая сформирует колонку, а потом к получившейся таблице делать внешний запрос.
    Если делать правильно, то должно быть как-то так (принимаются комментарии и замечания к запросу):
    select
    a1.id,
    a1.url,
    row_number() over(order by abs(UNIX_TIMESTAMP(a1.url) - UNIX_TIMESTAMP(a2.url))) as time_difference_rank
    from
    adv_syst1 as a1
    join adv_syst2 as a2 on a1.id = a2.id and a1.url = a2.url
    Здесь мы отранжируем события, начиная с событий с минимальной разницей.
    Если же мы хотим найти прям только те события, у которых минимальная разница, то оконные функции не нужны - достаточно вложенным запросом найти минимальную разницу, а потом внешним запросом вывести события с минимальной разностью.

    • @kalinin_sanja
      @kalinin_sanja 2 роки тому +1

      Действительно, непонятно, зачем там, вообще, нужны оконные функции. Постановка задачи говорит о сопоставлении двух записей из таблиц. Следующий запрос должен решать это:
      SELECT s1.id, s1.url, s1.timestamp t1, s2.timestamp t2,
      min(abs(s1.timestamp-s2.timestamp)) as dif
      FROM adv_syst1 s1 JOIN adv_syst2 s2 ON (s1.id=s2.id AND s1.url=s2.url)
      GROUP BY s1.id, s1.url, s1.timestamp

    • @wallevel9572
      @wallevel9572 Рік тому

      ​@@kalinin_sanjaне правильно, как минимум в group by не хватает ещё одного timestamp из селекта. Да и в целом непонятно что выводит. Надо было соединить две таблицы по минимальной разнице во времени.

    • @wallevel9572
      @wallevel9572 Рік тому +1

      Ваш запрос без partition просто ранжирует весь массив и что это нам даёт? а у нас условие соединить две таблицы по id, url по минимальной разнице во времени

  • @Hamsters_Rage
    @Hamsters_Rage Місяць тому

    со второй sql задачей прям нужен пример данных. она дольше разбиралась что именно надо сделать

  • @Igor-sp7tw
    @Igor-sp7tw 2 роки тому +1

    Круто, иногда кажется что вы много подсказываете, но возможно так и нужно, спасибо за контент)

    • @Extremesarova
      @Extremesarova 2 роки тому +1

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

    • @Igor-sp7tw
      @Igor-sp7tw 2 роки тому +2

      @@Extremesarova да нет, кажется просто хорошо готов был на базовые залачи

    • @dimka11ggg
      @dimka11ggg 2 роки тому +1

      @@Extremesarova В первом видео интервью очень простое, даже для уровня Junior

  • @ulebok
    @ulebok 2 роки тому +8

    Вот такое есть компактное решение для первой задачи :)
    def round_to_next5(x):
    return x + (-x % 5)

  • @Extremesarova
    @Extremesarova 2 роки тому +5

    Если говорить про решение усложненной задачи классификации, то standard scaling ничего не даст - как были данные расположены относительно друг друга, так и останутся, только масштаб будет другой - центры окружностей будут не в точках (0, 0) и (10, 10), а в точках (-1, -1) и (1, 1) - четыре окружности не схлопнуться в две в центре координат. Может быть я не понял что вы имели ввиду.
    Самое простое решение в данном случае - это свести задачу к предыдущей - сдвинуть вторую окружность на место первой и затем применить такое же преобразование (так как данные синтетические, то это получится):
    new_df_1 = df[(df["features_1"] 5)].copy()
    new_df_1["best_feature"] = new_df_1["features_1"] ** 2 + new_df_1["features_2"] ** 2
    new_df_2["best_feature"] = (new_df_2["features_1"] - 10) ** 2 + (new_df_2["features_2"] - 10) ** 2
    new_df = pd.concat([new_df_1, new_df_2])
    И все - решили задачу с 100% качеством.
    Также полезно (что в первом, что во втором случае) посмотреть на новую фичу sns.stripplot(data=new_df, y="label", x="best_feature"), чтобы понять почему она позволяет нам решить эту задачу.

    • @kalinin_sanja
      @kalinin_sanja 2 роки тому

      В уравнении окружности нужно учитывать координаты её центра. Либо 0, либо 10. А какой именно - можно посмотреть, например, на features_2.

  • @Skayfaks
    @Skayfaks Рік тому +1

    Юля молодец. Андрей, резкий какой то (на грани ттксика)

  • @-VaTer
    @-VaTer 2 роки тому +9

    На взгляд начинающего DS: Видос интересный, но не оставляет чувство постановки. На простых вещах мы спотыкаемся и при этом как-то ускоряемся там, где "хотелось-бы поподробней" (причем обе стороны заинтересованы побыстрее проскочить). Очень странно, что по мнению работодателя для профоценки DS достаточно темы линейной регрессии (пибл. 1-2% от темы DS) или я пропустил как Юля билет про ЛР вытянула? Для человека, который не выполняет ежедневно эти действия Юля как то слишком бодро ориентируется. Или она устраивается на работу, которую уже выполняла минимум полгода? Так вроде где то мелькнуло, что она меняет вид деятельности?

  • @nthrqrtz
    @nthrqrtz 2 роки тому +25

    У списков нет метода sum)

    • @alexmiptagain
      @alexmiptagain 2 роки тому +10

      Да и sum со строками не работает.
      С функцией row_number() на 26:21 вообще дичь сотворили. Минимум 3 смысловые ошибки в конструкции: не должно быть аргумента, partition неправильный, нельзя использовать в WHERE (оконные функции вычисляются движком намного позже, чем обрабатывается блок WHERE).

    • @stonsosedki512
      @stonsosedki512 2 роки тому

      Интересно что интервьюер в прошлом бекендер, но говорит сум по листу бахнуть

    • @hopelesssuprem1867
      @hopelesssuprem1867 2 роки тому

      можно sum в reduce запихнуть)

    • @stonsosedki512
      @stonsosedki512 2 роки тому +1

      @@hopelesssuprem1867 я тоже думал об этом. Но мне не кажется что он предполагал этот вариант 😅

    • @hopelesssuprem1867
      @hopelesssuprem1867 2 роки тому

      @@stonsosedki512 да, я в курсе, прост на ходу вариант придумал)

  • @alexanderyurchenko7022
    @alexanderyurchenko7022 Рік тому +1

    Таких простых задач на реальных собеседованиях, к сожалению, не бывает. Всегда попадались задачи уровня как минимум medium с leetcode. И, разумеется, требовалось максимально эффективное решение.

    • @freedomtv2295
      @freedomtv2295 10 місяців тому +1

      Ну если вы только по гуглам ходите, то может быть
      Так в целом, дают максимум изи с литкода, но уж точно не медиум

  • @MrLotrus
    @MrLotrus 2 роки тому +1

    В сложной задаче по питону можно обойтись без сортировок, приведя строки к frozenset

    • @fungamer7140
      @fungamer7140 2 роки тому +7

      А если у тебя слова с кучей одинаковых букв? Тогда твоя программа будет думать что слова meet и met являются анагрмамми

    • @MrLotrus
      @MrLotrus 2 роки тому

      @@fungamer7140 точно.

  • @gregorygorbov4669
    @gregorygorbov4669 2 роки тому

    27:56
    Господа, то что предлагается сделать - это ввести признак x1 * x2. И этот признак должен способствовать разделению такому, чтобы мы могли линией разбить точки. Но ведь это же ложь. Если у нас выборка [ (0,0), (1,0), (1,1), (0, 1) ] тогда у нас три точки уйдут в (0,0), а одна уйдет в (1,1).
    Объясните мне это ли предлагается?

  • @uberkinder
    @uberkinder 2 роки тому +1

    Решение первой задачи:
    def f(n):
    return n - (n % 5) + (n % 5 > 0) * 5

    • @firi4737
      @firi4737 2 роки тому

      def f(n):
      return (n // 5 + 1) * 5

    • @uberkinder
      @uberkinder 2 роки тому +3

      @@firi4737 ваше решение даёт неверный ответ в точках где число делится на 5: например (30 // 5 + 1) * 5 будет (6 + 1) * 5 = 35, а нужно давать 30

  • @han-stroy
    @han-stroy 2 роки тому +3

    Молодцы, кандидат хорошо держалась. Мне зашла генерация признаков. Можно ли использовать для этого TSNE как альтернативу?

  • @stanferrari4550
    @stanferrari4550 Рік тому

    нормик) молодец, а то тут сеньор был))) один

  • @ПетяЛукин-х6ф
    @ПетяЛукин-х6ф 8 місяців тому

    Не совсем понятно качество решения алго задачи на такого рода вакансию. В том же Яндексе был бы автореджект. Мидл очевидно предлагает неоптимальное решение(sum доп память по сравнению с join выделяет и как будто можно решить без сортировки эту задачу просто за линию).
    Соответственно вопрос: вообще насколько важно качественно решать алго задача на подобных собеседованиях на дс. Понимаю что мок интервью и собеседующим может не очень интересно докапываться до оптимальности кода, но насколько за это карают на собесах в топ компании?

  • @hopelesssuprem1867
    @hopelesssuprem1867 2 роки тому +2

    Спасибо за интервью, сейчас как раз сам учусь на ML, поэтому было интересно.
    По поводу задачи на анаграммы...я бы решал вот так:
    from collections import Counter
    letters = ['aBc', 'bcA', 'Cba', 'Ab', 'ba', 'BA']
    print(Counter((''.join(sorted(i.lower())) for i in letters)))
    сейчас объясню че тут происходит:
    1) берем из модуля Collections Counter - счетчик, который сразу нам считает кол-во элементов элементов и возвращает словарь + он очень быстрый
    2) приводим все элементы к одинаковому виду через выражение-генератор. Почему генератор? Представьте, что у нас в списке миллионы строк и чтобы не загружать всю оперативу, а выгружать элементы поштучно, поэтому мы его и используем.
    P.s. Не стал писать через функцию, чтобы можно было посмотреть как работает код, если кому-то будет интересно.

  • @IvanChetyrbok
    @IvanChetyrbok Рік тому

    "Можно ли разделить линейкой?" Конечно можно! Поскольку X^2 + Y^2 = К линейно относительно X^2 и Y^2.

    • @savchenkooleksandr2191
      @savchenkooleksandr2191 11 місяців тому

      Ваша гиперплоскость линейна, но вот в пространстве признаков х2 y2 она данные классы не сможет разделить. И в пространстве x y xy, как советует интервьюер, тоже не получится. Девушка здесь права, чтобы разделить гиперлинией, нужно переходить в 6 мерное пространство и признаками вплоть до второго порядка x y, погуглите XOR проблема, или персептрон применять. Без критики, вдруг кому то поможет

  • @lizardking640
    @lizardking640 2 роки тому +1

    ua-cam.com/video/lEBidVsG7bk/v-deo.html можно немного подробнее объяснить, что здесь произошло? То есть, смотря на пейрплот, понятно, что одна окружность имеет центр (0 ,0), другая - (10, 10), и для признаков >5 можно вычесть центр и посчитать квадрат радиуса. Такая визуальная оценка этих параметров и предполагается или можно до них иначе дойти? И второй вопрос: не совсем понял, как поможет разделить центрирование/стандартизация и произведение f1 на f2

  • @timurglazkov7778
    @timurglazkov7778 10 місяців тому

    У list нет метода sum(), если бы у нас был np.ndarray, это сработало бы

  • @123-ix4fg
    @123-ix4fg 8 місяців тому

    Когда будет новое видео

  • @luferov
    @luferov 2 роки тому

    Сложная задача - похожа на задачу от Яндекса по алгоритмам )

  • @НиколайШаманков-п3п

    ФБМФ + MADE. Буду знать, что моя связка совсем не уникальна. Автор, почему решил уйти из биоинформатики?

  • @qwert8612
    @qwert8612 Рік тому +1

    list не имеет атрибут sum

  • @karimkaa
    @karimkaa 8 місяців тому

    Юлия очень милая)

  • @Ali-es9yz
    @Ali-es9yz 6 місяців тому

    Это пздц конечно, если они такие решения по SQL принимают

    • @Esseker
      @Esseker 3 місяці тому

      Что не так?

  • @скриптослав
    @скриптослав 2 роки тому +2

    Да если эта руина мидл то я сеньор тогда

  • @Алг-ж3д
    @Алг-ж3д 2 роки тому +2

    Жесть, это точно миддл?)

    • @vladimirmanikhin7918
      @vladimirmanikhin7918 2 роки тому

      слабо или наоборот слишком круто ?

    • @Алг-ж3д
      @Алг-ж3д 2 роки тому +3

      @@vladimirmanikhin7918 спустя месяц не помню именно содержание видоса, но на тот момент я бы отнёс кандидата больше к "слабо"

    • @Esseker
      @Esseker 3 місяці тому

      @@Алг-ж3дпочему не к сильно?

  • @ibragim_on
    @ibragim_on Рік тому +1

    А чего в Лондон, а не в рассеюшки?😂😂
    Канал годный!🎉