Построение конвейеров машинного обучения с помощью Snowflake и Dask
В этом посте я хочу поделиться некоторыми инструментами, которые я недавно изучал, и показать вам, как я их использую и как они помогли повысить эффективность моего рабочего процесса. В частности, я буду говорить о Снежинке и Даске. Два очень разных инструмента, но они хорошо дополняют друг друга, особенно в рамках жизненного цикла машинного обучения.
By Дэниел Фоли, Ученый данных
Введение
Недавно я пытался найти более эффективные способы улучшить свой рабочий процесс в качестве специалиста по данным. Я обычно трачу приличную часть своего времени на моделирование и построение ETL в своей работе. Это означает, что мне все больше и больше приходится полагаться на инструменты для надежной и эффективной обработки больших наборов данных. Я быстро понял, что использование панд для управления этими наборами данных не всегда является хорошим подходом, и это побудило меня изучить другие альтернативы.
В этом посте я хочу поделиться некоторыми инструментами, которые я недавно изучал, и показать вам, как я их использую и как они помогли повысить эффективность моего рабочего процесса. В частности, я буду говорить о Снежинке и Даске. Два очень разных инструмента, но они хорошо дополняют друг друга, особенно в рамках жизненного цикла машинного обучения. Я надеюсь, что после прочтения этого поста вы получите хорошее представление о том, что такое Snowflake и Dask, как их можно эффективно использовать и сможете приступить к работе с собственными вариантами использования.
В частности, я хочу показать вам, как вы можете построить конвейер ETL с помощью Snowflake и Python для генерации обучающих данных для задачи машинного обучения. Затем я хочу представить Даска и Облако Сатурна и покажет вам, как можно использовать преимущества параллельной обработки в облаке, чтобы действительно ускорить процесс обучения машинного обучения, чтобы вы могли повысить свою продуктивность как специалист по данным.
Создание ETL в Snowflake и Python
Прежде чем мы перейдем к кодированию, я лучше кратко объясню, что такое Snowflake. Это вопрос, который я недавно задал, когда моя команда решила начать его использовать. На высоком уровне это хранилище данных в облаке. Поигравшись с ним некоторое время, я понял, насколько он могущественен. Я думаю, что для меня одна из самых полезных функций - это виртуальные склады, которые вы можете использовать. Виртуальное хранилище дает вам доступ к одним и тем же данным, но полностью не зависит от других виртуальных хранилищ, поэтому вычислительные ресурсы не распределяются между командами. Это оказалось очень полезным, поскольку устраняет любые потенциальные проблемы с производительностью, вызванные выполнением запросов другими пользователями в течение дня. Это привело к меньшему разочарованию и потере времени на ожидание выполнения запросов.
Поскольку мы собираемся использовать Snowflake, я кратко опишу, как вы можете настроить его и начать экспериментировать с ним самостоятельно. Нам необходимо сделать следующее:
- Создайте учетную запись Snowflake
- Загрузите наши данные в Snowflake
- Напишите и протестируйте наши запросы, используя SQL и интерфейс Snowflake.
- Напишите класс Python, который может выполнять наши запросы для генерации нашего окончательного набора данных для моделирования.
Создать учетную запись так же просто, как подписаться на бесплатную пробную версию на их веб-сайт. Как только вы это сделаете, вы можете скачать интерфейс командной строки snowsql. здесь. Это упростит добавление данных в Snowflake. После выполнения этих шагов мы можем попытаться подключиться к Snowflake, используя наши учетные данные и командную строку.
snowsql -a <account_name> -u <user_name>
Вы можете найти имя своей учетной записи в URL-адресе при входе в пользовательский интерфейс Snowflake. Он должен выглядеть примерно так: xxxxx.europe-west2.gcp. Хорошо, перейдем к следующему шагу и перенесем наши данные в Snowflake. Здесь необходимо выполнить несколько шагов, а именно:
- Создайте наш виртуальный склад
- Создать базу данных
- Определите и создайте наши таблицы
- Создайте промежуточную таблицу для наших файлов CSV
- Копирование данных в наши таблицы
К счастью, это не так уж сложно, и мы можем сделать это полностью с помощью интерфейса командной строки snowsql. Для этого проекта я буду использовать меньший набор данных, чем хотелось бы, но, к сожалению, я не могу использовать какие-либо данные моей компании, и может быть довольно сложно найти большие подходящие наборы данных в Интернете. Однако я нашел некоторые данные о транзакциях от Даннхамби, которые находятся в свободном доступе на Kaggle. Просто для удовольствия я создаю гораздо больший синтетический набор данных, используя эти данные, чтобы проверить, насколько хорошо Dask справляется с задачей по сравнению со sklearn.
Прежде всего, нам нужно настроить виртуальный склад и базу данных, используя следующие команды в пользовательском интерфейсе Snowflake.
Создайте or замещать хранилище analytics_wh
Storage_size = "X-МАЛЕНЬКИЙ"
auto_suspend = 180
auto_resume = true
initial_suspended = true;
Создайте or замещать база данных даннхамби;
Наши данные состоят из 6 CSV, которые мы конвертируем в 6 таблиц. Я не буду тратить слишком много времени на изучение набора данных, поскольку этот пост больше посвящен использованию Snowflake и Dask, а не интерпретации данных.
Ниже приведены команды, которые мы можем использовать для создания наших таблиц. Все, что вам нужно знать заранее, - это то, с какими столбцами и типами данных вы будете работать.
create or replace table campaign_desc ( description string, campaign number,
start_day number,
end_day number ); create or replace table campaign_table ( description string, Household_key number, campaign number ); create or replace table coupon ( COUPON_UPC number, product_id number, campaign number ); create or replace table coupon_redempt ( household_key number, day number, coupon_upc number, campaign number ); create or replace table transactions ( household_key number, BASKET_ID number, day number, product_id number, quantity number, sales_value number, store_id number, retail_disc decimal, trans_time number, week_no number, coupon_disc decimal, coupon_match_disc decimal ); create or replace table demographic_data ( age_dec string, marital_status_code string, income_desc string, homeowner_desc string, hh_comp_desc string, household_size_desc string, kid_category_desc string, Household_key number);
Теперь, когда у нас созданы наши таблицы, мы можем начать думать о том, как поместить в них данные. Для этого нам нужно подготовить наши файлы CSV. По сути, это всего лишь промежуточный шаг, поэтому Snowflake может напрямую загружать файлы из нашей стадии в наши таблицы. Мы можем использовать ПОЛОЖИЛ команда, чтобы поместить локальные файлы в нашу сцену, а затем КОПИРОВАТЬ В команда, чтобы проинструктировать Snowflake, куда поместить эти данные.
use database dunnhumby; create or replace stage dunnhumby_stage; PUT file://campaigns_table.csv @dunnhumby.public.dunnhumby_stage; PUT file://campaigns_desc.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon.csv @dunnhumby.public.dunnhumby_stage; PUT file://coupon_d=redempt.csv @dunnhumby.public.dunnhumby_stage; PUT file://transaction_data.csv @dunnhumby.public.dunnhumby_stage; PUT file://demographics.csv @dunnhumby.public.dunnhumby_stage;
В качестве быстрой проверки вы можете запустить эту команду, чтобы проверить, что находится в промежуточной области.
ls @dunnhumby.public.dunnhumby_stage;
Теперь нам просто нужно скопировать данные в наши таблицы, используя запросы ниже. Вы можете выполнить их либо в пользовательском интерфейсе Snowflake, либо в командной строке после входа в Snowflake.
copy into campaign_table from @dunnhumby.public.dunnhumby_stage/campaigns_table.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into campaign_desc from @dunnhumby.public.dunnhumby_stage/campaign_desc.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon from @dunnhumby.public.dunnhumby_stage/coupon.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into coupon_redempt from @dunnhumby.public.dunnhumby_stage/coupon_redempt.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into transactions from @dunnhumby.public.dunnhumby_stage/transaction_data.csv.gz file_format = ( type = csv
skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’); copy into demographic_data from @dunnhumby.public.dunnhumby_stage/demographics.csv.gz file_format = ( type = csv skip_header=1 error_on_column_count_mismatch = false field_optionally_enclosed_by=’”’);
Хорошо, отлично, если повезет, сначала у нас есть данные в наших таблицах. О, если бы это было так просто, весь этот процесс потребовал от меня нескольких попыток, чтобы исправить это (остерегайтесь орфографических ошибок). Надеюсь, вы сможете последовать этому и продолжить. Мы приближаемся к интересному, но описанные выше шаги являются жизненно важной частью процесса, поэтому убедитесь, что вы понимаете каждый из этих шагов.
Написание нашего конвейера на SQL
На следующем шаге мы напишем запросы для генерации нашей цели, наших функций, а затем, наконец, создадим обучающий набор данных. Один из подходов к созданию набора данных для моделирования - это считывание этих данных в память и использование панд для создания новых функций и объединения всех фреймов данных вместе. Обычно это подход, который вы видите на Kaggle и в других онлайн-руководствах. Проблема в том, что это не очень эффективно, особенно когда вы работаете с любыми наборами данных разумного размера. По этой причине гораздо лучше передать тяжелую работу на аутсорсинг чему-то вроде Snowflake, который очень хорошо обрабатывает массивные наборы данных и, вероятно, сэкономит вам огромное количество времени. Я не буду тратить много времени на углубление в специфику нашего набора данных, поскольку это не очень важно для того, что я пытаюсь показать. В целом, однако, вам следует потратить значительное количество времени на изучение и понимание ваших данных, прежде чем приступить к моделированию. Целью этих запросов будет предварительная обработка данных и создание некоторых простых функций, которые мы позже сможем использовать в наших моделях.
Определение цели
Очевидно, что жизненно важным компонентом машинного обучения с учителем является определение подходящей цели для прогнозирования. Для нашего варианта использования мы будем прогнозировать отток, вычисляя, посетит ли пользователь еще раз в течение двух недель после окончания недели. Выбор двух недель довольно произвольный и будет зависеть от конкретной проблемы, которую мы пытаемся решить, но давайте просто предположим, что это подходит для этого проекта. В общем, вам нужно тщательно проанализировать своих клиентов, чтобы понять распределение перерывов между посещениями, чтобы прийти к подходящему определению оттока.
Основная идея здесь заключается в том, что для каждой таблицы мы хотим иметь одну строку для каждого домашнего_ключа, содержащую значения для каждой из наших функций.
Особенности кампании
Особенности транзакции
Ниже мы создаем несколько простых показателей на основе совокупной статистики, такой как среднее, максимальное и стандартное отклонение.
Демографические особенности
В этом наборе данных много недостающих данных, поэтому я решил использовать здесь вменение. Существует множество методов устранения недостающих данных - от удаления недостающих данных до расширенных методов вменения. Я только что упростил себе жизнь и заменил отсутствующие значения режимом. Я бы не обязательно рекомендовал использовать этот подход в целом, поскольку понимание того, почему эти данные отсутствуют, действительно важно при принятии решения, как с ними бороться, но для целей этого примера я воспользуюсь простым подходом. Сначала мы вычисляем режим для каждой из наших функций, а затем используем coalesce для замены каждой строки режимом, если данные отсутствуют.
Данные обучения
Наконец, мы создаем запрос для наших обучающих данных, объединяя наши основные таблицы вместе, и в итоге получаем таблицу, содержащую нашу цель, нашу кампанию, транзакции и демографические характеристики, которые мы можем использовать для построения модели.
Вкратце, тем, кто хочет узнать больше об особенностях и нюансах Snowflake, я бы порекомендовал следующую книгу: Поваренная книга снежинки. Я начал читать эту книгу, и она полна действительно полезной информации о том, как использовать Snowflake, и описывает гораздо больше деталей, чем я здесь.
Код Python для ETL
Последнее, что нам нужно для этого ETL, - это написать сценарий для его выполнения. Это действительно необходимо только в том случае, если вы планируете регулярно запускать подобный ETL, но это хорошая практика, которая значительно упрощает запуск ETL по мере необходимости.
Кратко обсудим основные компоненты нашего класса EtlTraining. Наш класс принимает один ввод - предельную неделю. Это связано с тем, как данные определены в нашем наборе данных, но обычно это будет формат даты, соответствующий дате окончания, которую мы хотим выбрать для генерации обучающих данных.
Мы инициализируем список наших запросов, чтобы мы могли легко их просмотреть и выполнить. Мы также создаем словарь, содержащий наши параметры, которые мы передаем нашему соединению Snowflake. Здесь мы используем переменные среды, которые мы установили в Saturn Cloud. Здесь это руководство о том, как это сделать. Подключиться к Snowflake не так уж и сложно, все, что нам нужно сделать, это использовать коннектор Snowflake и передать наш словарь учетных данных. Мы реализуем это в методе подключения Snowflake и возвращаем это соединение как атрибут.
Чтобы облегчить выполнение этих запросов, я сохраняю каждый запрос как строковую переменную Python в файле ml_query_pipeline.py. Метод execute_etl делает именно то, что написано на банке. Мы перебираем каждый запрос, форматируем его, выполняем и завершаем закрытием соединения Snowflake.
Чтобы запустить этот ETL, мы можем просто ввести в терминал приведенные ниже команды. (где ml_pipeline - это имя скрипта выше.)
python -m ml_pipeline -w 102 -j ‘train’
Вкратце, вы, вероятно, захотите запускать такой ETL через регулярные промежутки времени. Например, если вы хотите делать ежедневные прогнозы, вам нужно будет каждый день создавать подобный набор данных для передачи в вашу модель, чтобы вы могли определить, кто из ваших клиентов, скорее всего, уйдет. Я не буду вдаваться в подробности здесь, но в своей работе мы используем Airflow для оркестровки наших ETL, поэтому я бы рекомендовал проверить его, если вам интересно. На самом деле я недавно купил книгу 'Конвейеры данных с Apache Airflow'который я считаю отличным и действительно дает несколько убедительных примеров и советов по использованию воздушного потока.
Даск и моделирование
Теперь, когда у нас построен конвейер данных, мы можем начать думать о моделировании. Другая основная цель этого поста - выделить преимущества использования Dask как части процесса разработки машинного обучения и показать вам, ребята, как легко им пользоваться.
Для этой части проекта я также использовал Облако Сатурна Это действительно хороший инструмент, с которым я недавно столкнулся, который позволяет нам использовать мощь Dask на кластере компьютеров в облаке. Основные преимущества использования Saturn для меня заключаются в том, что очень легко делиться своей работой, очень просто масштабировать свои вычисления по мере необходимости, и у него есть опция бесплатного уровня. Разработка моделей в целом - действительно хороший вариант использования Dask, поскольку мы обычно хотим обучить кучу разных моделей и посмотреть, какая из них работает лучше всего. Чем быстрее мы сможем это сделать, тем лучше, поскольку у нас будет больше времени, чтобы сосредоточиться на других важных аспектах разработки модели. Как и в Snowflake, вам просто нужно зарегистрироваться здесь и вы можете очень быстро запустить экземпляр лаборатории Jupyter и начать экспериментировать с ним самостоятельно.
Теперь я понимаю, что в этот момент я несколько раз упомянул Даск, но так и не объяснил, что это такое. Так что позвольте мне воспользоваться моментом, чтобы дать вам общий обзор Dask и почему я считаю его крутым. Проще говоря, Dask - это библиотека Python, которая использует преимущества параллельных вычислений, чтобы позволить вам обрабатывать и выполнять операции с очень большими наборами данных. И, что самое приятное, если вы уже знакомы с Python, Dask должен быть очень простым, поскольку синтаксис очень похож.
На приведенном ниже графике показаны основные компоненты Dask.
Источник: Документация Dask
Коллекции позволяют нам создавать граф задач, которые затем можно выполнять на нескольких компьютерах. Некоторые из этих структур данных, вероятно, кажутся довольно знакомыми, например массивы и фреймы данных, и они похожи на то, что вы найдете в Python, но с некоторыми важными отличиями. Например, вы можете думать о фрейме данных Dask как о группе фреймов данных pandas, построенных таким образом, чтобы мы могли выполнять операции параллельно.
От коллекций переходим к планировщику. Как только мы создадим граф задач, все остальное за нас сделает планировщик. Он управляет рабочим процессом и отправляет эти задачи либо на одну машину, либо распределяет их по кластеру. Надеюсь, это даст вам очень краткий обзор того, как работает Dask. Для получения дополнительной информации я предлагаю проверить документации или это книга. Оба являются очень хорошими ресурсами для более глубокого изучения этой темы.
Код Python для моделирования
При моделировании я обычно использую небольшое количество алгоритмов, которые я всегда буду пробовать в первую очередь. Обычно это дает мне хорошее представление о том, что может быть подходящим для моей конкретной проблемы. Эти модели - логистическая регрессия, случайный лес и GradientBoosting. По моему опыту, при работе с табличными данными эти алгоритмы обычно дают довольно хорошие результаты. Ниже мы строим конвейер моделирования sklearn, используя эти 3 модели. Точные модели, которые мы здесь используем, не очень важны, поскольку конвейер должен работать для любой модели классификации sklearn, это просто мое предпочтение.
Без лишних слов, давайте погрузимся в код. К счастью, мы передали на аутсорсинг большую часть нашей предварительной обработки Snowflake, поэтому нам не нужно слишком много возиться с нашими обучающими данными, но мы добавим несколько дополнительных шагов, используя конвейеры sklearn.
Первый фрагмент кода ниже показывает конвейер при использовании sklearn. Обратите внимание, что наш набор данных - это простой старый фрейм данных pandas, и все наши шаги предварительной обработки выполняются с использованием методов sklearn. Здесь нет ничего особенного. Мы читаем наши данные из таблицы, созданной нашим ETL Snowflake, и передаем их в конвейер sklearn. Здесь применяются обычные шаги моделирования. Мы разделяем набор данных на обучение и тестирование и выполняем некоторую предварительную обработку, а именно вменяем пропущенные значения с использованием медианы, масштабируем данные и быстро кодируем наши категориальные данные. Я большой поклонник конвейеров sklearn и в настоящее время использую их всякий раз, когда я разрабатываю модели, они действительно обеспечивают чистый и лаконичный код.
Как этот конвейер работает с набором данных примерно с 2 миллионами строк? Что ж, запуск этой модели без настройки гиперпараметров занимает около 34 минут. Ой, немного медленно. Вы можете себе представить, как много времени это заняло бы, если бы мы захотели выполнить какую-либо настройку гиперпараметров. Хорошо, не идеально, но давайте посмотрим, как Даск справится с этой задачей.
Код Dask ML Python
Наша цель здесь - посмотреть, сможем ли мы превзойти описанный выше конвейер sklearn, спойлер, мы определенно сможем. Самое классное в Dask заключается в том, что входной барьер, когда вы уже знакомы с python, довольно низок. Мы можем запустить этот конвейер в Dask всего с несколькими изменениями.
Первое изменение, которое вы, вероятно, заметите, - это то, что у нас есть другой импорт. Одно из ключевых отличий этого конвейера от предыдущего заключается в том, что мы будем использовать фрейм данных Dask вместо фрейма данных pandas для обучения нашей модели. Вы можете думать о фрейме данных Dask как о группе фреймов данных pandas, где мы можем выполнять вычисления для каждого из них одновременно. Это ядро параллелизма Dask и то, что сократит время обучения для этого конвейера.
Обратите внимание, что мы используем @ dask.delayed в качестве декоратора нашего load_training_data функция. Это дает указание Dask распараллелить эту функцию для нас.
Мы также собираемся импортировать некоторые методы предварительной обработки и конвейера из Dask, и, что наиболее важно, нам нужно будет импортировать SaturnCluster, который позволит нам создать кластер для обучения наших моделей. Еще одно ключевое отличие этого кода заключается в том, что мы используем даск.персист после нашего тестового сплита на поезде. До этого момента ни одна из наших функций фактически не вычислялась из-за ленивых вычислений Даска. Как только мы используем метод persist, мы говорим Dask отправить наши данные рабочим и выполнить задачи, которые мы создали до этого момента, и оставить эти объекты в кластере.
Наконец, мы обучаем наши модели, используя отложенный метод. Опять же, это позволяет нам лениво создавать конвейер. Конвейер не выполняется, пока мы не дойдем до этого кода:
fit_pipelines = dask.compute(*pipelines_)
На этот раз нам потребовалось всего около 10 минут, чтобы запустить этот конвейер на том же самом наборе данных. Это ускорение в 3.4 раза, не так уж и плохо. Теперь, если бы мы захотели, мы могли бы ускорить это еще больше, увеличивая наши вычислительные ресурсы одним нажатием кнопки на Сатурне.
Развертывание нашего конвейера
Я упоминал ранее, что вы, вероятно, захотите регулярно запускать такой конвейер, используя что-то вроде воздушного потока. Так уж получилось, что если вы не хотите, чтобы начальные хлопоты настраивали все для воздушного потока, Saturn Cloud предлагает простую альтернативу с Джобсом. Задания позволяют нам упаковать наш код и запускать его через определенные промежутки времени или по мере необходимости. Все, что вам нужно сделать, это перейти к существующему проекту и щелкнуть по созданию задания. Как только мы это сделаем, это должно выглядеть следующим образом:
Источник: Сатурн
Отсюда все, что нам нужно сделать, это убедиться, что наши файлы python выше находятся в каталоге на изображении, и мы можем ввести нашу команду python выше
python -m ml_pipeline -w 102 -j 'train'
Мы также можем настроить расписание, используя синтаксис cron, для ежедневного запуска ETL, если захотим. Для тех, кому интересно, вот учебник это входит во все мельчайшие подробности.
Выводы и выводы
Что ж, на этом мы подошли к концу нашего проекта. Очевидно, что я упустил некоторые ключевые части цикла разработки машинного обучения, такие как настройка гиперпараметров и развертывание нашей модели, но, возможно, я оставлю это на другой день. Думаю, тебе стоит попробовать Даск? Я ни в коем случае не являюсь экспертом, но, судя по тому, что я видел до сих пор, он определенно кажется действительно полезным, и я очень рад, что могу больше экспериментировать с ним и найти больше возможностей для включения его в свою повседневную работу в качестве специалиста по данным. Надеюсь, вы нашли это полезным, и вы тоже можете увидеть некоторые преимущества Snowflake и Dask, и вы начнете экспериментировать с ними самостоятельно.
Полезные ресурсы
- Конвейеры данных с Apache Airflow
- Поваренная книга снежинки
- Наука о данных в масштабе с Python и Dask
- Coursera: SQL для науки о данных
Некоторые из моих других сообщений могут быть вам интересны
Создадим конвейер потоковых данных
Моделирование гауссовой смеси (GMM)
Байесовский подход к прогнозированию временных рядов
Примечание. Некоторые ссылки в этом посте являются партнерскими.
Bio: Дэниел Фоли бывший экономист, а затем специалист по анализу данных, работающий в индустрии мобильных игр.
Оригинал, Перемещено с разрешения.
Связанный:
Источник: https://www.kdnuggets.com/2021/07/building-machine-learning-pipelines-snowflake-dask.html
- "
- &
- 102
- 2021
- доступ
- Учетная запись
- дополнительный
- плюс
- совет
- Affiliate
- алгоритмы
- Все
- Amazon
- апаш
- ПЛОЩАДЬ
- около
- автоматический
- ЛУЧШЕЕ
- Немного
- строить
- Строительство
- Группа
- Кампания
- случаев
- вызванный
- вызов
- изменение
- контроль
- классификация
- ближе
- облако
- код
- Кодирование
- компонент
- Вычисление
- компьютеры
- вычисление
- Coursera
- Создающий
- Полномочия
- Клиенты
- данным
- наука о данных
- ученый данных
- набор данных
- информационное хранилище
- База данных
- день
- сделка
- глубокое обучение
- демографический
- подробность
- развивать
- Развитие
- DID
- директор
- затрат
- Инженеры
- Окружающая среда
- эксперимент
- Особенности
- в заключение
- конец
- Во-первых,
- Фокус
- следовать
- формат
- Бесплатно
- полный
- функция
- игровой
- Игровая индустрия
- Общие
- хорошо
- Графические процессоры
- большой
- инструкция
- здесь
- High
- Выделите
- Как
- How To
- HTTPS
- огромный
- идея
- определения
- изображение
- Увеличение
- промышленность
- info
- информация
- вопросы
- IT
- работа
- Джобс
- присоединиться
- Прыгать
- Основные
- большой
- УЧИТЬСЯ
- изучение
- уровень
- Библиотека
- линия
- Список
- загрузка
- локальным
- Длинное
- обучение с помощью машины
- Метрика
- миллиона
- ML
- Мобильный телефон
- Мобильные игры
- модель
- двигаться
- а именно
- Новые функции
- Предложения
- онлайн
- Операционный отдел
- Опция
- Другое
- производительность
- Много
- Блог
- мощностью
- Predictions
- Произведенный
- производительность
- Проект
- что такое варган?
- Питон
- Reading
- уменьшить
- регресс
- Полезные ресурсы
- ОТДЫХ
- Итоги
- Run
- Бег
- Шкала
- масштабирование
- Наука
- Ученые
- Серии
- набор
- установка
- Поделиться
- общие
- просто
- небольшой
- So
- РЕШАТЬ
- скорость
- тратить
- Расходы
- Вращение
- раскол
- SQL
- Этап
- Начало
- и политические лидеры
- статистика
- Истории
- потоковый
- цель
- тестXNUMX
- мышление
- время
- топ
- трогать
- Обучение
- сделка
- Сделки
- суд
- учебные пособия
- ui
- us
- пользователей
- Виртуальный
- Склады
- неделя
- Что такое
- в
- Работа
- рабочие
- рабочий
- работает
- письмо
- X
- лет