Как стать автором
Обновить

Табличная классификация и регрессия Apple ML

Время на прочтение8 мин
Количество просмотров1.7K

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

Apple представляет инструменты для быстрого создания и эффективного использования элементов искусственного интеллекта в ваших приложениях.

В обзорной статье мы рассмотрели шаблоны, которые включены в приложение «Create ML» поставляемое вместе с XCode: https://habr.com/ru/post/711400 Здесь мы остановимся на двух из них: «Tabular Classification» и «Tabular Regression».

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

Здесь нужно понимать одно очень важное различие: Вы можете на любых абстрактных данных нанести точку на график исходя из поведения графика. А делать предсказания следует только относительно событий которые имеют причинно следственные, пусть даже не очевидные, связи. К примеру, предсказать безаварийность работы авиационного терминала исходя из средне-суточной температуры можно (так как температура влияет на стаи перелетных птиц и обледенение взлетно-посадочной полосы), а вот вероятность выпадения козыря исходя из цвета и направления движения крокодила – нет. Даже если Вы получите данные – они не будут иметь никакого смысла. И, в то же время, увязать характеристики крокодила с карточной комбинацией на графике – легко. И так же легко указать точки левее и правее любого произвольно выбранного значения.

В качестве исходных данных были использованы данные о пассажирах Титаника. Сведения о них достоверные и хорошо изученные, поэтому, можно осуществить обратную проверку полученной модели. Источник – сайт https://www.kaggle.com. Загрузить фалы с данными можно по по со следующей страницы: https://www.kaggle.com/competitions/titanic-dataset/data

Общая последовательность работы с моделью следующая:

  1. Подготовка данных.

  2. Сепарация данных.

  3. Загрузка в данных в приложение «Create ML»

  4. Проведение обучения модели.

  5. Экспорт модели из приложения.

  6. Создание iOS / macOS приложения с импортированной моделью.

  7. Осуществление прогнозов по введенным параметрам.

Подготовка данных

Данные которые Вы загрузите с сайта нельзя будет использовать в чистом виде. Это обусловлено тем, что приложение «Create ML» не умеет правильно обрабатывать пустые (null) значения. По этому, прежде чем использовать полученные файлы необходимо, во-первых, избавится от лишних полей, а во-вторых, заменить пустые поля на значение «0». Файлы с данными являются файлами CSV с разделителями в виде запятых, поэтому, они легко открываются и обрабатываются любым табличным редактором.

Мы использовали для анализа следующий набор полей:

  • pclass  – класс пассажира

  • sex – пол

  • age – возраст

  • survived – признак того, что пассажир выжил во время крушения лайнера.

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

Исходные данные в табличном редакторе
Исходные данные в табличном редакторе

Сепарация данных

Обучение модели происходит в несколько этапов. Для повышения качества предсказания часть данных используется в качестве данных валидации. А после создания модели – еще одна часть данных используется в качестве данных для тестирования. Соответственно, все данные разделяются в соотношении 60 / 20 / 20. И данные для валидации, и данные для тестирования приложение «Create ML» может выделить само. Но, именно в случае с табличной моделью, процесс обучения может не быть запущен, если явно не указать файл для тестирования. Чтоб несколько упростить задачу мы выделили 53 записи из основного файла, и сохранили их в отдельном файле. (К слову сказать, при загрузке пакета данных с сайта в комплект входят данные для тестирования отдельным файлом. Но в таком случае придется подготавливать данные этого файла отдельно. Для демонстрации это несколько избыточно). В основном файле осталось 797 записей.

Загрузка данных

После выбора шаблона «Tabular Classification» внутри приложения создается локальная база данных, с названием «MyTabularClassifier 1». Это название Вас ни к чему не обязывает, и Вы можете тут же переименовать его с то, что посчитаете нужным. С этим именем будет экспортироваться созданная Вами модель.

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

Нажмите на синий крест в разделе Traning Data и выберите файл с исходными данными. После этого у Вас появится возможность так же задать целевое прогнозируемое поле в секции Target. В нашем случае это «survived» («выживаемость»). А так же поля, которые используются для прогноза (pclass, sex, age)  – секция Features. Имейте ввиду, что если Вы выберите все поля в секции Features может возникнуть ошибка в процессе обучения модели, поскольку они не все заполнены, поэтому, рекомендуем ограничится необходимым минимумом.

Загрузка данных для обучения модели
Загрузка данных для обучения модели

Раздел «Validation Data» можно оставить со значением «Automatic», а вот в секцию «Testing Data» нужно внести файл, созданный на этапе «Сепарации».

Осталось задать параметры обучения в секции «Parameters». Как и в предыдущем случае можно оставить все как есть, но, именно для этого случая имеет создать несколько локальных баз данных в приложении.

Выбор алгоритма для обучения модели
Выбор алгоритма для обучения модели

Обучение

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

После нажатия на кнопку «Train» приложение автоматически переключится вначале на вкладку «Training», а затем на вкладку «Evaluation». Весь процесс займет от 1 до 5 секунд. Однако, это касается только табличных данных. Если, к примеру, речь идет о сегментировании фотографий, то длительность может исчисляться часами и даже днями при полной загрузке процессора (вентилятор не даст Вам забыть о том, что процесс продолжается).

На вкладке «Evaluation» Вы можете оценить точность созданной модели. Однако рекомендуем вернуться на вкладку «Settings» – она изменилась. В секции параметров можно увидеть с какими изначальными настройками было запущено обучение.

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

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

На вкладке «Preview» Вы можете протестировать свою модель. Для этого нужно иметь файл со свежими данными в точно таком же формате, который был использован для обучения. Вы может загрузить сюда файл для тестирования чтоб оценить как работает этот механизм. В самом низу будет построчный навигатор, который позволяет перемещаться между данными этого файла. Так для пассажира ID 465 вероятность выживания составляет 90%.

Прогнозирование внутри приложения
Прогнозирование внутри приложения

Вкладка «Output» подвкладка «Prediction» показывает имена и типы входных и выходных параметров модели. Это будет важно при использовании модели в Вашем мобильном приложении, так как эти имена и типы являются свойствами (полями) класса модели дынных.

Входные и выходные параметры
Входные и выходные параметры

Экспорт

Экспорт созданной модели осуществляется посредством нажатия кнопки «Get» на вкладке «Output» (чуть ниже и правее заголовка экрана).

В результате в файловой системе сохраняется файл «MyTabularClassifier 1.mlmodel». Размер файла модели – всего 14 КБайт – это в несколько раз меньше размера файла, который использовался для обучения этой модели..

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

Создание iOS / macOS приложения с импортированной моделью

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

Большую часть исходного кода занимают директивы вывода на консоль.

    func startProbability() {
        Task {
            let genders = ["male", "female"]
            let config = MLModelConfiguration()
            guard let net = try? TitanicProbability(configuration: config) else { return }

            print("=======================================")
            print("STARTED")
            print("=======================================")
            var index = 0
            for pclass in 1 ... 3 {
                for gender in genders {
                    for age in 0 ... 70 {
                        let input = TitanicProbabilityInput(pclass: Double(pclass), sex: gender, age: Double(age))
                        do {
                            let result = try net.prediction(input: input)
                            index += 1
                            print("\(String(format: "%03d", index))): cl: \(pclass), \(gender == "male" ? "M" : "F" ), \(age), survived \(result.survived), probability \(result.survivedProbability)")
                        } catch let er {
                            print("EX: class: \(pclass), gender: \(gender), age:\(age) - \(er.localizedDescription)")
                        }
                    }
                }
            }
            print("=======================================")
        }

    }

При экспорте модели исходный файл был переименован в «TitanicProbability» и добавлен как файл к проекту. Соответственно, в исходном коде для доступа к модели используется тоже самое имя «TitanicProbability». XCode  автоматически превращает добавленный в проект файл в класс Vision фреймворка. Далее работа с ним осуществляется так же, как и с любым другим классом ООП – создается инстанс, сетятся свойства и вызываются необходимые методы. В нашем случае это метод prediction с экземпляром входных параметров.

Прогнозирование

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

Предсказания модели
Предсказания модели

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

Регрессия

Регрессионный анализ почти полностью повторяет те же шаги, которые мы делали для табличной классификации. Отличие лишь в том, что тергетированный параметр, survived  (он же выходной параметр) только один, и выражен вещественным числом в диапазоне от -1 до 1. Откуда взялось отрицательное число? Сама по себе вероятность выживаемости, разумеется находится в диапазоне от 0 до 1. Однако, поскольку целевые половозрастные характеристики не имеют конкретных заданных значений в данных для обучения и тестирования, то экстраполяция кривой (выход за пределы отмеченных величин) может уходить за пределы доступного диапазона.

    func startRegression() {
        Task {
            let genders = ["male", "female"]
            let config = MLModelConfiguration()
            guard let net = try? TitanicRegressor(configuration: config) else { return }

            print("=======================================")
            print("STARTED")
            print("=======================================")
            var index = 0
            for pclass in 1 ... 3 {
                for gender in genders {
                    for age in 0 ... 70 {
                        let input = TitanicRegressorInput(pclass: Double(pclass), sex: gender, age: Double(age))
                        do {
                            let result = try net.prediction(input: input)
                            index += 1
                            print("\(String(format: "%03d", index))): class: \(pclass), gender: \(gender), age:\(age), survived \(result.survived)")

                        } catch let er {
                            print("EX: class: \(pclass), gender: \(gender), age:\(age) - \(er.localizedDescription)")
                        }
                    }
                }
            }
            print("=======================================")
        }
    }
Регрессия
Регрессия

Обсудить можно на телеграмм канале.

Теги:
Хабы:
+3
Комментарии0

Публикации

Изменить настройки темы

Истории

Работа

iOS разработчик
24 вакансии
Swift разработчик
33 вакансии

Ближайшие события

PG Bootcamp 2024
Дата16 апреля
Время09:30 – 21:00
Место
МинскОнлайн
EvaConf 2024
Дата16 апреля
Время11:00 – 16:00
Место
МоскваОнлайн
Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн