Особая благодарность Роберту Ходжесу из Altinity за его вклад в эту статью.
В этом сообщении блога мы рассмотрим, как мы можем интегрировать возможности прогнозирования на основе машинного обучения с базой данных ClickHouse. ClickHouse — это быстрая база данных SQL с открытым исходным кодом, ориентированная на столбцы, которая очень полезна для анализа данных и аналитики в реальном времени. Проект поддерживается и поддерживается компанией ClickHouse, Inc. Мы будем изучать его возможности в задачах, требующих подготовки данных для поддержки машинного обучения.
Возможность прогнозирования предлагается через MindsDB, платформу, которая позволяет автоматически запускать модели машинного обучения непосредственно в вашей базе данных, используя только простые команды SQL. MindsDB демократизирует машинное обучение и позволяет любому выполнять сложные прогнозы на основе машинного обучения прямо там, где хранятся данные.
Мы рассмотрим весь процесс сложного варианта использования традиционного машинного обучения для прогнозирования больших многомерных временных рядов и того, как комбинация ClickHouse и MindsDB позволяет вам достичь этого очень простым и эффективным способом.
Оптимизация жизненного цикла машинного обучения
Жизненный цикл машинного обучения — это тема, которая все еще уточняется, но основными этапами, составляющими этот поток, являются подготовка, моделирование и развертывание.
Каждый из этих трех основных этапов разбит на более четко определенные этапы. Например, этап подготовки данных обычно разбивается на сбор данных, очистку данных и маркировку, а также разработку функций.
Данные, которые уже находятся в базе данных, удобны для ML
Подготовка данных составляет около 80% работы специалистов по данным, и в то же время 57% из них считают очистку данных наименее приятной частью своей работы согласно опросу Forbes.
Если ваша компания уже прошла через препятствия получения данных, загрузки их в базу данных, то, скорее всего, они уже будут в чистом и структурированном формате, в предопределенной схеме.
SQL как инструмент проектирования функций
Кроме того, для любой проблемы машинного обучения сбор данных и очистка данных — это только первые шаги. Чаще всего исходного набора данных недостаточно для получения удовлетворительных результатов ваших моделей. Именно здесь необходимо вмешаться специалистам по данным и инженерам по машинному обучению и обогатить наборы данных, применяя различные методы разработки функций.
SQL — очень мощный инструмент для преобразования данных, и функции вашего набора данных на самом деле представляют собой столбцы в таблице базы данных.
Затем эти функции выбираются и преобразуются для создания новых функций, которые будут использоваться при обучении модели машинного обучения. Используя модель данных, описанную выше, мы можем сгенерировать некоторые дополнительные функции, описывающие наши продажи. Например, мы можем создать новые функции, содержащие количество заказов, в которые был включен продукт, и процент цены этого продукта от общей цены заказа.
SELECT Product.pk_idProduct , Product.description , TBL_store.storeName , count(Orders.pk_idOrder) as number_of_orders , avg(Product.price / Orders.pricing) as product_percentage_of_order FROM Product INNER JOIN OrderProduct on Product.pk_idProduct = OrderProduct.product INNER JOIN Orders on Orders.pk_idOrder = OrderProduct.order INNER JOIN TBL_store on TBL_store.PK_id_store = Product.seller GROUP BY Product.pk_idProduct , Product.description , TBL_store.storeName
Поскольку SQL — такой мощный инструмент, мы должны использовать его и генерировать возможные преобразования непосредственно из базы данных.
ClickHouse предлагает возможность выполнять множество преобразований для очень больших наборов данных. В отличие от обычного способа создания новых функций для вашего набора данных, извлечения данных и манипулирования ими с помощью Python, создание ваших новых функций в ClickHouse происходит намного быстрее.
Модели машинного обучения в виде AI-таблиц
После подготовки данных мы подходим к моменту, когда MindsDB вмешивается и предоставляет конструкцию, упрощающую моделирование и развертывание модели машинного обучения.
Эта конструкция, называемая таблицами AI, представляет собой специфическую функцию MindsDB, которая позволяет вам рассматривать модель машинного обучения так же, как обычную таблицу. Вы создаете эту таблицу AI в MindsDB точно так же, как если бы вы создавали таблицу в обычной базе данных, а затем вы можете предоставить эту таблицу ClickHouse через возможности внешней таблицы.
Это простое 1-минутное видео прекрасно иллюстрирует концепцию AI Tables:
Создать собственную таблицу ИИ очень просто, и ниже приведен синтаксис для ее создания поверх набора данных.
CREATE PREDICTOR <predictor_name> TRAIN FROM { (<select_statement>) | <namespace|integration>.<view|table> | <url> } [ TEST FROM { (<select_statement>) | <namespace|integration>.<view|table> | <url> } ] [ ORDER BY <order_col> [{ASC|DESC}] ] [ GROUP BY <col1,> [, <col2>, ...] ] [ WINDOW <window_size> ] PREDICT <col_name_in_from_to_forecast> [ MODEL = {auto | <json_config> | <url>} ]
Это позволяет нам думать о развертывании машинного обучения, которое ничем не отличается от того, как вы создаете таблицы. Итак, как только вы создаете модель в виде таблицы в базе данных, она уже развернута. И единственное, о чем вам нужно позаботиться, это то, что произойдет, если изменится схема таблицы, и тогда вам нужно либо создать новую модель, либо переобучить модель.
В заключение, все развертывание и моделирование абстрагируются от этой очень простой конструкции, которую мы называем «Таблицы ИИ» и которая позволяет вам отображать эту таблицу в других базах данных, таких как ClickHouse.
Создание наборов данных в ClickHouse
Несмотря на то, что это довольно молодой продукт по сравнению с другими аналогичными инструментами на рынке аналитических баз данных, ClickHouse имеет множество преимуществ по сравнению с более известными инструментами и даже новыми функциями, которые позволяют ему превосходить другие с точки зрения производительности.
- Один переносимый двоичный файл C++ — обеспечивает очень быструю установку менее чем за 60 секунд.
- Работает где угодно — оно работает в любой среде на основе Linux, например, в облачных виртуальных машинах, контейнерах и даже на физических серверах или ноутбуках.
- Расширенные возможности SQL — он имеет некоторые дополнительные расширения, построенные поверх обычного синтаксиса SQL, которые придают ему дополнительные возможности.
- Хранилище столбцов — дает вам преимущества с точки зрения производительности и преимуществ с точки зрения очень высокой степени сжатия данных.
- Распределенные запросы — время ответа в миллисекундах из-за того, что запросы распределяются между узлами и ядрами ЦП.
- Разделение и репликация — позволяет масштабировать от размера ноутбука до сотен узлов.
- Лицензирование Apache 2.0 — позволяет использовать ClickHouse для любых целей бизнеса.
ClickHouse имеет тысячи установок по всему миру, используемых многими крупными компаниями, такими как Bloomberg, Uber, Walmart, eBay, Yandex и другими.
Исследование данных
Как объяснялось в наших предыдущих разделах, наиболее трудоемкой частью любого конвейера машинного обучения является подготовка данных. Это требует знаний о данных, поэтому мы всегда начинаем с исследования данных.
На этом этапе нам нужно понять, какая информация у нас есть и какие функции доступны для оценки качества данных, чтобы либо просто обучить модель, либо внести некоторые улучшения в наборы данных. Ниже мы можем увидеть пример набора данных о поездках в ClickHouse с запросом 1,3 миллиарда строк данных о поездках на такси в Нью-Йорке для анализа качества данных.
SELECT count() AS rides, avg(fare_amount) AS avg, min(fare_amount) AS min, max(fare_amount) AS max FROM default.tripdata
Как видите, у нас есть некоторые отклонения, которые негативно повлияют на модель машинного обучения, поэтому давайте углубимся в нее с помощью инструментов ClickHouse.
Давайте напишем запрос, чтобы глубже погрузиться в эти распределения и лучше понять данные. Этот запрос позволяет всего за пару секунд создать представление гистограммы для этого большого набора данных и увидеть распределение выбросов.
SELECT h_bin.1 AS lo, h_bin.2 AS hi, h_bin.3 AS count FROM ( SELECT histogram(5)(fare_amount) h FROM default.tripdata WHERE fare_amount < 0 ) ARRAY JOIN h AS h_bin
Мы видим, что распределение нашего запроса гистограммы также содержит столбец количества. Некоторые результаты в этом столбце представляют собой дробные числа, которые не обязательно представляют количество строк. На самом деле, исходя из документации, этот столбец фактически содержит высоту бина в гистограмме.
Поскольку мы пытаемся уместить весь наш набор данных в гистограмму с 5 интервалами, заданную с помощью вызова функции histogram(5)(fare_amount), а количество элементов в нашем наборе данных не распределено нормально, высота наших бункеров не обязательно будут равны. Таким образом, некоторые из наших высот будут иметь число, которое будет пропорционально представлять количество значений в этом конкретном бине относительно общего количества значений в нашем наборе данных.
Если это все еще немного сбивает с толку, мы можем попробовать использовать визуализацию bar() в ClickHouse, чтобы получить более наглядный результат распределения нашего набора данных.
Мы видим, что столбец столбца содержит визуальное представление распределения нашего набора данных, разделенного на наши 5 бинов. Поскольку первые два бина содержат только одно значение, отображаемая полоса слишком мала, чтобы ее можно было увидеть, однако, когда у нас появляется еще несколько значений, полоса также отображается.
Кроме того, мы можем видеть большое количество небольших отрицательных значений тарифа, которые мы не хотим включать в набор данных для обучения модели. Если мы обратим фильтрацию для нашего набора данных и посмотрим только на положительные значения fare_amount, мы увидим, что количество «чистых» точек данных намного выше. Поскольку у нас такие большие значения, мы установим минимальное значение для нашей функции бара на 10000000, чтобы распределение было более четким.
Очистка и агрегирование данных
Теперь, когда мы определили, что наш набор данных содержит выбросы, нам нужно будет удалить их, чтобы получить чистый набор данных. Мы собираемся отфильтровать все отрицательные суммы и принять во внимание только суммы тарифов, которые меньше 500 долларов США. Поскольку нам нужно прогнозировать данные для каждого поставщика такси, мы будем агрегировать набор данных по vendor_id.
SELECT toStartOfHour(pickup_datetime) AS pickup_hour, vendor_id, sum(fare_amount) AS fares FROM default.tripdata WHERE total_amount >= 0 AND total_amount <= 500 GROUP BY pickup_hour, vendor_id ORDER BY pickup_hour, vendor_id
Мы можем дополнительно уменьшить размер нашего набора данных, понизив выборку данных временной метки до часовых интервалов и объединив все данные, попадающие в часовой интервал.
Обработка очень больших наборов данных с помощью ClickHouse
Выполнение любого запроса к массивному набору данных обычно очень затратно с точки зрения используемых ресурсов и времени, необходимого для создания данных. Это может вызвать головную боль, когда нам приходится запускать запрос несколько раз, генерировать новые функции со сложными преобразованиями или когда исходные данные устаревают и нам нужна обновленная версия. Однако у ClickHouse есть решение для этого — материализованные представления.
В отличие от обычного представления SQL, где представление просто инкапсулирует SQL-запрос и повторно запускает его при каждом выполнении, материализованное представление запускается только один раз, и данные передаются в таблицу материализованного представления. Затем мы можем запросить эту новую таблицу, и каждый раз, когда данные добавляются в исходные исходные таблицы, эта таблица представления также обновляется.
Как вы можете видеть выше, мы всегда можем запросить материализованное представление и точно знать, что мы всегда получаем самые последние наборы данных, основанные на наших исходных данных. Затем мы можем использовать набор данных в этом материализованном представлении и обучить нашу модель машинного обучения, не беспокоясь об устаревших данных.
Материализованные представления также имеют много преимуществ с точки зрения производительности по сравнению с универсальными представлениями, и иногда они даже в 20 раз быстрее в ClickHouse для наборов данных, которые превышают 1 миллиард строк.
Вы также можете использовать кластеры ClickHouse и распространять данные на несколько сегментов, чтобы извлечь максимальную производительность из хранилища данных. Вы можете создавать материализованные представления для этих подмножеств данных, а затем объединять их в рамках конструкции распределенной таблицы, которая похожа на зонтик над данными с каждого из узлов.
Всякий раз, когда вам нужно запросить эти данные, вы запрашиваете только одну распределенную таблицу, которая автоматически обрабатывает получение данных из нескольких узлов в вашем кластере.
Это очень мощная методика, позволяющая анализировать триллионы строк данных, объединять их и преобразовывать полезными способами. С этого момента мы можем приступить к части машинного обучения и даже провести более глубокий анализ наших наборов данных.
Построение прогнозов на основе сложных данных многомерных временных рядов
Давайте теперь спрогнозируем спрос на поездки на такси на основе только что представленного набора данных о поездках такси Нью-Йорка. Мы сосредоточимся только на подмножестве, состоящем из столбцов vendor_id, времени посадки и стоимости проезда на такси.
Лучшее понимание наших данных
Мы можем глубже погрузиться в подмножество данных, сгенерированных с помощью ClickHouse, и построить график потока доходов, разбитого на почасовой основе. График зеленой линии в левом нижнем углу показывает почасовую сумму тарифов для компании CMT.
Однако мы также можем видеть, что существует разница в распределении тарифов не только в течение дня для одного поставщика такси, но и между самими поставщиками такси, как показано на графике ниже. Каждая компания имеет разную динамику во времени, что усложняет эту проблему, потому что теперь у нас есть не один набор данных, а несколько.
Проблема многомерного прогнозирования временных рядов
Знание того, что наш набор данных содержит несколько рядов данных, является важной информацией, которую следует учитывать при построении конвейера прогнозирования данных. Если группе специалистов по обработке и анализу данных или инженеров по машинному обучению необходимо спрогнозировать какие-либо временные ряды, которые важны для вас, чтобы получить представление о том, что в зависимости от того, как выглядят ваши сгруппированные данные, они могут просматривать сотни или тысячи серий.
Обучение таких моделей машинного обучения может занимать очень много времени и ресурсов, и в зависимости от типа информации, которую вы хотите извлечь, и типа модели, которую вы используете, масштабировать это до тысяч моделей, которые предсказывают свои собственные временные ряды, будет очень сложно. в масштабе.
В MindsDB мы занимаемся этой проблемой уже некоторое время, и нам удалось автоматизировать этот процесс, используя любой тип данных, поступающих из любой базы данных, такой как ClickHouse.
Как MindsDB автоматизирует создание моделей машинного обучения
Наш подход основан на применении гибкой философии, которая позволит нам решать любые задачи машинного обучения, а не только проблемы временных рядов. Это достигается за счет применения нашей философии энкодера-микшера.
Механизм прогнозирования MindsDB — технические детали
В зависимости от типа данных для каждого столбца мы создаем экземпляр Encoder для этого столбца. Ему будет поручено разработать информативную кодировку данных в этом столбце.
Например, если у нас есть столбец с простыми числами, которые не нужно обучать, чтобы решить проблему временных рядов, кодировщик может быть просто простым набором правил, не требующих обучения. Однако, если столбец содержит свободный текст, Encoder создаст экземпляр нейронной сети Transformer, которая научится создавать сводку этого текста.
Следующим шагом является создание экземпляра Mixer, который представляет собой модель машинного обучения, которой поручено делать окончательный прогноз на основе результатов Encoder. Этот тип философии обеспечивает очень гибкий подход к прогнозированию числовых данных, категориальных данных, регрессии из текста и данных временных рядов.
Автоматическая и динамическая нормализация данных в MindsDB
Прежде чем мы начнем обучать эту модель с нашими данными, нам, возможно, придется выполнить некоторую очистку данных, например динамическую нормализацию. Это подразумевает нормализацию каждого из наших рядов данных, чтобы наша модель Mixer обучалась быстрее и лучше.
MindsDB собирает статистику набора данных и нормализует каждую серию, в то время как модель Mixer учится предсказывать будущие значения, используя эти нормализованные значения.
Временная информация также кодируется путем разбивки временных меток на синусоидальные компоненты.
Это позволяет обрабатывать произвольные даты и облегчает работу с сериями с неравномерной выборкой. Этот метод полезен, когда данные временных рядов распределены неравномерно, а измерения нерегулярны.
Короче говоря, для задач временных рядов конвейер машинного обучения работает так, как показано на изображении ниже. Входные данные в верхней левой части содержат невременную информацию, которая подается в кодировщик, а затем передается в микшер.
Но для временной информации как метки времени, так и сами серии данных (в данном случае общее количество тарифов, полученных за каждый час для каждой компании) автоматически нормализуются и передаются через рекуррентный кодировщик (кодировщик RNN). RNN привносит в дескриптор более сильное понятие темпоральности.
Все эти закодированные функции передаются в микшер, который может быть одного из двух типов:
- Нейросетевой микшер, состоящий из двух внутренних потоков, один из которых использует авторегрессионный процесс для выполнения базового прогноза и получения приблизительного значения, а второй поток настраивает этот прогноз для каждой серии.
- Микшер усилителя градиента с использованием LightGBM, поверх которого находится библиотека Optuna, которая обеспечивает очень тщательный пошаговый поиск гиперпараметров.
Это гарантирует, что мы определили лучшую модель для наших прогнозов из десятков моделей машинного обучения.
Как создавать и использовать Predictive AI Tables в базе данных ClickHouse
Приведенная выше информация о техническом подходе, нормализации, подходе кодирования-микширования может показаться сложной для людей, не имеющих опыта машинного обучения, но на самом деле вам не требуется знать все эти детали, чтобы делать прогнозы внутри баз данных.
Использование одного SQL-запроса для обучения многомерного предсказателя временных рядов
Что MindsDB делает с подходом AI Tables, так это позволяет любому, кто знает только SQL, автоматически создавать прогностические модели и запрашивать их. Это так же просто, как запустить одну команду SQL.
Например, этот запрос будет обучать одну модель из многомерных данных временных рядов для прогнозирования стоимости проезда на такси из приведенного выше набора данных:
CREATE PREDICTOR fares_forecaster_demo FROM Clickhouse ( SELECT VENDOR_ID, PICKUP_DATETIME, FARE_AMOUNT FROM DEFAULT.TRIPDATA WHERE DATE > '2010-01-01' ) PREDICT FARE_AMOUNT ORDER BY DATE GROUP BY VENDOR_ID WINDOW 10 HORIZON 7;
Давайте обсудим утверждение выше. Мы создаем прогнозную таблицу AI, используя оператор CREATE PREDICTOR и указав базу данных, из которой поступают обучающие данные. Желтый код выбирает отфильтрованные обучающие данные. После этого мы используем ключевое слово PREDICT, чтобы указать столбец, данные которого мы хотим спрогнозировать, в нашем случае количество тарифов.
Далее идут некоторые стандартные операторы SQL, такие как ORDER BY, GROUP BY, WINDOW и HORIZON. Используя предложение ORDER BY со столбцом DATE в качестве аргумента, мы подчеркиваем, что имеем дело с проблемой временных рядов и хотим упорядочить строки по дате. Предложение GROUP BY делит данные на разделы. Здесь каждый раздел относится к определенной таксомоторной компании (vendor_id). Мы учитываем только последние 10 строк для каждого заданного прогноза. Следовательно, мы используем WINDOW 10. Для подготовки прогноза стоимости такси мы определяем HORIZON 7, что означает, что мы хотим прогнозировать на 7 часов вперед.
Получение прогнозов
Мы готовы перейти к последнему шагу, который использует прогностическую модель для получения данных о будущем. Один из способов – напрямую запросить прогнозную модель fares_forecaster_demo. Вы просто делаете оператор Select, передавая условия для прогноза в предложении Where.
Но мы рассматриваем проблему временных рядов. Поэтому рекомендуется присоединять нашу прогностическую модель к таблице с историческими данными.
SELECT tb.VENDOR_ID, tb.FARE_AMOUNT as PREDICTED_FARES FROM Clickhouse.DEFAULT.TRIPDATA as ta JOIN mindsdb.fares_forecaster_demo as tb WHERE ta.VENDOR_ID = "CMT" AND ta.DATE > LATEST LIMIT 7;
Давайте проанализируем это. Мы присоединяем таблицу, в которой хранятся исторические данные (например, Clickhouse.DEFAULT.TRIPDATA), к таблице нашей прогностической модели (например, mindsdb.fares_forecaster_demo). Запрашиваемая информация — это поставщик такси и прогнозируемое количество тарифов для каждого поставщика. Указав предоставленное MindsDB условие ta.DATE › LATEST, мы обязательно получим будущее количество поездок по маршруту.
Визуализация прогнозов
Мы можем подключить инструмент BI к прогнозным таблицам AI MindsDB, чтобы визуализировать прогнозы в удобной форме. Вы можете увидеть, как это делается для ранее обученного предиктора в Looker. Мы подключили таблицу, к которой присоединились, и можем видеть исторические данные вместе с прогнозом, сделанным MindsDB на ту же дату и время. В этом случае зеленая линия представляет фактические данные, а синяя линия — прогноз.
Вы можете видеть, что для первых 10 прогнозов прогноз не точен, потому что предиктор только начинает учиться на исторических данных (помните, мы указали Окно 10 прогнозов при его обучении), но после этого прогноз становится довольно точный.
Автоматическое обнаружение аномалий
Используя эту философию прогнозирования, MindsDB также может обнаруживать и помечать аномалии в своих прогнозах. Ниже мы представляем график для другого набора данных, набора данных об энергопотреблении для штата Понди в Индии.
Это прогноз временного ряда t+1, что означает, что модель просматривает все предыдущие значения потребления во временном интервале и пытается предсказать следующий шаг, в данном случае она пытается предсказать потребление энергии для на следующий день. Зеленая линия на графике показывает фактическое значение энергопотребления, а фиолетовая линия — это прогноз MindsDB, использующий все значения до этого временного шага для обучения модели машинного обучения.
По умолчанию MindsDB имеет оценку порога достоверности, обозначенную серой областью вокруг прогнозируемой тенденции. Всякий раз, когда реальное значение пересекает границы этого доверительного интервала, это может быть автоматически помечено как аномальное поведение, и человек, наблюдающий за этой системой, может более глубоко изучить и увидеть, происходит ли что-то.
Подобно обучению этой модели с одним рядом, MindsDB может автоматически обучаться и прогнозировать для нескольких групп данных. Вы можете тренироваться со всем набором данных для решения этой задачи и получать прогнозы для всех штатов Индии. Это очень удобно, поскольку абстрагирует большую часть обработки конвейера данных.
Принесите свои собственные блоки ML
MindsDB позволяет вам настраивать части конвейера обработки, но в дополнение к этому вы также можете использовать свои собственные модули. Например, если вы инженер по машинному обучению, мы даем вам возможность использовать собственный модуль подготовки данных, собственную модель машинного обучения, чтобы лучше соответствовать вашим потребностям.
Например, если вы предпочитаете заменить модель RNN классической моделью ARIMA для прогнозирования временных рядов, мы хотим предоставить вам эту возможность. Или в модуле анализа, если вы хотите запустить собственный анализ данных по результатам прогноза.
Если вы хотите попробовать эту функцию, посетите документацию MindsDB Lightwood для получения дополнительной информации или обратитесь через Slack или Github, и мы поможем вам.
Новые функции машинного обучения, которые появятся в AI Tables:
Прогнозирование данных из потоков
Одна из основных задач, над которой сейчас работает MindsDB, — попытаться предсказать данные из потоков данных, а не только из базы данных. Цель состоит в том, чтобы создать предиктор, который считывает потоковые данные, поступающие от таких инструментов, как Redis и Kafka, и создает прогноз того, что произойдет.
Улучшайте прогнозы для длинных горизонтов
Следующая функция, над которой мы работаем, — это улучшение прогнозов на длительные периоды времени, которые включают категориальные данные наряду с временными данными. Это сложная задача, потому что нам нужно указать в нескольких разных столбцах то, что, по нашему мнению, должно произойти, но мы уверены, что сможем улучшить это.
Обнаружение постепенных аномалий
Текущий алгоритм обнаружения аномалий очень хорошо работает с внезапными аномалиями в данных, но его необходимо улучшить, чтобы обнаруживать аномалии, возникающие в элементах, происходящих за пределами самих рядов данных. Это то, над чем мы постоянно работаем.
Выводы
В этой статье мы провели вас через рабочий процесс машинного обучения. Вы увидели, как использовать мощные инструменты ClickHouse, такие как материализованные представления, чтобы лучше и эффективнее справляться с очисткой и подготовкой данных, особенно для больших наборов данных с миллиардами строк.
Затем мы углубились в концепцию AI Tables из MindsDB, как их можно использовать в ClickHouse для автоматического построения прогностических моделей и прогнозов с помощью простых операторов SQL.
Мы использовали пример многомерной задачи временных рядов, чтобы проиллюстрировать, как MindsDB способна автоматизировать действительно сложные задачи машинного обучения, и показали, насколько простым может быть обнаружение аномалий и визуализация прогнозов путем подключения таблиц AI к инструментам BI через SQL.
Если вы хотите узнать больше о дорожной карте и предложениях ClickHouse Inc. в области облачных технологий, свяжитесь с нами здесь, чтобы связаться с нами.
Попробуйте сделать свои собственные прогнозы с MindDB самостоятельно, просто подписавшись на бесплатную облачную учетную запись или установив ее локально через Docker. Если вам нужна помощь, не стесняйтесь задать вопрос сообществу MindsDB через Slack или Github.