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

แชร์
ฝัง
  • เผยแพร่เมื่อ 21 ต.ค. 2024

ความคิดเห็น • 60

  • @vadimvadim1662
    @vadimvadim1662 2 ปีที่แล้ว +13

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

  • @Extremesarova
    @Extremesarova 2 ปีที่แล้ว +12

    По поводу 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 по минимальной разнице во времени

  • @dmitrymitrofanov3920
    @dmitrymitrofanov3920 2 ปีที่แล้ว +4

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

  • @-VaTer
    @-VaTer ปีที่แล้ว +8

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

  • @mlpython1089
    @mlpython1089 2 ปีที่แล้ว +7

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

    • @npc-r390
      @npc-r390 2 ปีที่แล้ว

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

    • @bogdanns2
      @bogdanns2 2 ปีที่แล้ว +3

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

    • @ivanoleynikov7666
      @ivanoleynikov7666 ปีที่แล้ว

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

    • @IvanChetyrbok
      @IvanChetyrbok ปีที่แล้ว

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

  • @Extremesarova
    @Extremesarova 2 ปีที่แล้ว +4

    Если говорить про решение усложненной задачи классификации, то 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.

  • @Видеосъемказапрещена
    @Видеосъемказапрещена ปีที่แล้ว +1

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

  • @Skayfaks
    @Skayfaks 8 หลายเดือนก่อน +1

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

  • @shapovalentine
    @shapovalentine ปีที่แล้ว

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

  • @han-stroy
    @han-stroy 2 ปีที่แล้ว +3

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

  • @alexanderyurchenko7022
    @alexanderyurchenko7022 10 หลายเดือนก่อน

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

    • @freedomtv2295
      @freedomtv2295 6 หลายเดือนก่อน +1

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

  • @Igor-sp7tw
    @Igor-sp7tw 2 ปีที่แล้ว +1

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

    • @Extremesarova
      @Extremesarova 2 ปีที่แล้ว +1

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

    • @Igor-sp7tw
      @Igor-sp7tw 2 ปีที่แล้ว +2

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

    • @dimka11ggg
      @dimka11ggg 2 ปีที่แล้ว +1

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

  • @ПетяЛукин-х6ф
    @ПетяЛукин-х6ф 4 หลายเดือนก่อน

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

  • @nquartz
    @nquartz 2 ปีที่แล้ว +23

    У списков нет метода 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 да, я в курсе, прост на ходу вариант придумал)

  • @MrLotrus
    @MrLotrus 2 ปีที่แล้ว +1

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

    • @fungamer7140
      @fungamer7140 2 ปีที่แล้ว +7

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

    • @MrLotrus
      @MrLotrus 2 ปีที่แล้ว

      @@fungamer7140 точно.

  • @MegaUrolog
    @MegaUrolog 2 ปีที่แล้ว +6

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

  • @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

  • @lizardking640
    @lizardking640 2 ปีที่แล้ว +1

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

  • @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 7 หลายเดือนก่อน

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

  • @stanferrari4550
    @stanferrari4550 ปีที่แล้ว

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

  • @gregorygorbov4669
    @gregorygorbov4669 2 ปีที่แล้ว

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

  • @timurglazkov7778
    @timurglazkov7778 6 หลายเดือนก่อน

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

  • @НиколайШаманков-п3п
    @НиколайШаманков-п3п ปีที่แล้ว

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

  • @123-ix4fg
    @123-ix4fg 4 หลายเดือนก่อน

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

  • @luferov
    @luferov 2 ปีที่แล้ว

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

  • @karimkaa
    @karimkaa 4 หลายเดือนก่อน

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

  • @qwert8612
    @qwert8612 ปีที่แล้ว +1

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

  • @Ali-es9yz
    @Ali-es9yz 2 หลายเดือนก่อน

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

    • @Esseker
      @Esseker 6 วันที่ผ่านมา

      Что не так?

  • @ibragim_on
    @ibragim_on ปีที่แล้ว +1

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

  • @скриптослав
    @скриптослав ปีที่แล้ว +2

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

  • @Алг-ж3д
    @Алг-ж3д 2 ปีที่แล้ว +2

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

    • @vladimirmanikhin7918
      @vladimirmanikhin7918 ปีที่แล้ว

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

    • @Алг-ж3д
      @Алг-ж3д ปีที่แล้ว +3

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

    • @Esseker
      @Esseker 6 วันที่ผ่านมา

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