Quantcast
Loading...
Are you the publisher? Claim or contact us about this channel


Embed this content in your HTML

Search

Report adult content:

click to rate:

Account: (login)
Loading...

More Channels


Showcase


Channel Catalog


Loading...

Channel Description:

Точка входа в мир Data Science
    0 0

    Создавайте веб-приложения для демонстрации своих проектов без знания каких-либо веб-фреймворков.

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

    В прошлом хорошо сделанной визуализации или небольшой презентации в Power Point было достаточно для демонстрации проекта, но сейчас, с появлением инструментов для создания дашбордов вроде RShiny или Dash, хороший data science-специалист должен иметь некоторое представление о веб-фреймворках.

    Но проблема в том, что веб-фреймворки достаточно сложны в изучении. Я до сих пор путаюсь по всех этих HTML, CSS и Javascript, и даже что-то, что выглядит простым в исполнении, начинает работать только после большого количества проб и ошибок.

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

    Так что же, мы обречены на изучение веб-фреймворков? Или на звонки нашим друзьям-разработчикам посреди ночи с глупыми вопросами?

    И тут нам на выручку спешит Streamlit с обещанием позволить нам создавать веб-приложения, используя только Python. Следуя философии Python – “просто – лучше, чем сложно”, Streamlit предельно упрощает создание приложений.

    В этой статье я хочу показать как создавать приложения для демонстрации data science-проектов с помощью Streamlit.

    Чтобы лучше понять архитектуру Streamlit, а также идеи, которые привели к его созданию, прочитайте отличную статью одного из разработчиков и основателей Адриана Трёля.

    Курс «Python для анализа данных»
    Идет набор в группу 2 700₽ в месяц

    Установка

    Установить Streamlit очень просто, делается это с помощью одной команды: 

    pip install streamlit

    Чтобы проверить успешно ли прошла установка, можно использовать

    streamlit hello

    После этой команды на экране должен появиться следующий текст:

    Теперь вы можете перейти по локальному URL localhost:8501 в вашем браузере, чтобы увидеть Streamlit в действии. Разработчики предоставили несколько демо, которые будет интересно изучить. Не торопитесь и постарайтесь понять широкие возможности приложения, прежде чем вернуться к этой статье.


    Streamlit Hello World

    Streamlit стремится сделать разработку приложений проще с использованием исключительно Python.

    Давайте попробуем написать простое приложение, чтобы увидеть получилось ли это у них.

    Я начну с простого приложения, которое мы назовем Streamlit Hello World. Просто скопируйте текст ниже в файл с названием helloworld.py:

    import streamlit as st
    x = st.slider('x')
    st.write(x, 'squared is', x * x)
    

    И используйте в терминале команду:

    streamlit run helloworld.py

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

    Простое приложение со слайдером

    Это было достаточно просто. В приложении выше мы использовали две функции из Streamlit:

    • Виджет st.slider, который мы можем сдвигать, чтобы изменять вывод веб-приложения
    • И универсальную команду st.write. Я в восторге от того, как она может писать все что угодно, включая графики, датафреймы и обыкновенный текст. Но мы еще поговорим об этом позже.

    Важно: Помните, что каждый раз, когда мы меняем значение в виджете, все приложение перезапускается целиком.

    DS
    Специализация Data Science
    Идет набор в группу 12 500₽ в месяц

    Виджеты Streamlit

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

    1. Слайдер

    streamlit.slider(label, min_value=None, max_value=None, value=None, step=None, format=None)

    Мы уже видели st.slider в действии. Он может быть использован с указанием минимального и максимального значения, а также шага для получения входящих значений в заданном диапазоне.

    2. Ввод текста

    st.text_input — это самый простой способ получить на вход текст от пользователя — будь это какой-то URL или текст для анализа его тональности. Нужно только передать функции название текстового окна.

    import streamlit as st
    url = st.text_input('Enter URL')
    st.write('The Entered URL is', url)
    

    Так будет выглядеть получившееся приложение:

    Простое приложение с виджетом text_input

    Совет: Вы можете просто изменить файл helloworld.py и обновить браузер. Я обычно работаю таким образом: открываю и изменяю файл в Sublime Text и наблюдаю за изменениями в браузере расположенном в рядом с окном редактора.

    3. Чекбокс

    Один из вариантов использования чекбоксов — это показывать или прятать определенную часть приложения. Или, например, чекбокс может использоваться для выбора булевозначного параметра для функции. st.checkbox()использует только один аргумент — метку виджета. 

    В этом приложении чекбокс используется для переключения условного оператора:

    import streamlit as st
    import pandas as pd
    import numpy as np
    df = pd.read_csv("football_data.csv")
    if st.checkbox('Show dataframe'):
       st.write(df)
    
    Простой виджет-чекбокс

    4. Выпадающий список

    Мы можем использовать st.selectbox для выбора из списка. Обычно эта функция используется для создания выпадающего списка, который позволяет выбрать значение.

    import streamlit as st
    import pandas as pd
    import numpy as np
    df = pd.read_csv("football_data.csv")
    option = st.selectbox(
       'Which Club do you like best?',
        df['Club'].unique())
    'You selected: ', option
    
    Приложение с выпадающим списком

    5. Выбор нескольких значений

    Мы также можем выбрать несколько значений из выпадающего списка. Для этого можно использовать st.multiselect, которая сохранит несколько выбранных значений в виде списка в переменную options:

    import streamlit as st
    import pandas as pd
    import numpy as np
    df = pd.read_csv("football_data.csv")
    options = st.multiselect(
    'What are your favorite clubs?', df['Club'].unique())
    st.write('You selected:', options)
    
    Виджет с мультивыбором

    Пошаговое создание простого приложения

    Вот мы и разобрали самые важные виджеты. Теперь давайте создадим простое приложение с использованием нескольких из них.

    Начнем с простого: попробуем визуализировать данные футбольных матчей с использованием Streamlit. Это достаточно легко сделать с помощью вышеописанных виджетов:

    import streamlit as st
    import pandas as pd
    import numpy as np
    df = pd.read_csv("football_data.csv")
    clubs = st.multiselect('Show Player for clubs?', df['Club'].unique())
    nationalities = st.multiselect('Show Player from Nationalities?', df['Nationality'].unique())
    # Filter dataframe
    new_df = df[(df['Club'].isin(clubs)) & (df['Nationality'].isin(nationalities))]
    # write dataframe to screen
    st.write(new_df)
    

    Получившееся приложение будет выглядеть вот так:

    Сочетание нескольких виджетов

    Это было легко. Но результат выглядит достаточно просто, может стоит добавить графиков?

    Streamlit на данный момент поддерживает многие библиотеки для построения графиков. Среди них Plotly, Bokeh, Matplotlib, Altair и Vega charts. Кроме того, работает и Plotly Express, хотя это и не указано в документации. Помимо внешних библиотек, в Streamlit встроены и свои нативные типы графиков, например st.line_chart и st.area_chart.

    Сейчас мы будем работать с plotly_express. Вот код для нашего простого приложения. Мы используем всего 4 вызова Streamlit, все остальное — это простой Python:

    import streamlit as st
    import pandas as pd
    import numpy as np
    import plotly_express as px
    df = pd.read_csv("football_data.csv")
    clubs = st.multiselect('Show Player for clubs?', df['Club'].unique())
    nationalities = st.multiselect('Show Player from Nationalities?', df['Nationality'].unique())
    new_df = df[(df['Club'].isin(clubs)) & (df['Nationality'].isin(nationalities))]
    st.write(new_df)
    # create figure using plotly express
    fig = px.scatter(new_df, x ='Overall',y='Age',color='Name')
    # Plot!
    st.plotly_chart(fig)
    Приложение с графиком

    Возможные улучшения

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

    1. Кэширование

    В нашем базовом приложении мы читаем датафрейм pandas снова всякий раз, когда значение изменяется. И хотя это работает с маленькими базами данных как та, которую мы используем сейчас, но это не сработает с big data или если нам понадобится проводить большое количество манипуляций с данными. Давайте используем кэширование через функцию st.cache:

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

    @st.cache
    def complex_func(a,b):
       DO SOMETHING COMPLEX
    # Won't run again and again.
    complex_func(a,b)

    Когда мы помечаем функцию кэширующим декоратором, всякий раз, когда эта функция вызывается, Streamlit будет проверять входные параметры функции.

    Если Streamlit видит эти параметры впервые, он запустит функцию и сохранит результат в локальном кэше.

    Когда функция будет вызывана в следующий раз, если эти параметры не изменились, Streamlit будет знать, что выполнение функции можно пропустить — он просто использует результаты из кэша.

    2. Сайдбар

    В зависимости от ваших предпочтений, вы можете сделать что-то похожее на Rshiny dashboards и переместить свои виджеты в боковую панель, чтобы придать приложению более аккуратный вид. Для этого просто добавьте st.sidebar в код вашего виджета:

    import streamlit as st
    import pandas as pd
    import numpy as np
    import plotly_express as px
    df = st.cache(pd.read_csv)("football_data.csv")
    clubs = st.sidebar.multiselect('Show Player for clubs?', df['Club'].unique())
    nationalities = st.sidebar.multiselect('Show Player from Nationalities?', df['Nationality'].unique())
    new_df = df[(df['Club'].isin(clubs)) & (df['Nationality'].isin(nationalities))]
    st.write(new_df)
    # Create distplot with custom bin_size
    fig = px.scatter(new_df, x ='Overall',y='Age',color='Name')
    # Plot!
    st.plotly_chart(fig)
    Виджеты перемещены в сайдбар

    3. Markdown

    Мне нравится использовать Markdown. Мне он кажется менее громоздким, чем HTML, и более подходящим для работы в data science. Можем ли мы использовать Markdown в Streamlit-приложении?

    И ответ: да, можем. Есть несколько способов это осуществить. На мой взгляд, лучший вариант — это использовать Magic commands. Эти команды позволят вам использовать Markdown точно так же как и простое комментирование. Но вы также можете воспользоваться командой st.markdown.

    import streamlit as st
    import pandas as pd
    import numpy as np
    import plotly_express as px
    '''
    # Club and Nationality App
    This very simple webapp allows you to select and visualize players from certain clubs and certain nationalities.
    '''
    df = st.cache(pd.read_csv)("football_data.csv")
    clubs = st.sidebar.multiselect('Show Player for clubs?', df['Club'].unique())
    nationalities = st.sidebar.multiselect('Show Player from Nationalities?', df['Nationality'].unique())
    new_df = df[(df['Club'].isin(clubs)) & (df['Nationality'].isin(nationalities))]
    st.write(new_df)
    # Create distplot with custom bin_size
    fig = px.scatter(new_df, x ='Overall',y='Age',color='Name')
    '''
    ### Here is a simple chart between player age and overall
    '''
    st.plotly_chart(fig)

    Финальное демо приложения


    Заключение

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

    В этой статье я показал очень простое веб-приложение, но на деле возможности использования безграничны. В качестве примера хочу привести GAN-генератор лиц с сайта Streamlit. Это приложение работает на основе тех же идей виджетов и кэширования.

    Мне нравятся цветовая гамма и стили, которые разработчики Streamlit используют по умолчанию, плюс мне кажется, Streamlit удобнее в использовании, чем Dash, который я использовал до этого для создания демо. К тому же Streamlit позволяет добавлять аудио и видео в свои приложения.

    Отдельный бонус — это то, что Streamlit является бесплатным open source решением, которое работает прямо из коробки. В прошлом мне приходилось обращаться к друзьям-разработчикам для любого изменения в демо или презентации; теперь все это я могу относительно просто проделать сам.

    Я не знаю, будут ли Streamlit-приложения хорошо работать в производственной среде, но они отлично подходят для proof of concept и демо. Я планирую продолжить работать со Streamlit, и, учитывая простоту использования и возможности, которые он предоставляет, я думаю, вам тоже стоит об этом задуматься.Вы можете найти код финальной версии приложения здесь.

    Оригинал: How to write Web apps using simple Python for Data Scientists?

    Перевод: Ухарова Елена

    Сообщение Как написать веб-приложение для демонстрации data science проекта на Python появились сначала на SkillFactory.


    0 0

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

    DS
    Специализация Data Science
    Идет набор в группу 12 500₽ в месяц

    Три типа дистанции в Data Science

    Как рассчитать расстояние между двумя точками? Ответ на этот вроде бы простой вопрос может оказаться вовсе не очевидным — все зависит от задачи, которая перед вам стоит.

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

    Очевидно, что такой способ не учитывает множество усложнений, которые существуют в реальности. Например, если вы хотите узнать оптимальный путь между точками на городской карте, вам нужно принимать в расчет расположение дорог и кварталов. Для этого вы воспользуетесь так называемой L1-дистанция. Эта метрика учитывает только движение по горизонтали или вертикали, не позволяя срезать углы (в нашем примере это значит, что вы не можете пройти сквозь дом).

    Третий важный тип дистанции в Data Science — это метрика Чебышёва, знаменитого академика XIX века, которого ставят в один ряд с Лобачевским. Его метод позволяет измерять расстояние шагами шахматного короля. Как известно, эта фигура может двигаться в любом направлении, но только на одну клетку. Метрика Чебышёва обеспечивает эффективное управление дронами, которые получают возможность задействовать полную мощность своих моторов, двигаясь как прямо, так и по диагонали.

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

    Шесть полезных проектов с открытым кодом

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

    В этой подборке вы увидите:

    • Фреймворк от nVidia для превращения статичных фото в видео
    • Гибкую модель распознавания лиц
    • Систему распознавания объектов для беспилотных авто
    • NLP-фреймворк Google для обработки текстовых материалов
    • Python-библиотеку для отрисовки графиков, диаграмм и прочих материалов в карандашном стиле
    • Огромную карту знаний, позволяющая оценить возможности графов

    Предсказание динамики чаевых с помощью Python

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

    Автор шаг за шагом проводит нас по всей процедуре подготовки модели. Используя открытые источники, он создает набор данных, в котором объем чаевых оказывается распределен по дням недели, полу посетителей и даже тому, курят они или нет. В таких вещах мелочей не бывает!

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

    Как функции-генераторы повышают производительность Python

    Генераторы — это очень удобный инструмент Python-разработчика, позволяющий эффективно использовать различные объекты по многу раз. Таким образом вы можете абстрагировать контейнеры или наборы данных, зацикливать функции и решать множество других задач. 

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

    Применение R в Data Science

    Язык R получает гораздо меньше славы, чем тот же Python, однако его позиции в науке данных от этого вовсе не слабеют. Как мы уже рассказывали, большинство средних и старших позиций в Data Science предполагают уверенное владение R. Это очень мощный инструмент для работы со статистикой, включающий немало уникальных и полезных возможностей.

    Статья объединяет пять преимуществ R, благодаря которым он нередко обходит Python. Это впечатляющий набор библиотек для экономических, финансовых и прочих задач, удобные средства визуализации и построения отчетов, эффективная инфраструктура с поддержкой высокопроизводительных алгоритмов. В материале также упоминаются библиотеки и пакеты, которые снижают порог входа в R для новичков — сложность этого языка до недавнего времени была одним из главных его негативных факторов.

    Профессиональный Data Scientist обязательно должен иметь R в своем багаже, так что мы рекомендуем эту статью всем, кто планирует карьеру в науке данных. И тем, кому не хватает возможностей Python для каких-то специфических задач.

    Десять ошибок Data Scientist при представлении данных

    Значительная часть науки о данных посвящена тому, как дата-сайентист может правильно представить результаты своих изысканий. Это действительно очень важно, ведь в конечном счете смысл Data Science и состоит в том, чтобы найти связь между миром цифр и актуальными проблемами, с которыми к эксперту приходят заказчики. Вне зависимости от того, помогает ли он своим коллегам или консультирует сторонние компании, он должен правильно понять задачу и грамотно представить свое видение ответа.

    Поэтому нередко можно услышать, что эксперт по Data Science должен рассказывать истории в цифрах. Как и в литературе, такие истории должны строиться по определенным правилам, иначе читатель заскучает и не уловит основную мысль. Автор следующей статьи рассматривает десять самых частых ошибок, которые мешают дата-сайентисту рассказывать истории. Это и проблемы «словарного запаса», и сюжетные огрехи, и плохой контакт с аудиторией. Материал будет полезен любым аналитикам, которые применяют свои умения, чтобы решать проблемы бизнеса.

    100 вопросов и ответов на собеседовании дата-сайентиста 

    Этот энциклопедический материал сильно повысит ваши шансы в борьбе за вакансию Data Scientist. Основную часть составляют вопросы технического характера, которые проверяют владение различными программами и решениями, знания технологий статистики, управления большими данными и программирования, понимание тонкостей Python, R и SQL. В статье также указаны общие темы, которые часто всплывают на подобных собеседованиях. Эти вопросы касаются умений работать в команде и решать конфликты, разделять частную и профессиональную жизнь, способности превозмогать трудности и бороться с рутиной. 

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

    Составил: Помогаев Дмитрий

    Сообщение Дайджест SkillFactory: ТОП-7 статей по Data Science появились сначала на SkillFactory.


    0 0

    Многие из специальностей, которым обучают в SkillFactory, рассчитаны на новичков — тех, кто собирается начать обучение с нуля. Однако студентам бывает сложно поверить, что такая сложная специальность — и без базовых знаний. Многим кажется, что нужно уже уметь программировать и иметь пятёрку по математике в аттестате. Но дата-сайентистом может стать любой: мы поговорили с Оксаной Дерезой, которая за год из кельтолога переквалифицировалась в специалиста по data science.

    Оксана закончила филологический факультет МГУ, и до того, как прийти в data science, занималась преподаванием языков (английский, ирландский) и письменным переводом с английского, датского, французского, и ирландского на русский.

    SkillFactory: Как и почему вы начали заниматься наукой о данных?

    Оксана: Когда я заканчивала 5 курс, я начала работать аналитиком веб-данных в Лаборатории Касперского. Благодаря этой работе я поняла, что мне хотелось бы не просто собирать и размечать данные, а решать более интересные задачи с ними, и заинтересовалась IT в целом.

    SF: Расскажите, как вы пришли к изучению анализа данных?

    O.: Я решила, что не хочу полностью уходить от своей первой специальности и что интереснее всего мне было бы работать с текстовыми данными, поэтому, закончив МГУ, я поступила в магистратуру по компьютерной лингвистике в московскую Вышку (НИУ ВШЭ). На тот момент это была лучшая магистратура по компьютерной лингвистике в России, судя по отзывам и карьерному пути выпускников. Параллельно с обучением в магистратуре я дополнительно проходила курсы по программированию, машинному обучению и NLP на Coursera и edX.

    SF: Как и где вы искали материалы для обучения?

    O.: В некотором смысле все было уже сделано за меня: магистерская программа включала в себя все необходимое — от линейной алгебры до машинного перевода. Что касается онлайн-курсов, какие-то из них советовали однокурсники, а какие-то я выбирала, ориентируясь на то, кто их читает: для меня в приоритете были известные ученые и data scientist’ы вроде Кристофера Мэннинга и Эндрю Ына. Еще мы с однокурсниками часто ходили на открытые лекции и семинары в Яндекс, Mail.ru и т.п. — о таких событиях, как правило, нам рассказывали преподаватели, или же мы узнавали о них из тематических рассылок и групп в соцсетях.

    SF: Из каких источников вы брали информацию? И правда ли, что если не знаешь английский, то у тебя нет шансов?

    O.: В основном это были англоязычные, потому что когда я училась в магистратуре (2015–2017 гг.), русскоязычных ресурсов особо не было. Сейчас с ними все обстоит гораздо лучше: переведено уже много книг издательства O’Reilly, появляются книжки по машинному обучению и data science российских авторов (например, «Глубокое обучение. Погружение в мир нейронных сетей» С. Николенко, А. Кадурина и Е. Архангельской). То же самое можно сказать об онлайн-курсах: большую работу в этом направлении ведут, например, Яндекс и ФКН НИУ ВШЭ. Так что сейчас английский уже не является барьером для изучения data science; единственная серьезная проблема, с которой придется столкнуться без знания английского, — это чтение документации библиотек.

    SF: С какими сложностями пришлось столкнуться в процессе обучения?

    O.: Самой главной сложностью лично для меня было вспомнить математику и разобраться в алгоритмах. Решала я эти проблемы банально — много занималась. А еще мы с однокурсниками всегда помогали друг другу, вместе разбирались в непонятных темах. Я бы сказала, что ключевыми факторами успеха в моем случае были целеустремленность и командная работа.

    DS
    Специализация Data Science
    Идет набор в группу 12 500₽ в месяц

    SF: Сколько времени прошло с момента, когда вы начали изучать data science, до первой работы по новой специальности?

    O.: Поскольку я уже работала в IT-компании, когда начала изучать data science, мне просто постепенно стали давать новые задачи, связанные с программированием и анализом данных. Через год учебы я уже полностью перешла с задач веб-аналитика на задачи компьютерного лингвиста.

    SF: Какими задачами вам приходится заниматься?

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

    SF: Что больше всего бесит и что больше всего вам нравится в профессии?

    O.: Бесит — сидеть целый день за компьютером, нравится — то, что многие задачи в data science включают в себя исследовательский элемент: какие данные взять, как их обработать, какие признаки выбрать для обучения модели, какая архитектура даст оптимальный результат… Ну и расслабленная и дружелюбная атмосфера в IT в целом. 

    SF: Как изменилась ваша зарплата после начала карьеры в Data Science?

    O.: Моя зарплата внутри одной компании выросла примерно в два раза, но, надо сказать, что и работать я начала побольше. Впрочем, в какой-то момент мне стало скучновато и захотелось вернуться в академическую среду, поэтому я уволилась из ЛК и начала преподавать в Вышке программирование и NLP, параллельно занимаясь собственными исследованиями, а через два года уехала в Ирландию писать PhD. Надо сказать, что последние два события на зарплате сказались отрицательно, но я рассматриваю это как инвестицию в будущее.

    SF: На какие качества дата-сайентиста смотрят при найме на работу?

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

    SF: Вы не пожалели о своем решении?

    O.: Нет, потому что теперь я могу совмещать в своей работе и исследованиях две совершенно разных области, и у меня гораздо больше выбор дальнейших путей развития карьеры. Ну и, в конце концов, data scientist зарабатывает во много раз больше преподавателя языка или переводчика, хотя, как ни странно, это не было частью моей мотивации для перехода.

    SF: Дадите какой-нибудь совет для тех, кто хочет проникнуть в науку о данных?

    O.: Я бы сказала, что сейчас везде смотрят не на дипломы и сертификаты, а на то, что ты умеешь, поэтому главный совет — собирайте портфолио на GitHub, участвуйте в соревнованиях на Kaggle и в хакатонах от IT-компаний. Еще полезно ходить на мероприятия, посвященные data science, которые эти компании организуют — например, Sberbank Data Science / AI Journey. Помимо того, что на таких мероприятиях можно послушать ведущих российских и зарубежных data scientist’ов и даже с ними познакомиться, там часто бывают рекрутеры компании-организатора.

    SF: Насколько реально найти работу за границей (с переездом или удалённо)?

    O.: Рынок IT стремительно растет во всем мире, хороших специалистов не хватает, поэтому найти работу data scientist’a за рубежом вполне реально — знаю немало примеров. Я уехала немного с другой целью — писать диссертацию (PhD), но все происходило совершенно как при приеме на работу: никаких мотивационных писем и research proposal, только резюме и техническое собеседование. Оно не показалось мне сложным, потому что я подавалась в проект, для которого мои исследовательские интересы и экспертиза подходили идеально, поэтому с решением задач у меня проблем не возникло.

    Сейчас Оксана — кандидат PhD и исследователь в Insight Centre for Data Analytics, в Национальном университете Ирландия Голуэй.

    Сообщение История успеха: как из кельтолога переквалифицирвоаться в Data Scientist? появились сначала на SkillFactory.


    0 0

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

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

    partfolio_ds
    Специализация Аналитик Данных
    Идет набор в группу 6 900₽ в месяц

    В поисках идеального сотрудника

    Full-stack data scientist, владеющий навыками машинного обучения, статистики и аналитики одновременно — это мечта для любого бизнеса, имеющего дело с data science, но найти такого практически невозможно, и это неудивительно. И когда у компаний не получается заполучить специалиста «три в одном», они переключаются на попытки переманить к себе сотрудников с наиболее впечатляющим опытом в одной из этих областей. Но в какой именно? 

    Сейчас в data science в моде нарочитая сложность с щепоткой научной фантастики, что делает искусственный интеллект и машинное обучение самыми желанными навыками для найма. Следом идут статистики, популярность которых поддерживает многовековая репутация строгости и математического превосходства. Но что насчет аналитиков?

    Аналитика — гражданка второго сорта

    Если ваши основные навыки лежат в области аналитики (а также data-mining, или бизнес-аналитики), то, скорее всего, ваша уверенность в себе страдает от того, что ваши коллеги из вышеупомянутых областей обходят вас по карьерной лестнице, а рынок труда делает не очень тонкие намеки, что вам стоит пересмотреть свою специализацию, чтобы присоединиться к ним в карьерном росте.

    Для непосвященного достаточно сложно понять, что эти три профессии полностью отличаются друг от друга. Они могут использовать одни и те же уравнения, но на этом сходство заканчивается. Аналитика — это далеко не “недоделанная” версия других специальностей. Хорошие аналитики необходимы для того, чтобы удостовериться в эффективности ваших начинаний в области data science. Если из команды уйдут все аналитики, то успех проекта окажется под угрозой. И это именно то, что они сделают, если их продолжат недооценивать.

    Одинаково достойны

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

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

    DS
    Специализация Data Science
    Идет набор в группу 12 500₽ в месяц

    Эксперт в области статистики: строгость

    Будучи специалистами, способными с уверенностью делать глобальные выводы на основе имеющихся данных, статистики — это ваша лучшая защита от совершения ошибок в мире, полном неопределенности. Для них допустить небрежность в умозаключениях — это больший грех, чем не сделать выводов вовсе, поэтому не удивляйтесь тому, что хороший статистик притормозит темпы работы, несмотря на весь энтузиазм команды. Будучи осторожными, они всегда беспокоятся подходят ли применяемые методы для решения стоящей проблемы, и мучаются в попытках понять какой вывод на основе имеющейся информации будет наиболее верен.

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

    Что мы имеем в результате? Обоснованную позицию, которая поможет принимать важные бизнес-решения и контролировать риски.

    Неудивительно, что многие статистики остро реагируют на «выскочек», которые зазубривают уравнения, не углубляясь в философию. Если работа со статистиками кажется вам утомительной, вот быстрое решение этой проблемы: просто не делайте никаких выводов о чем-либо, что находится за пределами имеющихся у вас данных, и вам не понадобятся их услуги. (Легче сказать, чем сделать, верно? Особенно, если вы хотите принять важное решение о, например, начале нового проекта.)

    Эксперт в области машинного обучения: производительность

    Возможно, вы инженер по прикладному машинному обучению или искусственному интеллекту, если на «Могу поспорить, что вы не сможете построить модель, которая пройдет тестирование с точностью 99,9999%» вы ответите: «Посмотрим,» и приметесь за работу. 

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

    “Заработает, куда денется,” -Инженер

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

    В этом случае производительность — это не только обозначение некоторой метрики, но и надежность, масштабируемость и простота в обслуживании моделей, которые хорошо работают в реальном производстве. Здесь без отточенных технических навыков никак.

    Вширь или вглубь?

    Роли статистика и специалиста по машинному обучению объединяет общая цель: найти решение конкретной сложной задачи. Если проблемы, которые они пытаются решить, не стоят затраченных усилий, то вы тратите впустую их время и свои деньги. Предприниматели часто жалуются на то, что их отдел data science бесполезен, но проблема обычно заключается в отсутствии экспертных знаний в области аналитики.

    Статистики и инженеры по машинному обучению — это специалисты в узких и глубоких областях (которые похожи на кроличьи норы), поэтому очень важно указать им на проблемы, которые заслуживают решения и вложения сил. Если ваши эксперты будут тщательно решать не те проблемы, то ваши инвестиции в data science не принесут прибыли. Чтобы использовать таких “узких и глубоких” специалистов эффективно, вам нужно либо быть уверенным, что у вас уже есть подходящая проблема, либо вам нужен иной — широкий и поверхностный — подход к ее поиску.

    Эксперт в области аналитики: скорость

    Лучшими аналитиками являются программисты, которые могут молниеносно просматривать огромные наборы данных, обнаруживая и выявляя потенциальные варианты применения этих данных за время, которого другим специалистам хватило бы только на то, чтобы сказать “вайтборд”. Их небрежный стиль программирования может поставить в тупик традиционных инженеров-программистов… пока они не останутся далеко позади, глотая пыль. Скорость — это самая важная характеристика в этой области, за которой следует способность не упустить ничего, что может потенциально принести пользу. Умение визуализировать информацию тоже помогает ускорить работу: качественно сделанные графики позволяют быстрее воспринять информацию, оставляя больше времени для генерации идей.

    Там, где статистики и ML-инженеры могут быть медлительны, аналитики похожи на вихрь, вдохновляющий своими выкладками руководство и других data science коллег.

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

    Бессмыслица или блестящее повествование?

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

    Аналитики — это еще и хорошие рассказчики. Их задача состоит в том, чтобы обобщить интересные факты, но при этом соблюдать осторожность и помнить, что любая романтическая идея, возникшая в порыве вдохновения, не должна восприниматься всерьез без поддержки со стороны статистики.

    Хорошие аналитики неуклонно следуют одному золотому правилу своей профессии: не делать выводов о чем-то, что лежит за пределами имеющихся данных (и не позволяйте вашей аудитории делать это). К сожалению, относительно немногие люди в этой области являются в этом смысле настоящими аналитиками. Поэтому будьте осторожны: вокруг полно шарлатанов, изображающих из себя специалистов в области data science. Они несут чушь, бесконтрольно прыгая между существующими данными и воображаемыми, принимая желаемое за действительное, чтобы поддержать свою историю. Если ваши стандарты в области этики не слишком высоки, то возможно, вам стоит держать этих шарлатанов под рукой, применив их выдающиеся способности в темных искусствах маркетинга. Но лично я бы предпочла не делать этого.

    Пока аналитики придерживаются фактов (“Вот что мы имеем здесь”. Но что это значит? “Только то, что это здесь есть”) и не относятся к себе слишком серьезно, худшее преступление, которое они могут совершить — это потратить чье-то время на обсуждение возникшей идеи. Из следования своему золотому правилу хорошие аналитики используют уклончивые выражения (например, не «мы можем сделать вывод», а «это побуждает к дальнейшему размышлению») и охлаждают пыл владельцев бизнеса броситься в авантюру, подчеркивая множество возможных интерпретаций имеющихся данных.

    В то время как статистические навыки необходимы для проверки гипотез, аналитики — ваш лучший инструмент для того, чтобы сначала выдвинуть эти гипотезы. Например, они могут сказать что-то вроде «Это всего лишь корреляция, но я подозреваю, что это может быть вызвано…», а затем объяснить, почему они так думают.

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

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

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

    Гибрид между аналитиком и статистиком

    Для аналитиков, придерживающихся фактов, нет такой вещи как “неправильно”, есть только “медленно”. И попытка добавить аналитику навыки в области статистики только для того, чтобы «делать все правильно» не имеет смысла, хотя бы потому, что между предварительным анализом данных и последующими строгими статистическими выкладками существует важный фильтр: лицо, принимающее решения. Кто-то несущий ответственность должен оценить насколько дальнейшая разработка идеи оправдана с точки зрения бизнеса и стоит ли она времени экспертов. Так что если такой гибрид между аналитиком и статистиком не является одновременно человеком, принимающим решения, то  его набор навыков превращается в этакий бутерброд с дырой посередине.

    Однако аналитики, которые могут заполнить и этот разрыв, ценятся на вес золота. Берегите их!

    Аналитика для машинного обучения и ИИ

    Специалисты по машинному обучению прогоняют множество входных данных через алгоритмы, настраивают параметры и продолжают выполнять итерации, пока не будут получены правильные результаты. Хотя может показаться, что аналитика здесь не играет никакой роли, на практике в бизнесе на вход приходит слишком разных потенциальных “ингредиентов”, чтобы бездумно пихать их все вместе в алгоритмический блендер.

    Один из способов отфильтровать ненужное из огромного количества данных — это воспользоваться чьим-то опытом в предметной области и спросить их мнение о том, как все это может работать. Другой способ — это аналитика. Если использовать аналогию с кулинарией, то инженеры по машинному обучению отлично разбираются во всем, что находится на кухне, но оказавшись перед огромным темным складом, полным потенциальных ингредиентов, им не слишком понятно что с этим делать. Они либо могут начать беспорядочно хватать все, что попадется под руку, и тащить на кухню, либо они могут сначала отправить сбегать на этот склад кого-то, вооруженного фонариком. Ваш аналитик — это как раз такой бегун; их способность помочь вам увидеть и быстро понять то, что происходит вокруг — это невероятный бизнес-ресурс.

    Гибрид между аналитиком и специалистом по машинному обучению

    Аналитики ускоряют проекты по машинному обучению, поэтому такие гибридные навыки могут быть очень полезными. Но, к сожалению, из-за различий в стиле программирования и подходах между аналитикой и проектированием ML, достаточно редко можно увидеть внушительный опыт в обеих областях у одного человека (еще реже встречаются разве что специалисты, которые ко всему этому могут еще и превращаться при необходимости в неспешных философов, поэтому full-stack data scientist — это практически мифический зверь).

    Опасные последствия пренебрежительного отношения

    Эксперт-аналитик — это не некачественная подделка, которую пытаются выдать за специалиста по машинному обучению, их стиль программирования намеренно оптимизирован для скорости. Они не “плохие статистики” — аналитики не имеют дело с неопределенностью, они имеют дело с фактами. «Вот что мы можем увидеть в наших данных, предполагать что происходит за их пределами — это не моя работа, но, возможно, на основе моих результатов можно будет поставить задачу для статистиков…»

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

    Например, статистики могут забыть уравнения для вычисления p-значения для t-теста, потому что получат это значение, запустив нужную программу, но никогда не забудут как и когда его использовать, а также как верно интерпретировать результаты. Аналитики же не хотят интерпретировать. Они пытаются увидеть форму огромного многомерного набора данных. Зная, как уравнение для p-значения разделяет их набор данных, они могут мыслить в обратном направлении, пытаясь представить какие тенденции должны быть в исходном наборе данных, чтобы в итоге вычислений получилось имеющееся число. Без понимания математики стоящей за этими процессами вы не получите такого представления. В отличие от статистиков, им все равно, подходит ли t-критерий для данных. Их заботит только то, даст t-тест ли им полезную идею о том, что происходит в текущем наборе данных. Тонкое различие, но оно важно.

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

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

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

    Если вы сделаете слишком сильный акцент на найме и поощрении специалистов в области машинного обучения и статистики, вы потеряете своих аналитиков. Кто тогда поможет вам понять, какие задачи стоит решать? Вы останетесь с группой несчастных экспертов, которых будут постоянно дергать ради работы над бесполезными проектами и заставлять выступать в роли аналитиков, на что они, в общем-то, не подписывались. Ваши данные будут лежать мертвым грузом, не принося никакой пользы.

    Правила ухода за исследователями

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

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

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

    Так что правильное время для найма исследователей для прикладного проекта, как правило, наступает только после того, как ваши аналитики помогли вам обнаружить важную задачу, а ваши прикладные специалисты не смогли ее решить существующими методами. И вот тогда в игру вступают профессиональные исследователи.

    Мораль

    Если у вас есть сомнения, то наймите аналитиков прежде чем нанимать людей на другие роли. Цените их и поощряйте их. Более того, поощряйте их совершенствоваться в выбранной ими карьере (а не чьей-то другой). Из всех ролей, упомянутых в этой истории, любой бизнес обязательно нуждается только в руководящих лицах, принимающих решения, и аналитиках. Специалистов из других областей вы сможете эффективно использовать только тогда, когда точно будете знать для чего они вам нужны. Начните с аналитиков и гордитесь своей новообретенной супер-способностью видеть и воспринимать все многообразие информации вокруг вас. Важность идей, которые могут родиться в результате этого — это не что-то, от чего можно отмахнуться.

    Изображение, принадлежащее VICKI JAURON, BABYLON AND BEYOND PHOTOGRAPHY/GETTY IMAGES, которое было использовано в статье Harvard Business Review. Моя любимая интерпретация этой фотографии: человек — это владелец бизнеса, отгоняющий стаи аналитиков в попытках поймать людей с новомодными профессиями.

    Если вам понравилась эта статья, то прочитайте и мой гайд по миру data science.

    Оригинал: Data Science’s Most Misunderstood Hero

    Перевод: Ухарова Елена

    Сообщение Непризнанные герои data science появились сначала на SkillFactory.


    0 0

    В нашем мире заведено так, что человек уже к моменту своего совершеннолетия должен быть уверен в том, чем же он хочет заниматься до конца жизни. А еще лучше, если он мечтает о какой-то определенной профессии с детства. Дальше сценарий один: вы учитесь, находите работу и через несколько лет, а может и сразу, понимаете, что занимаетесь не тем. Что же делать? Позади уже какой-никакой, но опыт, годы обучения в университете, да и окружающие не поймут. 

    DS
    Специализация Data Science
    Идет набор в группу 12 500₽ в месяц

    В итоге, у многих начинается стресс, а мысли о прожитой впустую жизни невольно постигают все чаще. Многие боятся менять свой привычный уклад, когда за спиной есть уже какой-то багаж. Однако, жизнь у нас одна и прожить ее нужно с удовольствием. Поэтому, мы хотим дать вам несколько советов о том, как менять свою жизнь, если вы чувствуете, что все идёт не так, как вы хотите. 

    Что же с вами происходит? 

    Скорее всего, вы чувствуете карьерный кризис или же выгорание, когда текущая работа и все задачи, которые ее касаются, приносят не радость и удовлетворение, а раздражение и разочарование не только в работе, но и в себе. Даже если на работу вы устраивались с горящими глазами, вас может настигнуть это чувство через какое-то время. Не всегда это значит, что пора уходить с работы, возможно вы просто устали. 

    Попробуйте отдохнуть 

    Возьмите отпуск и переключитесь на другие задачи. Не обязательно улетать в тёплые страны, можно просто заняться чем-то интересным в свободное время. Запишитесь на танцы, йогу или займитесь тем, чем давно хотели. Хотя, конечно же смена обстановки, новая страна или город, определенно поднимут боевой дух и оставят о себе неизгладимые впечатления. 

    Итак, вы вернулись из отпуска и снова окунулись в работу. Если вы чувствуете прилив сил и готовы свернуть горы, то все хорошо. Понаблюдайте за этими ощущениями в течение какого-то времени, чтобы убедиться, что вам действительно нужен был лишь отпуск. Но, если вы вышли на работу и осознали, что раздражение не прошло, а только усилилось, и вы все также не хотите работать в данной сфере, то это сигнал к тому, что пора что-то делать. 

    Постарайтесь разобраться с тем, что вас не устраивает в текущей работе. Не спешите подавать заявление на увольнение. Выделите время, сядьте и ответьте на пару вопросов.

    1. Получаете ли вы удовольствие от того, чем занимаетесь сейчас? 
    2. Хотите ли вы развиваться в данной сфере?
    3. Может вам вам просто стоит сменить место работы?
    4. Что именно вам не нравится на текущей работе?

    Если все ваши ответы указывают на то, что текущая работа вам не подходит, то тут не поможет ни отпуск, ни денежное вознаграждение. Когда каждое утро вам становится тоскливо только от одной мысли о том, что пора на работу, это точно не та ситуация, когда следует игнорировать собственные желания и мысли. 

    Подумайте об удаленной работе 

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

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

    partfolio_ds
    Специализация Аналитик Данных
    Идет набор в группу 6 900₽ в месяц

    Как понять, что делать дальше?

    Обратите внимание на следующие вопросы и ответьте на них. Не торопитесь, отнеситесь к этому серьезно. Данные вопросы помогут вам понять, на какие сферы обратить внимание и как действовать дальше. 

    1. Что вам приносит настоящее удовольствие?
    2. Кем вы видите себя через 5, 10 лет?
    3. Чего вы хотите достичь в жизни?
    4. Чем вы увлекаетесь?
    5. Какая работа вам нравится? Творческая, общение с людьми или что-то другое?

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

    Не окунайтесь в омут с головой, дайте себе время

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

    Учтите, что для получения многих современных профессий не обязательно учиться в университете, и часто достаточно курсов, которые длятся от пары недель до нескольких месяцев. Занятость на подобных курсах позволяет совмещать их с работой, так что вы сможете получить необходимую профессию, не отрываясь от работы. Есть множество интернет школ, например SkillFactory, где вас обучат различным интернет-профессиям, а также помогут окунуться в новую среду. 

    Подготовьте финансовую подушку

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

    Лучше всего рассчитывать как минимум месяца на четыре, а то и на полгода. В любом случае, деньги лишними не будут, тем более, что лучше предугадать, так как может случиться действительно что-то непредвиденное. 

    Хорошенько подумайте 

    Не стоит решаться на такой шаг под влиянием эмоций. Стоит действительно хорошо все продумать и взвесить, ведь в первое время у вас не будет такой стабильности, которая может быть на текущей работе. 

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

    Не переоценивайте себя 

    Есть люди, которым нужен контроль и точные сроки. Переход на другую работу, особенно, если это касается фриланса, требует жесткого самоконтроля. 

    Подумайте, сможете ли вы грамотно составить свой рабочий день и сможете ли поддерживать работоспособность. Срыв сроков грозит отрицательным отзывом, а также потерей денег и времени. 

    Изучите выбранную сферу 

    Когда вы определились с тем, чем хотите заниматься, начните изучать сферу. Читайте форумы, ищите информацию, посмотрите объявления. У вас должно быть полноценное представление не только о профессии со стороны работы, но и со стороны обстановки внутри. Также обратите внимание на расценки. 

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

    Готовьтесь работать за низкую оплату 

    Первое время вы будете работать на портфолио. Для этого придётся зарегистрироваться на различных биржах, побороть страх и начать брать заказы. Кроме того, обратитесь к знакомым. Может быть, кому-то из них понадобятся ваши услуги. 

    Оплата новичка будет ожидаемо меньше, чем та, которую берет крутой специалист. Вам стоит это учитывать. Именно для этого вам понадобится финансовая подушка на первое время. Не опускайте руки и начинайте постепенно поднимать ценник. 

    Создайте портфолио

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

    Не бойтесь

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

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

    Текст: Манятовская Анна

    Сообщение Смена карьеры? Топ-10 советов как не бояться менять свою жизнь появились сначала на SkillFactory.


    Loading...
    0 0

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

    Недавно специалисты по нейросетям предложили эффективную модель, позволяющую определять эмоции в письменной речи с помощью графов. Свое решение они назвали DialogueGCN — от Graph Convolutional Neural Network, или сверточная граф-нейросеть. Давайте разберемся, как она работает и как технологии прикладного машинного обучения и Deep Learning в будущем помогут роботам понимать наши саркастичные ответы.

    Курс по Machine Learning
    Идет набор в группу 3 800₽ в месяц

    Исследователи исходят из того, что значение фразы зависит от двух уровней контекста:

    • Последовательный контекст связан с позицией каждого слова в предложении, а высказывания — в диалоге. В этом случае изучаются взаимоотношения между словами, семантические и синтаксические характеристики предложений. В общем и целом, это достаточно отстраненный подход, позволяющий создать структурную картину фразы.
    • Разговорный контекст (Speaker Level Context) принимает во внимание отношения между участниками беседы. В этом случае анализируются не только слова и предложения, а их влияние как на слушателя, так и на автора высказывания (поскольку состояние человека и его контекст могут поменяться после произнесения фразы). Очевидно, что эти материи, во-первых, связаны с вопросами психологического характера, и, во-вторых, гораздо сложнее поддаются механическому анализу.

    Создатели DialogueGCN сосредоточились именно на разговорном контексте. Они выяснили, что графы позволяют моделировать такие взаимоотношения, добывая материалы для дальнейшего машинного обучения.

    Исследователи представили каждое высказывание как вершину графа u[1], u[2], …, u[N]. Это граф направленный, т.е. u[1]-u[2] не равняется u[2]-u[1]. У каждой грани есть две характеристики: вес W и отношение R. Конечная цель работы — обучить нейросеть распознавать эмоциональную окраску каждого высказывания.

    Этот граф отражает диалог из пяти фраз. Разные цвета обозначают разных участников. (Источник)

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

    У такой методики есть слабое место — с течением времени и увеличением числа участников граф может увеличиваться до огромных масштабов, требуя все больше вычислительных ресурсов. Исследователи решили эту проблему введением дополнительного параметра i, который ограничивает допустимое окно анализа. При обработке каждой фразы нейросеть принимает во внимание только те высказывания, которые лежат от него в пределах i в обоих направлениях от узла. Таким образом она обрабатывает и прошлые высказывания, которые привели к реплике, так и будущие, которые за ней последовали.

    Курс по нейронным сетям
    Идет набор в группу 4 200₽ в месяц

    Теперь подробнее о характеристиках граней, которые играют ключевую роль для машинного обучения эмоциям. Как говорилось раньше, у каждой грани есть вес W и отношение R. Первый параметр определяет значение каждого высказывания в разговоре, второй описывает его тип. Вес рассчитывается с помощью специальной функции внимания — в этой статье мы не будем в нее углубляться, заинтересовавшихся отправляем к оригиналу. Отношение учитывает, кто и когда произнес ту или иную реплику. Таким образом, в графе отражается последовательность и авторство фраз в беседе. 

    Чтобы подготовить данные для GCN, каждое высказывание представляется в качестве признакового вектора (festure vector), которому присваивается значение последовательного контекста. Для этого фразы прогоняются через серию управляемых рекуррентных блоков (Gated Recurrent Unit, GRU). Полученные данные предлагаются нейросети в виде графа для выделения признаков. По итогам этого процесса GCN присваивает репликам разговорный контекст, опираясь на нормализованную сумму вершин, которые соединены с каждой отдельной фразой.

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

    Общая схема обработки диалога (источник)

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

    В итоге работу DialogueGCN проверяли на следующих наборах данных:

    • IEMOCAP: диалоги между десятью разными людьми с эмоциональными отметками каждой фразы.
    • AVEC: диалоги между людьми и компьютерными ассистентами, реплики отмечены ярлыками по нескольким характеристикам.
    • MELD: 1400 диалогов и 13 тыс. высказываний из сериала «Друзья» с эмоциональной разметкой.

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

    Основная часть ошибок DialogueGCN оказалась связана с двумя сценариями. Во-первых, нейросеть путает близкие эмоции вроде злости и расстройства или счастья и возбуждения. Кроме того, компьютер плохо понимает окрас коротких высказываний («окей», «ага»). Эксперты предположили, что долю ошибок можно сократить, добавив видео- и аудиопотоки данных, от которых они сознательно отказались.

    Значение этой работы не ограничивается интересными перспективами для систем обработки языка (Natural Language Processing, NLP). Это отличный пример применения графов в Data Science и прикладном машинном обучении. Возможность анализировать связи между объектами позволяет раскрыть суть их взаимоотношений, чтобы добавить в математическое уравнение даже такие призрачные категории, как человеческое настроение.

    Текст: Помогаев Дмитрий

    Сообщение Как нейросеть училась понимать эмоции по сериалу «Друзья» появились сначала на SkillFactory.


    0 0

    Через несколько недель нас ждет 2020-й, а новый год — это отличный повод задуматься о свежих горизонтах. Наша сегодняшняя статья адресована тем, кто планирует сменить работу и хочет, чтобы его резюме привело к успешному собеседованию.

    Правило №1. Никакой лишней информации

    Этот вроде бы очевидный совет никогда не теряет актуальности — в вашем резюме должны быть только самые важные данные, которые показывают, почему вы подходите для данной работы. Если вы думаете, что трехстраничный труд лучше всего отразит ваш профессионализм, вы ошибаетесь. Единственный вывод, который сделает работодатель — это что вы не умеете структурировать собственные мысли и выделять главное.

    Как понять, какую информацию указать в резюме? Проще всего узнать у работодателя — только не звонить в офис, а внимательно прочитать описание вакансии. Там вы наверняка увидите список технических компетенций и примерный спектр работ. Не стоит копипастить все это в свое резюме — лучше задумайтесь, как выглядит специалист мечты для этой компании? После этого приложите этот портрет к себе и определите, в каких точках вы совпадаете. Постройте свое резюме на этих совпадениях, придерживаясь своего опыта и подкрепляя заявленные навыки четкими и понятными фактами.

    Не забывайте, что первым получателем вашего резюме, скорее всего, будет специалист о персоналу. Эти сотрудники очень далеки от технических тем и зачастую ориентируются на ключевые слова, которые им дает заказчик вакансии. Постарайтесь найти такие понятия в тексте объявления и вписать их в свой текст.

    И не надо вспоминать про уверенное владение компьютером и офисными программами.

    partfolio_ds
    Специализация Аналитик Данных
    Идет набор в группу 6 900₽ в месяц

    Правило №2. Понятная и логичная структура

    Вы можете строить свое резюме разными способами. Чаще всего люди выбирают хронологическую модель, рассказывая о своем опыте от последнего места работы и дальше вглубь истории. Это понятная структура, которая последовательно показывает ваш путь как специалиста. Рекрутерам проще читать такие резюме, поскольку они могут быстро создать впечатление о человеке.

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

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

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

    Правило №3. Понятный сюжет карьеры

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

    Посмотрите сайт будущего работодателя, изучите последние новости и проекты, попробуйте понять предпосылки вакансии. Может быть, это новый руководитель набирает себе команду? Опишите в резюме свои умения командного игрока. Или топ-менеджмент запускает экспериментальное бизнес-направление? Подчеркните, как вы умеете справляться с неожиданными трудностями и безвыходными ситуациями. Может быть, это самая обычная вакансия, которая открылась из-за уволившегося специалиста? Тогда стоит сосредоточиться на привычных корпоративных ценностях.

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

    Курс «Data-driven management»
    Идет набор в группу 6 300₽ в месяц

    Правило №4. Грамотный проектный опыт

    Из предыдущего пункта напрашивается вывод — каждый проект в резюме должен дополнять портрет, который вы создаете. А все вместе должно подводить к мысли о вашем найме.

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

    Создали удобное мобильное приложение для друзей? Отлично. Научили нейросеть распознавать монстров на детских рисунках? Великолепно. Запустили микроплатформу для блогов, чтобы разобраться в какой-то хитрой функции интересного фреймворка? Записываем.

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

    Правило №5. Правильные метрики успеха

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

    Не надо говорить, что вы работали с десятью веб-фреймворками — расскажите, что запустили на их основе десять сайтов и приведите суммарную аудиторию. Не стоит писать, что просто занимались поддержкой инфраструктуры — уточните, сколько человек благодаря вашим усилиям могли работать с бизнес-критичными системами, и как повысилась их производительность.

    Задумайтесь, какие метрики могут быть интересны не только IT-специалистам, но и бизнес-департаментам. Сейчас именно эти подразделения нередко запускают IT-проекты в компаниях, и не исключено, что благодаря такой инициативе открылась и ваша вакансия. Привяжите свои навыки к возможным бизнес-результатам, и вам будет проще найти общий язык на собеседовании.

    Текст: Помогаев Дмитрий

    Сообщение Пять правил эффективного резюме появились сначала на SkillFactory.


    0 0

    Наши давние читатели знают, что мы не любим холивары — глупо спорить о том, какой продукт, язык программирования или технология лучше, если на рынке существуют несколько вариантов. Если существуют, значит, кому-то они зачем-то нужны. Поэтому профессионалы в холиварах не участвуют, понимая, что для одних задач A лучше Б, а для других — Б лучше А.

    Именно так обстоит дело с Python и PHP, которые нередко делят разработчиков на враждующие лагеря. В этой статье мы сравним между собой эти два популярных языка, чтобы дать вам представление об их преимуществах и уязвимостях.

    Специализация Full-stack веб-разработчик на Python
    Идет набор в группу 5 900₽ в месяц

    Что такое Python?

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

    Что такое PHP?

    PHP создавался в первую очередь для нужд веб-разработки. Его название расшифровывается как «препроцессор гипертекста», что и определяет его основную задачу — обогащать возможности интернет-сайтов, превращая их статичные страницы в веб-приложения. PHP легко интегрируется с большинством веб-серверов, работает со всеми распространенными операционными системами. Этот язык тоже может похвастаться довольно понятным синтаксисом и низким порогом входа. Огромная армия PHP-разработчиков готова свидетельствовать, что он объединяет в себе все необходимые средства для работы с серверными скриптами.

    Главное, что нужно понять и запомнить: PHP — это язык веб-разработки, а применение Python не ограничивается какой-то одной областью. Это самое важное различие между этими языками, все остальное фактически относится к «вкусовым качествам фломастеров».

    Пройдемся по этим качествам — какими особыми возможностями привлекают разработчиков Python и PHP?

    Анализ Данных: курс-тренажер по SQL
    Идет набор в группу 1 600₽ в месяц

    Особенности Python

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

    Минимум лишних задач. Python избавляет разработчика от необходимости думать об особенностях обращения с памятью, сбора мусора и прочих технических моментах. Поэтому даже у сложных приложений можно создать понятную структуру, сэкономив при этом значительную часть времени и сил (а это время и силы разработчиков — это деньги).

    Кроссфункциональность. Поддержка Python встроена в множество программных платформ и операционных систем, сам язык можно интегрировать с Java, C и C++. Единожды написанное приложение не приходится многократно портировать, придумывая каждый раз сложные костыли. Это также экономит ресурсы, а также помогает разработчикам расширить свою потенциальную аудиторию.

    Богатство возможностей. Широта применения Python обеспечивается за счет впечатляющего количества разнообразных библиотек. Развернуть их можно буквально парой строк кода, после чего программист-разработчик может гибко распоряжаться всем необходимым ему инструментарием — манипулировать математическими операциями, строить нейросети, автоматизировать процессы и так далее до бесконечности.

    Особенности PHP

    Высокая производительность. Для веб-разработки скорость выполнения программ играет ключевую роль. Так что неудивительно, что PHP по этому параметру обходит многих конкурентов, включая и Python. Преимущество достигает кратных размеров, что может иметь серьезное значение, если с приложением работают десятки тысяч пользователей.

    Работа с множеством платформ. Еще одно требование веб-разработки — обеспечивать стабильное качество вне зависимости от решения на серверной стороне. PHP отлично дружит с Oracle, MySQL, Apache, Windows, Unix, Linux и многими другими платформами. 

    Всеобщая популярность. Один из самых весомых аргументов для PHP-разработчиков — в ближайшие годы владение этим языком обеспечивает профессионала стабильной работой. Подавляющая часть веб-ресурсов работает на PHP, этот язык используют WordPress, Drupal, Magento и прочие распространенные системы управления сайтами. Python завоевывает очки в мире веб-разработки благодаря модным стартапам и интернет-сервисам. Однако основная доля существующего интернет-бизнеса построена на PHP, и в вакансиях программистов этот язык требуется гораздо чаще, особенно в регионах.

    Обширное коммьюнити. По этой же причине сообщество PHP-разработчиков гораздо шире, чем в случае Python. Здесь проще найти нужное руководство или получить ответ на возникший вопрос. Количество библиотек, которые создали эти профессионалы, также значительно превышает показатели Python, который занимает догоняющую позицию (уж в области веб-разработки — точно).

    Какой вывод можно сделать из этого сравнения? Чтобы выбрать язык для изучения, нужно определиться с целями.

    Хотите иметь постоянный поток заказов и не беспокоиться о будущем? Добро пожаловать на курсы PHP. Вы быстро освоите один из самых популярных серверных языков, получите обширное представление о внутренней кухне веб-приложений и заложите прочный фундамент для дальнейшей успешной карьеры.

    Воспринимаете веб-разработку как трамплин в мир программирования? Изучение Python — ваш оптимальный выбор. Вам не придется идти на профессиональные компромиссы, вы наберете весь необходимый багаж знаний и сможете браться за сложные и интересные проекты. А потом, если захотите, сможете перейти в другую область — заниматься искусственным интеллектом или погрузиться в Data Science. 

    Текст: Помогаев Дмитрий

    Сообщение Вопросы выбора: PHP против Python в 2020 году появились сначала на SkillFactory.


    0 0

    Auto-tinder, созданный на основе Tensorflow и Python 3, может изучить ваши предпочтения в противоположном поле, а затем лайкать за вас профили в Tinder, которые могли бы вам понравиться. 

    В этой статье я планирую рассказать о шагах, которые потребовались мне, чтобы создать Auto-tinder, а именно:

    • Анализ веб-страницы Tinder на предмет внутренних вызовов API, реконструкция этих вызовов в Postman, и анализ их содержимого
    • Создание класса-обертки для API на Python, чтобы дальше использовать Tinder API для лайков\дизлайков\мэтчей
    • Загрузка изображений пользователей, которые находятся неподалеку
    • Создание простого классификатора для пометки изображений
    • Разработка препроцессора, использующего Tensorflow API для распознавания объектов, чтобы определять расположение человека на фото
    • Переобучение сверточной нейронной сети inceptionv3 на классифицированных данных
    • И, наконец, использование классификатора вместе с оберткой Tinder API, чтобы они свайпали за нас

    Шаг 0: Мотивация и дисклеймер

    Auto Tinder — это проект, который был создан исключительно в образовательных целях, ну и забавы ради. Он не должен быть использован во вред кому-либо или для того, чтобы заспамить платформу. Кроме того, не используйте скрипты Auto-Tinder под вашим профилем, поскольку они, безусловно, нарушают условия использования Tinder.

    Я написал эту программу в основном по двум причинам:

    1. Потому что могу и потому что это было весело. 🙂

    2. Я хотел узнать, сможет ли ИИ действительно понять что меня привлекает в противоположном поле, чтобы я смог доверить ему свайпать за меня.

    3. Ну и третья, абсолютно вымышленная причина: я ленивый человек, так почему бы не потратить 15 часов, чтобы написать Auto-tinder, плюс 5 часов, чтобы классифицировать изображения, чтобы в итоге сэкономить несколько часов, которые мне пришлось бы потратить на то, чтобы сидеть в Tinder самому. Звучит как разумный план!

    Step 1: Анализ API

    Первый шаг — выяснить, как приложение Tinder взаимодействует с бэкендом. Поскольку у Tinder есть веб-версия, это достаточно просто: идем на tinder.com, открываем Chrome Devtools и смотрим на сетевой протокол.

    Содержимое, показанное на картинке выше, было получено по запросу https://api.gotinder.com/v2/recs/corehttps://api.gotinder.com/v2/recs/core, который был сделан при загрузке страницы tinder.com. Понятно, что у Tinder есть какой-то внутренний API, который они используют для связи между фронт-эндом и бэкэндом.

    После анализа содержимого /recs/core становится ясно, что эта конечная точка API возвращает список профилей пользователей, которые находятся поблизости.

    Данные включают (среди многих других полей) следующую информацию:

    {
        "meta": {
            "status": 200
        },
        "data": {
            "results": [
                {
                    "type": "user",
                    "user": {
                     "_id": "4adfwe547s8df64df",
                        "bio": "19y.",
                        "birth_date": "1997-17-06T18:21:44.654Z",
                        "name": "Anna",
                        "photos": [
                            {
                                "id": "879sdfert-lskdföj-8asdf879-987sdflkj",
                                "crop_info": {
                                    "user": {
                                        "width_pct": 1,
                                        "x_offset_pct": 0,
                                        "height_pct": 0.8,
                                        "y_offset_pct": 0.08975463
                                    },
                                    "algo": {
                                        "width_pct": 0.45674357,
                                        "x_offset_pct": 0.984341657,
                                        "height_pct": 0.234165403,
                                        "y_offset_pct": 0.78902343
                                    },
                                    "processed_by_bullseye": true,
                                    "user_customized": false
                                },
                                "url": "https://images-ssl.gotinder.com/4adfwe547s8df64df/original_879sdfert-lskdföj-8asdf879-987sdflkj.jpeg",
                                "processedFiles": [
                                    {
                                        "url": "https://images-ssl.gotinder.com/4adfwe547s8df64df/640x800_879sdfert-lskdföj-8asdf879-987sdflkj.jpg",
                                        "height": 800,
                                        "width": 640
                                    },
                                    {
                                        "url": "https://images-ssl.gotinder.com/4adfwe547s8df64df/320x400_879sdfert-lskdföj-8asdf879-987sdflkj.jpg",
                                        "height": 400,
                                        "width": 320
                                    },
                                    {
                                        "url": "https://images-ssl.gotinder.com/4adfwe547s8df64df/172x216_879sdfert-lskdföj-8asdf879-987sdflkj.jpg",
                                        "height": 216,
                                        "width": 172
                                    },
                                    {
                                        "url": "https://images-ssl.gotinder.com/4adfwe547s8df64df/84x106_879sdfert-lskdföj-8asdf879-987sdflkj.jpg",
                                        "height": 106,
                                        "width": 84
                                    }
                                ],
                                "last_update_time": "2019-10-03T16:18:30.532Z",
                                "fileName": "879sdfert-lskdföj-8asdf879-987sdflkj.webp",
                                "extension": "jpg,webp",
                                "webp_qf": [
                                    75
                                ]
                            }
                        ],
                        "gender": 1,
                        "jobs": [],
                        "schools": [],
                        "show_gender_on_profile": false
                    },
                    "facebook": {
                        "common_connections": [],
                        "connection_count": 0,
                        "common_interests": []
                    },
                    "spotify": {
                        "spotify_connected": false
                    },
                    "distance_mi": 1,
                    "content_hash": "slkadjfiuwejsdfuzkejhrsdbfskdzufiuerwer",
                    "s_number": 9876540657341,
                    "teaser": {
                        "string": ""
                    },
                    "teasers": [],
                    "snap": {
                        "snaps": []
                    }
                }
            ]
        }
    }
    

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

    • Все изображения являются общедоступными. Если вы скопируете URL-адрес изображения и откроете его в другом окне, оно все равно мгновенно загрузится, а значит все изображения пользователей Tinder находятся в публичном доступе, и их может видеть кто угодно.
    • Оригиналы фотографий, доступные через API, имеют очень высокое разрешение. Если вы загрузите фотографию в Tinder, то они уменьшат ее для использования в приложении, но оригинал остается храниться на публично доступных серверах.
    • Даже если вы не выберете «show_gender_on_profile», через API все равно можно увидеть ваш пол («gender»: 1, где 1 = женщина, 0 = мужчина).
    • Если вы последовательно отправляете несколько запросов в API Tinder, вы всегда получаете разные результаты (например, разные профили). Поэтому мы можем просто несколько раз вызывать эту конечную точку, чтобы получить кучу изображений, которые мы позже сможем использовать для обучения нашей нейронной сети.

    Анализируя заголовки, можно быстро найти наш личный ключ к API: X-Auth-Token.

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

    Немного пошарясь по веб-приложению Tinder, я быстро нашел все нужные нам конечные точки:

    Step 2: Создание обертки для API

    Итак, давайте перейдем к коду. Для удобства мы будем использовать библиотеку Python Requests для взаимодействия с API и написания обертки для API.

    Мы напишем класс Person, который будет принимать определяющий пользователя ответ API и в целом позволит производить некоторые взаимодействовать с API Tinder.

    Давайте начнем с написания класса. Он должен получать данные от API и сохранять все нужные данные во внутренних переменных. Кроме того, он должен иметь некоторые базовые функции, такие как “like” или “dislike»”, которые делают запрос к API, чтобы мы могли лайкать интересный нам профиль, используя команду “some_person.like ()”.

    import datetime
    from geopy.geocoders import Nominatim
    
    TINDER_URL = "https://api.gotinder.com"
    geolocator = Nominatim(user_agent="auto-tinder")
    PROF_FILE = "./images/unclassified/profiles.txt"
    
    class Person(object):
    
        def __init__(self, data, api):
            self._api = api
    
            self.id = data["_id"]
            self.name = data.get("name", "Unknown")
    
            self.bio = data.get("bio", "")
            self.distance = data.get("distance_mi", 0) / 1.60934
    
            self.birth_date = datetime.datetime.strptime(data["birth_date"], '%Y-%m-%dT%H:%M:%S.%fZ') if data.get(
                "birth_date", False) else None
            self.gender = ["Male", "Female", "Unknown"][data.get("gender", 2)]
    
            self.images = list(map(lambda photo: photo["url"], data.get("photos", [])))
    
            self.jobs = list(
                map(lambda job: {"title": job.get("title", {}).get("name"), "company": job.get("company", {}).get("name")}, data.get("jobs", [])))
            self.schools = list(map(lambda school: school["name"], data.get("schools", [])))
    
            if data.get("pos", False):
                self.location = geolocator.reverse(f'{data["pos"]["lat"]}, {data["pos"]["lon"]}')
    
    
        def __repr__(self):
            return f"{self.id}  -  {self.name} ({self.birth_date.strftime('%d.%m.%Y')})"
    
    
        def like(self):
            return self._api.like(self.id)
    
        def dislike(self):
            return self._api.dislike(self.id)
    На самом деле наша API-обертка - это не более, чем причудливый способ вызова Tinder API с использованием нашего класса:
    import requests
    
    TINDER_URL = "https://api.gotinder.com"
    
    class tinderAPI():
    
        def __init__(self, token):
            self._token = token
    
        def profile(self):
            data = requests.get(TINDER_URL + "/v2/profile?include=account%2Cuser", headers={"X-Auth-Token": self._token}).json()
            return Profile(data["data"], self)
    
        def matches(self, limit=10):
            data = requests.get(TINDER_URL + f"/v2/matches?count={limit}", headers={"X-Auth-Token": self._token}).json()
            return list(map(lambda match: Person(match["person"], self), data["data"]["matches"]))
    
        def like(self, user_id):
            data = requests.get(TINDER_URL + f"/like/{user_id}", headers={"X-Auth-Token": self._token}).json()
            return {
                "is_match": data["match"],
                "liked_remaining": data["likes_remaining"]
            }
    
        def dislike(self, user_id):
            requests.get(TINDER_URL + f"/pass/{user_id}", headers={"X-Auth-Token": self._token}).json()
            return True
    
        def nearby_persons(self):
            data = requests.get(TINDER_URL + "/v2/recs/core", headers={"X-Auth-Token": self._token}).json()
            return list(map(lambda user: Person(user["user"], self), data["data"]["results"]))
    

    Теперь мы можем использовать API, чтобы находить пользователей поблизости, смотреть их профили и даже лайкать их. Для этого замените YOUR-API-TOKEN на X-Auth-Token, который вы нашли, используя Chrome Devtools.

    if __name__ == "__main__":
        token = "YOUR-API-TOKEN"
        api = tinderAPI(token)
    
        while True:
            persons = api.nearby_persons()
            for person in persons:
                print(person)
                # person.like()
    

    Шаг 3: Загрузка фотографий пользователей

    Далее мы хотим автоматически загрузить какое-то количество фотографий пользователей поблизости, которые мы будем использовать для обучения нашего ИИ. Под «каким-то количеством» я имею в виду 1500-2500 фотографий.

    Во-первых, давайте расширим наш класс Person функцией, которая позволит нам загружать изображения.

    # At the top of auto_tinder.py
    PROF_FILE = "./images/unclassified/profiles.txt"
    
    # inside the Person-class
        def download_images(self, folder=".", sleep_max_for=0):
            with open(PROF_FILE, "r") as f:
                lines = f.readlines()
                if self.id in lines:
                    return
            with open(PROF_FILE, "a") as f:
                f.write(self.id+"\r\n")
            index = -1
            for image_url in self.images:
                index += 1
                req = requests.get(image_url, stream=True)
                if req.status_code == 200:
                    with open(f"{folder}/{self.id}_{self.name}_{index}.jpeg", "wb") as f:
                        f.write(req.content)
                sleep(random()*sleep_max_for)
    

    Обратите внимание, что я добавил sleep в нескольких случайных местах, просто потому, что нас, скорее всего, забанят, если мы перегрузим Tinder, загружая большое число фотографий за промежуток времени в несколько секунд.

    Мы запишем ID всех пользователей в файл с именем “profiles.txt”. Если сначала мы будем проверять есть ли конкретный человек в этом файле, то мы сможем пропускать профили, которые нам уже попадались. Этим мы гарантируем, что нам не придется классифицировать одних и тех же людей несколько раз (позже вы поймете почему это может быть проблемой).

    Теперь мы можем просто итерировать по профилям людей, находящихся неподалеку, и загружать их изображения в папку “unclassified”.

    if __name__ == "__main__":
        token = "YOUR-API-TOKEN"
        api = tinderAPI(token)
    
        while True:
            persons = api.nearby_persons()
            for person in persons:
                person.download_images(folder="./images/unclassified", sleep_max_for=random()*3)
                sleep(random()*10)
            sleep(random()*10)
    

    Теперь мы можем просто запустить этот скрипт и дать ему поработать несколько часов, чтобы получить нужное количество фотографий. Если вы пользователь Tinder PRO, то обновляйте свое местоположение время от времени, чтобы получать новые профили.

    Шаг 4: Классификация фотографий

    Теперь, когда у нас есть куча изображений, давайте сделаем очень простой и “страшненький” классификатор.

    Он просто будет проходить циклом по всем фотографиям в нашей папке “unclassified” и открывать их в GUI. Щелкнув правой кнопкой мыши по человеку, мы будем помечать его как непонравившегося, а щелчок левой кнопкой мыши будет значить, что человек нам понравился.

    Позже этот выбор будет отображаться в имени файла: 4tz3kjldfj3482.jpg будет переименован в 1_4tz3kjldfj3482.jpg, если мы лайкнем фотографию или 0_4tz3kjldfj3482.jpg в противном случае.

    Давайте используем tkinter, чтобы быстро создать этот GUI:

    from os import listdir, rename
    from os.path import isfile, join
    import tkinter as tk
    from PIL import ImageTk, Image
    
    IMAGE_FOLDER = "./images/unclassified"
    
    images = [f for f in listdir(IMAGE_FOLDER) if isfile(join(IMAGE_FOLDER, f))]
    unclassified_images = filter(lambda image: not (image.startswith("0_") or image.startswith("1_")), images)
    current = None
    
    def next_img():
        global current, unclassified_images
        try:
            current = next(unclassified_images)
        except StopIteration:
            root.quit()
        print(current)
        pil_img = Image.open(IMAGE_FOLDER+"/"+current)
        width, height = pil_img.size
        max_height = 1000
        if height > max_height:
            resize_factor = max_height / height
            pil_img = pil_img.resize((int(width*resize_factor), int(height*resize_factor)), resample=Image.LANCZOS)
        img_tk = ImageTk.PhotoImage(pil_img)
        img_label.img = img_tk
        img_label.config(image=img_label.img)
    
    def positive(arg):
        global current
        rename(IMAGE_FOLDER+"/"+current, IMAGE_FOLDER+"/1_"+current)
        next_img()
    
    def negative(arg):
        global current
        rename(IMAGE_FOLDER + "/" + current, IMAGE_FOLDER + "/0_" + current)
        next_img()
    
    
    if __name__ == "__main__":
    
        root = tk.Tk()
    
        img_label = tk.Label(root)
        img_label.pack()
        img_label.bind("<Button-1>", positive)
        img_label.bind("<Button-3>", negative)
    
        btn = tk.Button(root, text='Next image', command=next_img)
    
        next_img() # load first image
    
        root.mainloop()
    

    Мы загружаем все неклассифицированные фотографии в список «unclassified_images», открываем tkinter, передаем ему первое изображение вызвав next_img () и меняем размер изображения, чтобы оно поместилось на экране. Затем мы задаем два щелчка, левой и правой кнопкой мыши, и вызываем функции “positive” и “negative”, которые переименовывают изображения в зависимости от того какой кнопкой мыши был сделан щелчок, а потом показывают следующую фотографию.

    Шаг 5: Создание препроцессора, чтобы обрезать фотографию вокруг человека

    Для следующего шага нам нужно привести фотографии к виду, который позволит нам классифицировать их. Есть несколько проблем, которым надо уделить внимание:

    1. Размер базы данных: наша база относительно мала. Мы имеем дело с плюс-минус двумя тысячами фотографий, что считается очень маленьким количеством для данных такой сложности (RGB изображения с высоким разрешением).

    2. Разнообразие данных: некоторые фотографии сделаны со спины, иногда на фото есть только лицо, иногда людей на фото вообще нет.

    3. Зашумленность данных: на большинстве фотографий есть не только сам человек, но и фон, который может мешать ИИ.

    Мы будем бороться с этими проблемами двумя способами:

    1. Преобразовывая фотографии из цветных в черно-белые, чтобы уменьшить объем информации, который должен обработать ИИ, в 3 раза (от RGB до G)

    2. Вырезая только ту часть фотографии, где находится человек, и ничего больше

    Первое очень просто сделать с использованием Pillow, в котором мы можем открыть наше изображение и перевести его в оттенки серого.

    Второй способ мы реализуем с помощью Tensorflow API для распознавания объектов и сверточной сети MobileNet, предварительно обученной на базе данных COCO.

    Наш скрипт для распознавания людей на фото будет состоять из четырех частей:

    Часть 1: Открыть предобученную сеть в виде графа Tensorflow

    В моем репозитории на Github вы найдете файл .pb с предобученной сетью MobileNet.

    Давайте откроем его как граф Tensorflow:

    import tensorflow as tf
    
    def open_graph():
        detection_graph = tf.Graph()
        with detection_graph.as_default():
            od_graph_def = tf.GraphDef()
            with tf.gfile.GFile('ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb', 'rb') as fid:
                serialized_graph = fid.read()
                od_graph_def.ParseFromString(serialized_graph)
                tf.import_graph_def(od_graph_def, name='')
        return detection_graph

    Part 2: Загрузка фотографий в виде массивов numpy

    Для работы с изображениями мы используем Pillow. Так как Tensorflow для работы нужны numpy-массивы, давайте напишем небольшую функцию, которая преобразует изображения, обработанные в Pillow, в такие массивы:

    import numpy as np
    
    def load_image_into_numpy_array(image):
        (im_width, im_height) = image.size
        return np.array(image.getdata()).reshape(
            (im_height, im_width, 3)).astype(np.uint8)
    

    Часть 3: Вызов API для распознавания

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

    import numpy as np
    from object_detection.utils import ops as utils_ops
    import tensorflow as tf
    
    def run_inference_for_single_image(image, sess):
        ops = tf.get_default_graph().get_operations()
        all_tensor_names = {output.name for op in ops for output in op.outputs}
        tensor_dict = {}
        for key in [
            'num_detections', 'detection_boxes', 'detection_scores',
            'detection_classes', 'detection_masks'
        ]:
            tensor_name = key + ':0'
            if tensor_name in all_tensor_names:
                tensor_dict[key] = tf.get_default_graph().get_tensor_by_name(
                    tensor_name)
        if 'detection_masks' in tensor_dict:
            # The following processing is only for single image
            detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0])
            detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0])
            # Reframe is required to translate mask from box coordinates to image coordinates and fit the image size.
            real_num_detection = tf.cast(tensor_dict['num_detections'][0], tf.int32)
            detection_boxes = tf.slice(detection_boxes, [0, 0], [real_num_detection, -1])
            detection_masks = tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1])
            detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks(
                detection_masks, detection_boxes, image.shape[1], image.shape[2])
            detection_masks_reframed = tf.cast(
                tf.greater(detection_masks_reframed, 0.5), tf.uint8)
            # Follow the convention by adding back the batch dimension
            tensor_dict['detection_masks'] = tf.expand_dims(
                detection_masks_reframed, 0)
        image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')
    
        # Run inference
        output_dict = sess.run(tensor_dict,
                               feed_dict={image_tensor: image})
    
        # all outputs are float32 numpy arrays, so convert types as appropriate
        output_dict['num_detections'] = int(output_dict['num_detections'][0])
        output_dict['detection_classes'] = output_dict[
            'detection_classes'][0].astype(np.int64)
        output_dict['detection_boxes'] = output_dict['detection_boxes'][0]
        output_dict['detection_scores'] = output_dict['detection_scores'][0]
        if 'detection_masks' in output_dict:
            output_dict['detection_masks'] = output_dict['detection_masks'][0]
        return output_dict

    Часть 4: Собираем все вместе и находим человека на фото

    Последний шаг — написать функцию, которая берет путь к фото, открывает его с помощью Pillow, вызывает API для распознавания и обрезает изображение вокруг обнаруженного человека по ограничивающей рамке.

    import numpy as np
    from PIL import Image
    
    PERSON_CLASS = 1
    SCORE_THRESHOLD = 0.5
    
    def get_person(image_path, sess):
        img = Image.open(image_path)
        image_np = load_image_into_numpy_array(img)
        image_np_expanded = np.expand_dims(image_np, axis=0)
        output_dict = run_inference_for_single_image(image_np_expanded, sess)
    
        persons_coordinates = []
        for i in range(len(output_dict["detection_boxes"])):
            score = output_dict["detection_scores"][i]
            classtype = output_dict["detection_classes"][i]
            if score > SCORE_THRESHOLD and classtype == PERSON_CLASS:
                persons_coordinates.append(output_dict["detection_boxes"][i])
    
        w, h = img.size
        for person_coordinate in persons_coordinates:
            cropped_img = img.crop((
                int(w * person_coordinate[1]),
                int(h * person_coordinate[0]),
                int(w * person_coordinate[3]),
                int(h * person_coordinate[2]),
            ))
            return cropped_img
        return None

    Часть 5: Размещение фото по папкам в зависимости от классификации

    В качестве последнего шага мы напишем скрипт, который будет перебирать все фото в папке “unclassified”, проверять, есть ли у них закодированная в имени метка, а потом копировать изображение в соответствующую папку с применением предварительной обработки, которую мы написали ранее:

    import os
    import person_detector
    import tensorflow as tf
    
    IMAGE_FOLDER = "./images/unclassified"
    POS_FOLDER = "./images/classified/positive"
    NEG_FOLDER = "./images/classified/negative"
    
    
    if __name__ == "__main__":
        detection_graph = person_detector.open_graph()
    
        images = [f for f in os.listdir(IMAGE_FOLDER) if os.path.isfile(os.path.join(IMAGE_FOLDER, f))]
        positive_images = filter(lambda image: (image.startswith("1_")), images)
        negative_images = filter(lambda image: (image.startswith("0_")), images)
    
        with detection_graph.as_default():
            with tf.Session() as sess:
    
                for pos in positive_images:
                    old_filename = IMAGE_FOLDER + "/" + pos
                    new_filename = POS_FOLDER + "/" + pos[:-5] + ".jpg"
                    if not os.path.isfile(new_filename):
                        img = person_detector.get_person(old_filename, sess)
                        if not img:
                            continue
                        img = img.convert('L')
                        img.save(new_filename, "jpeg")
    
                for neg in negative_images:
                    old_filename = IMAGE_FOLDER + "/" + neg
                    new_filename = NEG_FOLDER + "/" + neg[:-5] + ".jpg"
                    if not os.path.isfile(new_filename):
                        img = person_detector.get_person(old_filename, sess)
                        if not img:
                            continue
                        img = img.convert('L')
                        img.save(new_filename, "jpeg")
    


    Когда мы запускаем этот скрипт, все помеченные изображения обрабатываются и перемещаются в соответствующие подпапки в папке “classified”.

    Шаг 6: Переобучение inceptionv3 и написание классификатора

    Для переобучения мы будем просто использовать скрипт Tensorflow retrain.py и модель inceptionv3.

    Вызовите скрипт в корневой директории вашего проекта со следующими параметрами:

    python retrain.py --bottleneck_dir=tf/training_data/bottlenecks --model_dir=tf/training_data/inception --summaries_dir=tf/training_data/summaries/basic --output_graph=tf/training_output/retrained_graph.pb --output_labels=tf/training_output/retrained_labels.txt --image_dir=./images/classified --how_many_training_steps=50000 --testing_percentage=20 --learning_rate=0.001
    

    Обучение занимает около 15 минут на GTX 1080Ti. Финальная точность составила около 80% для моего набора данных, но она сильно зависит от качества ваших входных данных и меток.

    Результатом этого процесса будет переобученная модель inceptionV3 в файле «tf/training_output/retrained_graph.pb». Теперь мы должны написать класс Classifier, который будет использовать новые веса в графе Tensorflow для прогнозирования верной классификации.

    Давайте напишем Classifier-Class, который открывает сессию, в которую передается граф, и имеет метод «classify», который получает фото и возвращает словарь с оценками вероятности того, что фото должно быть помечено “positive” или “negative”.

    Класс принимает на вход путь к графу и путь к файлу с метками — оба находятся в нашей папке «tf/training_output/». Мы создаем вспомогательные функции для преобразования файла с фото в тензор, который мы сможем подать в наш граф, вспомогательную функцию для загрузки графа и меток, а также важную маленькую функцию, которая закроет граф после того, как мы закончим работу с ним.

    import numpy as np
    import tensorflow as tf
    
    class Classifier():
        def __init__(self, graph, labels):
    
            self._graph = self.load_graph(graph)
            self._labels = self.load_labels(labels)
    
            self._input_operation = self._graph.get_operation_by_name("import/Placeholder")
            self._output_operation = self._graph.get_operation_by_name("import/final_result")
    
            self._session = tf.Session(graph=self._graph)
    
        def classify(self, file_name):
            t = self.read_tensor_from_image_file(file_name)
    
            # Open up a new tensorflow session and run it on the input
            results = self._session.run(self._output_operation.outputs[0], {self._input_operation.outputs[0]: t})
            results = np.squeeze(results)
    
            # Sort the output predictions by prediction accuracy
            top_k = results.argsort()[-5:][::-1]
    
            result = {}
            for i in top_k:
                result[self._labels[i]] = results[i]
    
            # Return sorted result tuples
            return result
    
        def close(self):
            self._session.close()
    
    
        @staticmethod
        def load_graph(model_file):
            graph = tf.Graph()
            graph_def = tf.GraphDef()
            with open(model_file, "rb") as f:
                graph_def.ParseFromString(f.read())
            with graph.as_default():
                tf.import_graph_def(graph_def)
            return graph
    
        @staticmethod
        def load_labels(label_file):
            label = []
            proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()
            for l in proto_as_ascii_lines:
                label.append(l.rstrip())
            return label
    
        @staticmethod
        def read_tensor_from_image_file(file_name,
                                        input_height=299,
                                        input_width=299,
                                        input_mean=0,
                                        input_std=255):
            input_name = "file_reader"
            file_reader = tf.read_file(file_name, input_name)
            image_reader = tf.image.decode_jpeg(
                file_reader, channels=3, name="jpeg_reader")
            float_caster = tf.cast(image_reader, tf.float32)
            dims_expander = tf.expand_dims(float_caster, 0)
            resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
            normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
            sess = tf.Session()
            result = sess.run(normalized)
            return result

    Шаг 7: Применение скриптов в деле

    Теперь, когда у нас есть классификатор, давайте расширим класс Person с помощью функции «predict_likeliness», которая использует классификатор, чтобы проверить следует ли лайкать этого пользователя или нет.

    # In the Person class
    
        def predict_likeliness(self, classifier, sess):
            ratings = []
            for image in self.images:
                req = requests.get(image, stream=True)
                tmp_filename = f"./images/tmp/run.jpg"
                if req.status_code == 200:
                    with open(tmp_filename, "wb") as f:
                        f.write(req.content)
                img = person_detector.get_person(tmp_filename, sess)
                if img:
                    img = img.convert('L')
                    img.save(tmp_filename, "jpeg")
                    certainty = classifier.classify(tmp_filename)
                    pos = certainty["positive"]
                    ratings.append(pos)
            ratings.sort(reverse=True)
            ratings = ratings[:5]
            if len(ratings) == 0:
                return 0.001
            return ratings[0]*0.6 + sum(ratings[1:])/len(ratings[1:])*0.4

    Теперь давайте соберем все кусочки головоломки вместе.

    Во-первых, давайте инициализируем Tinder API с помощью нашего токена. Затем мы создадим сессию для нашего классифицирующего графа Tensorflow с использованием переобученной модели и меток. Затем мы получим данные пользователей поблизости и увидим какова вероятность того, что тот или иной пользователь мне понравится.

    В качестве небольшого дополнения я добавил множитель 1.2 для пользователей Tinder из моего университета, чтобы увеличить мой шанс найти мэтч с местной студенткой.

    Профили всех людей, у которых оценка вероятности понравиться мне равна 0.8 или больше, свайпаются вправо, а все остальные — влево. 

    Я сделал скрипт, который дает Auto-Tinder работать в течение 2 часов после его запуска.

    from likeliness_classifier import Classifier
    import person_detector
    import tensorflow as tf
    from time import time
    
    if __name__ == "__main__":
        token = "YOUR-API-TOKEN"
        api = tinderAPI(token)
    
        detection_graph = person_detector.open_graph()
        with detection_graph.as_default():
            with tf.Session() as sess:
    
                classifier = Classifier(graph="./tf/training_output/retrained_graph.pb",
                                        labels="./tf/training_output/retrained_labels.txt")
    
                end_time = time() + 60*60*2
                while time() < end_time:
                    try:
                        persons = api.nearby_persons()
                        pos_schools = ["Universität Zürich", "University of Zurich", "UZH"]
    
                        for person in persons:
                            score = person.predict_likeliness(classifier, sess)
    
                            for school in pos_schools:
                                if school in person.schools:
                                    print()
                                    score *= 1.2
    
                            print("-------------------------")
                            print("ID: ", person.id)
                            print("Name: ", person.name)
                            print("Schools: ", person.schools)
                            print("Images: ", person.images)
                            print(score)
    
                            if score > 0.8:
                                res = person.like()
                                print("LIKE")
                            else:
                                res = person.dislike()
                                print("DISLIKE")
                    except Exception:
                        pass
    
        classifier.close()
    

    Вот и все! Теперь мы можем позволить Auto-tinder работать так долго, как нам хочется, и больше не напрягать руку свайпами.Если у вас есть вопросы или вы нашли ошибки, не стесняйтесь вносить правки на Github.

    Оригинал: [Hacking Tinder] Train an AI to Auto-Swipe for You 🖖

    Перевод: Ухарова Елена

    Сообщение Хакнуть Tinder: Как научить ИИ свайпать за вас появились сначала на SkillFactory.


    0 0

    Об учебе

    Андрей Шадрин: В SkillFactory я проходил курс «Python для анализа данных». Предположил, что полученные знания как раз пригодятся в работе.

    Я до этого никогда не кодил. Именно поэтому я выбрал программу с Python в качестве первого языка программирования — из-за его простоты и понятного оформления. 

    На курсе всё в целом понравилось: удобный и гибкий формат обучения, постоянная обратная связь через Slack. Несмотря на то, что я впервые занялся программированием, курс не показался сложным. Помимо необходимых знаний и навыков я получил четкое понимание того, куда развиваться дальше, что мне понадобится больше всего. Сейчас также прохожу курс по математике.

    Иван Верещагин: Окончил два курса: «Machine Learning» и «Python для анализа данных». Увидел рекламу и очень заинтересовался.

    Знаю, что большое количество практических заданий — это ваша фишка. Но лично мне их не хватило. Было также трудно воспринимать сразу большие задачи — лучше разбить такие на несколько маленьких.

    Самым трудным в курсе по ML было получить советы от преподавателя, поэтому приходилось все искать самому. А вот в «Python для анализа данных» все было достаточно понятно и интересно.

    Марат Сабиров: Прошел курс «Python для анализа данных», сейчас прохожу специализацию «Data Science». 

    Изначально целью было (и есть) освоить науку о данных практически с нуля. Почитал разные мнения и понял, что 70–80% работы в DS — подготовка, предобработка и разведочный анализ данных. Понял, что это основа, с которой можно штурмовать «высокие материи». Плюс, был опыт в анализе данных по своей научной работе (Excel) и небольшой опыт программирования моделей (Visual Basic). 

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

    Курсом я доволен. После прохождения могу точно сказать, что название полностью соответствует содержанию: уделяется внимание предобработке данных различных форматов, обзорным аналитическим процедурам (базовая статистика и др.), визуализации результатов. Здорово, что нам не только объясняли, как работать с данными, но и как (и где) их получить — на «живых» примерах и заданиях по работе с API Яндекса, ВК, Google. А ещё в рамках программы есть «курс молодого бойца» по Python — для тех, кто совсем с нуля.

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

    Самым сложным было изучение Питона — до того я писал только на Бейсике. Основы вспомнились быстро, но было трудно перестроить мозг на pythonic style. Но как стало получаться — сразу вошёл во вкус! До гуру Python мне ещё, конечно, далеко, но язык так понравился, что я нахожу время на самообразование параллельно с задачами курсов.

    Курс по Machine Learning
    Идет набор в группу 3 800₽ в месяц

    О выборе специализации

    Марат Сабиров: Мне кажется, я учёный по натуре. Работа в науке — это уже следствие. А DS — не просто программирование. Это, как я сейчас себе представляю, 3:3:3:1 — наука (гипотезы, вычислительные эксперименты) : написание кода : «математика» : коммуникации. Естественно, привлекает оплата труда хорошего специалиста в отрасли.

    Ещё для меня значительную роль играет то, чтобы я вносил вклад своим трудом во что-то большое и важное. Исследование новых биомолекул, биоинформатика, прогнозирование рисков окружающей среды — есть даже целое направление «Data Science for social good». По этой причине меня вряд ли заинтересует работа, где надо иметь дело с только с биржевыми или финансовыми показателями или считать метрики успеха бизнеса. Наконец, DS — это перспективно, а в будущем ещё и хороший способ познакомиться с проектами из абсолютно разных областей.

    О работе

    Андрей Шадрин: Я госслужащий, и моя работа никак не связана с программированием, однако сильно завязана на Excel, постоянных отчётах и аналитике. Пройденный курс плюс книжка об автоматизации процессов на Python позволили отказаться от Excel и начать решать почти половину ежедневных задач без участия других сотрудников.

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

    Иван Верещагин: Работаю инженером, делаю расчёты, чертежи, 3D-модели, конструкторскую и техническую документацию. Эта сфера мне интересна, а еще здесь довольно высокий уровень заработной платы. Но полученные на курсе навыки здесь, к сожалению, применить не могу.

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

    Недавно меня пригласили в DS-проект: нейросеть для распознавания объектов. Надо будет делать всё с нуля: пришлось даже немного освоить тему «железа» для вычислений — требовалось расписать спецификацию рабочей станции под проект, которую должны закупить. Целую неделю сидел на форумах. Уверен, это будет сложный и интересный проект!

    DS
    Специализация Data Science
    Идет набор в группу 12 500₽ в месяц

    О реализованных проектах

    Марат Сабиров: После обучения в SkillFactory я написал много простых скриптов, автоматизирующих работу. Недавно реализовал алгоритм поинтереснее: получение множества комбинаций из исходных данных с последующим выбором лучших по определенным критериям. Т. е. «эволюционный» алгоритм — так и работает эволюция. Можно считать это примером переноса «доменных» знаний биолога в новую область. Разумеется, я не первый — генетические алгоритмы существуют уже давно, в т. ч. в виде библиотек Python. Фокус в том, чтобы увидеть, что для конкретной задачи подойдет именно это решение. В итоге наш вариант на платформе признали одним из лучших.

    Об инструментах

    Андрей Шадрин: В работе в основном использую Pandas и стандартную библиотеку. Сейчас я работаю над скриптом, который на госзакупках будет автоматически находить нужные контракты. В этом мне помогает Beautiful Soup и очень интересная библиотека Selenium.

    Марат Сабиров: Довольно широко использую классическую триаду аналитика: Pandas, NumPy, Matplotlib. Сейчас на курсах прохожу базовые методы ML — осваиваю Sklearn. Из встроенных библиотек работал с os, re, math, также оценил полезность Itertools, JSON, Beautiful Soup. Немного работал с Seaborn — она помогает делать действительно стильные визуализации!

    Но и есть неудобные вещи: например, в Jupyter нет нормального дебаггера (или я о нем не знаю, ipdb не предлагать). Ясно, что продакшен-код будет уже в PyCharm, где есть всё. А в экспериментах в тетрадках приходится все print’ами обкладывать (наверняка есть более умное решение).

    О вдохновении

    Марат Сабиров: Безусловно круто то, что делают ребята из Open AI. Интересен Илон Маск с его Neurolink. 

    Конечно же, наш ODS — пусть это лишь инициатива двух-трёх человек, но зато есть возможность напрямую пообщаться с авторами. Из научного, наверное, самое впечатляющее — недавнее «открытие» нейросетью результатов Коперника и Кеплера (т. е. гелиоцентрической системы мира) по входным цифрам положения небесных тел. Тут даже более важно, что исследователи отследили «рассуждения» сети (механизм формирования связей). Чуть ранее до этого была новость о том, как другая сеть на порядок ускорила решение классической «задачи трех тел».

    О планах на будущее

    Андрей Шадрин: У меня сейчас порядка пятидесяти муниципальных образований на контроле. Ближайший большой проект — создание базы данных с возможностью выгрузки отчётов, расчёта стоимости контрактов, загрузки необходимых форм и другими функциями.

    Иван Верещагин: Развиваться в области данных я планировал, но нет возможности. Лучший способ развития в этом направлении (да и вообще в любом) — практика, но к сожалению, я уже полгода не могу найти место хотя бы в качестве стажёра: нужны люди с опытом работы либо студенты. 

    Марат Сабиров: Мне интересен биотех, биоинформатика. Хочу освоить biopython — библиотеку для работы с последовательностями ДНК и другими информационными молекулами.

    Также интересно направление, которое для себя я назвал «Data Science for Sustainable Development» (DS4SD). Sustainable development — глобальная концепция ООН по развитию, в которой делается попытка учесть все аспекты: экономику, экологию, социальные факторы. У нас же пока всё завязано на экономике и бизнесе, остальное — по остаточному принципу. Наверняка у ООН есть большие, интересные датасеты по различным аспектам. 

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

    Специализация Full-stack веб-разработчик на Python
    Идет набор в группу 5 900₽ в месяц

    О советах

    Андрей Шадрин: Помимо прохождения долгосрочных платных курсов я слушаю лекции на Udemy. Отличная возможность не только прокачать профессиональные навыки, но и подтянуть английский. 

    Я много времени провожу в дороге. Чтобы потратить его с пользой, советую установить приложение Sololearn — там много заданий для кодеров и можно соревноваться с другими пользователями. И ещё есть классный сайт projecteuler.net с задачками на любом языке.

    Как я уже говорил, параллельно с курсом от SkillFactory я осваивал старинную книгу «Автоматизация рутинных задач с помощью Python» Эла Свейгарта. На самом деле, сама по себе она не сильно помогает, поскольку с момента её написания прошло уже три года. Но тем не менее книга дает неплохое представление о возможностях автоматизации, заставляя искать современные решения.

    Текст: Астафьева Наталья

    Сообщение Истории успеха выпускников SkillFactory появились сначала на SkillFactory.


    Loading...

Loading...