Введение

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

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

Настройка данных

Подключение данных в виде файла

В этом руководстве мы будем подключаться к нашей базе данных с помощью CSV-файла в облаке MindsDB. Вы можете скачать csv data file here на листе Google (руководство по тому, как это сделать здесь) и загрузить poker-hand-training.csv через MindsDB SQL Editor в облаке MindsDB.

Следуйте этому руководству, чтобы загрузить файл в MindsDB.

Как только вы закончите загрузку, вы можете запросить данные напрямую с помощью;

SELECT * FROM files.poker_hand_strength
LIMIT 10;

Обучение модели предиктора

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

Шаг 1. Мы будем использовать синтаксис CREATE PREDICTOR для создания предиктора, в котором мы укажем, какой подзапрос следует обучать из FROM и что он будет PREDICT.

CREATE PREDICTOR mindsdb.poker_hand_strength (Predictor's name)
FROM files                                   (Database name)
(SELECT * FROM poker_hand_training)          (table name)
PREDICT Poker Hand                           (Your Target Parameter)

Примечание. Мы использовали LIMIT 10000here, так как мы используем бесплатную версию MindsDB, которая поддерживает до 10 000 строк и выдаст ошибку, если у нас будет больше строк.

Шаг 2: Мы можем проверить статус модели с помощью приведенного ниже синтаксиса. Если запрос возвращает значение «Завершено», модель готова к использованию, в противном случае подождите, если она вернет «Обучение».

SELECT status
FROM mindsdb.predictors
WHERE name='poker_hand_strength';

Наш набор данных

Рейтинг рук

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

Набор данных

Каждая запись в наборе данных, который мы используем в этой статье, представляет собой пример руки, состоящей из пяти игральных карт, взятых из стандартной колоды из 52 карт. Каждая карта описывается двумя атрибутами (мать и ранг), всего 10 прогнозирующих атрибутов. . Целевая колонка описывает раздачу с возможными вариантами:

  1. Порядковый номер «Масть карты 1» (1–4), представляющий {черви, пики, бубны, трефы}
  2. «Ранг карты 1» Числовое значение (1–13), представляющее (туз, 2, 3, …, дама, король)
  3. Порядковый номер «Масть карт 2» (1–4), представляющий {черви, пики, бубны, трефы}
  4. «Ранг карты 2» Числовое значение (1–13), представляющее (туз, 2, 3, …, дама, король)
  5. Порядковый номер «Масть карты 3» (1–4), представляющий {черви, пики, бубны, трефы}
  6. «Ранг карты 3» Числовое значение (1–13), представляющее (туз, 2, 3, …, дама, король)
  7. Порядковый номер «Масть карт 4» (1–4), представляющий {черви, пики, бубны, трефы}
  8. «Ранг карты 4» Числовое значение (1–13), представляющее (туз, 2, 3, …, дама, король)
  9. Порядковый номер «Масть карт 5» (1–4), представляющий {черви, пики, бубны, трефы}
  10. «Ранг карты 5» Числовое значение (1–13), представляющее (туз, 2, 3, …, дама, король)
  11. КЛАСС «Покерная рука» Порядковый номер (0–9), представляющий следующее:
  • 0: Ничего в руках; не признанная покерная рука
  • 1: одна пара; одна пара равных рангов в пределах пяти карт
  • 2: две пары; две пары равных рангов в пределах пяти карт
  • 3: Тройка; три равных ранга на пяти картах
  • 4: прямой; пять карт, расположенных последовательно без пробелов
  • 5: смыв; пять карт одной масти
  • 6: Фулл-хаус; пара + тройка разного ранга
  • 7: каре; четыре равных ранга на пяти картах
  • 8: стрит-флеш; прямой + флеш
  • 9: флеш-рояль; {туз, король, дама, валет, десятка} + флеш

DESCRIBE ЗАЯВЛЕНИЕ ПРЕДИКТОРА

Этот оператор DESCRIBE PREDICTOR используется для отображения атрибутов существующей модели. Это также может помочь нам получить некоторое представление о модели предиктора. Чтобы узнать больше, ознакомьтесь с Документацией MindsDB. Мы можем найти более подробную информацию о модели следующими способами:

  • По функциям
  • По модели
  • По ансамблю

По характеристикам

DESCRIBE mindsdb.poker_hand_strength.features;

Ожидаемый результат должен быть:

+---------------------+-------------+----------------+---------+
| column              | type        | encoder        | role    |
+---------------------+-------------+----------------+---------+
| Suit_of_Card_1      | categorical | OneHotEncoder  | feature |
| Rank_of_Card_1      | integer     | BinaryEncoder  | feature |
| Suit_of_Card_2      | categorical | NumericEncoder | feature |
| Rank_of_Card_2      | integer     | OneHotEncoder  | feature |
| Suit_of_Card_3      | categorical | NumericEncoder | feature |
| Rank_of_Card_3      | integer     | OneHotEncoder  | feature |
| Suit_of_Card_4      | categorical | NumericEncoder | feature |
| Rank_of_Card_4      | integer     | NumericEncoder | feature |
| Suit_of_Card_5      | categorical | OneHotEncoder  | feature |
| Rank_of_Card_5      | integer     | NumericEncoder | feature |
| Poker_Hand          | integer     | NumericEncoder | target  |
+---------------------+-------------+----------------+---------+

Над столбцом Poker_Hand находится прогнозируемый столбец target. Что касается столбцов feature, они используются для обучения модели ML прогнозированию значения столбца Poker_Hand.

По модели

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

DESCRIBE PREDICTOR mindsdb.poker_hand_strength.model;

Вывод выглядит примерно так:

Ансамбль

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

DESCRIBE PREDICTOR mindsdb.poker_hand_strength.ensemble;

Вывод будет выглядеть примерно так:

{
  "encoders": {
    "Poker_Hand": {
      "module": "NumericEncoder",
      "args": {
        "is_target": "True",
        "positive_domain": "$statistical_analysis.positive_domain"
      }
    },
    "Suit_of_Card_1": {
      "module": "OneHotEncoder",
      "args": {}
    },
    "Rank_of_Card_1": {
      "module": "NumericEncoder",
      "args": {}
    },
    "Suit_of_Card_2": {
      "module": "OneHotEncoder",
      "args": {}
    },
    "Rank_of_Card_2": {
      "module": "NumericEncoder",
      "args": {}
    },
    "Suit_of_Card_3": {
      "module": "OneHotEncoder",
      "args": {}
    },
    "Rank_of_Card_3": {
      "module": "NumericEncoder",
      "args": {}
    },
    "Suit_of_Card_4": {
      "module": "OneHotEncoder",
      "args": {}
    },
    "Rank_of_Card_4": {
      "module": "NumericEncoder",
      "args": {}
    },
    "Suit_of_Card_5": {
      "module": "OneHotEncoder",
      "args": {}
    }
    "Rank_of_Card_5": {
      "module": "NumericEncoder",
      "args": {}
    }
  },
  "dtype_dict": {
    "Suit_of_Card_1": "categorical",
    "Rank_of_Card_1": "integer",
    "Suit_of_Card_2": "categorical",
    "Rank_of_Card_2": "integer",
    "Suit_of_Card_3": "categorical",
    "Rank_of_Card_3": "integer",
    "Suit_of_Card_4": "categorical",
    "Rank_of_Card_4": "integer",
    "Suit_of_Card_5": "categorical",
    "Rank_of_Card_5": "integer",
    "Poker_Hand": "integer"
  },
  "dependency_dict": {},
  "model": {
    "module": "BestOf",
    "args": {
      "submodels": [
        {
          "module": "Neural",
          "args": {
            "fit_on_dev": true,
            "stop_after": "$problem_definition.seconds_per_mixer",
            "search_hyperparameters": true
          }
        },
        {
          "module": "LightGBM",
          "args": {
            "stop_after": "$problem_definition.seconds_per_mixer",
            "fit_on_dev": true
          }
        },
        {
          "module": "Regression",
          "args": {
            "stop_after": "$problem_definition.seconds_per_mixer"
          }
        }
      ]
    }
  },
  "problem_definition": {
    "target": "Poker_Hand",
    "pct_invalid": 2,
    "unbias_target": true,
    "seconds_per_mixer": 57024.0,
    "seconds_per_encoder": null,
    "expected_additional_time": 12.685770511627197,
    "time_aim": 259200,
    "target_weights": null,
    "positive_domain": false,
    "timeseries_settings": {
      "is_timeseries": false,
      "order_by": null,
      "window": null,
      "group_by": null,
      "use_previous_target": true,
      "horizon": null,
      "historical_columns": null,
      "target_type": "",
      "allow_incomplete_history": true,
      "eval_cold_start": true,
      "interval_periods": []
    },
    "anomaly_detection": false,
    "use_default_analysis": true,
    "ignore_features": [],
    "fit_on_all": true,
    "strict_mode": true,
    "seed_nr": 1
  },
  "identifiers": {},
  "imputers": [],
  "accuracy_functions": [
    "r2_score"
  ]
}

Делать прогнозы

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

Делаем один прогноз

Вы можете делать прогнозы, запрашивая предиктор, как если бы это была таблица. Оператор SELECT позволяет делать прогнозы для Poker Hand Strength выбранного параметра функции.

SELECT Poker_Hand, Poker_Hand_explain
FROM mindsdb.poker_hand_strength
WHERE Suit_of_Card_1 = 1
AND Rank_of_Card_1= 10
AND Suit_of_Card_2 = 1
AND Rank_of_Card_2 = 11
AND Suit_of_Card_3 = 1
AND Rank_of_Card_3 = 13
AND Suit_of_Card_4 = 1
AND Rank_of_Card_4 = 12
AND Suit_of_Card_5 = 1
AND Rank_of_Card_5 = 1;

Наш вывод будет ;

Создание массового прогноза

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

SELECT t.Suit_of_Card_1 AS S1, t.Rank_of_Card_1 AS C1, t.Suit_of_Card_2 AS S2, 
t.Rank_of_Card_2 AS C2, t.Suit_of_Card_3, t.Rank_of_Card_3, t.Suit_of_Card_4, t.Rank_of_Card_4, t.Suit_of_Card_5 AS S5, t.Rank_of_Card_5 AS C5, m.Poker_Hand AS Poker_Hand
FROM files.poker AS t
JOIN mindsdb.poker AS m
LIMIT 5;

Ожидаемый результат будет

Заключение

В этом руководстве мы создали собственное облако Mindsdb, загрузили набор данных в интерфейс, обучили модель предиктора, а также предсказали poker_hand_strength на основе ранга и масти всех 5 карт.

Получайте удовольствие, пробуя это сами!

Поставьте лайк или оставьте комментарий, если этот урок был полезен