reject inference что это
Обзор возможностей модуля STATISTICA Scorecard
STATISTICA Scorecard – программный продукт для автоматизированного построения, управления и оценки скоринговых моделей.
Процесс построения скоринговых карт можно условно разделить на 5 этапов. Каждый из этапов реализован в виде соответствующего модуля продукта STATISTICA Scorecard.
Feature Selection
Модуль Feature Selection используется для исключения неважных или избыточных переменных в исходном наборе характеристик. Модуль определяет ранги переменных, используя две меры общей предсказательной мощности переменной: IV (Information Value – Информационная ценность) и V мера Крамера.
Основываясь на этих мерах, вы можете различить переменные, которые имеют существенное влияние на кредитный риск, и выбрать их для построения модели.
Опция Select representatives позволяет вам идентифицировать избыточность в численных переменных без анализа корреляционной матрицы всех переменных. Этот модуль создает наборы данных, состоящих из коррелированных характеристик, используя факторный анализ с вращением оценок. В каждом наборе переменные сильно коррелированы с одним фактором (и часто между собой), таким образом, вы можете легко выбрать лишь небольшое число переменных из набора.
Attribute Building
Скоринговая модель обычно строится на основе дискретных данных. Это означает, что прежде, чем приступить к построению модели необходимо разбить непрерывные переменные на категории (создать атрибуты).
Модуль Attribute Building позволяет выделять атрибуты для каждой переменной.
Атрибуты можно создавать и регулировать вручную, или же воспользоваться одним из предложенных методов: методом CHAID деревьев, по процентилям или вручную, чтобы они соответствовали какому-нибудь бизнес или статистическому критерию, например, гладкость профиля или простота в интерпретации.
Построенные атрибуты сохраняются в виде скрипта в формате XML и используются в дальнейшем в модуле Scorecard Preparation.
Scorecard Preparation
Модуль Scorecard Preparation используется для создания скоринговых карт, основываясь на атрибутах, подготовленных в модуле Attribute Building, и модели логистической регрессии.
Процесс построения скоринговых карт может быть упрощен, путем задания параметров по умолчанию. Для более тонкой настройки карты Вы можете выбрать один из методов построения модели:
В модуле также определяются значения, контролирующие то, как параметры логистической регрессии будут масштабированы (пересчитаны) в скоры скоринговой карты.
Когда модель построена, программой выводится подробный отчет о каждом этапе построения логистической модели, различные статистики, критерии для оценки качества модели и др.
Скоринговая карта сохраняется в формате Excel, XML или SVB скрипта.
Survival
Модуль Survival используется для построения скоринговых моделей при помощи модели пропорциональных рисков Кокса (Cox Proportional Hazard Model). Скоринговая модель строится с учетом информации о времени дефолта, вычисляется вероятность дефолта в заданный момент времени (например, через 6 или 9 месяцев и т.д.)
Reject Inference
Зачастую необходимо также анализировать случаи по отклоненным заявкам (когда заемщику сразу отказали в праве получения кредита). Так как в такой ситуации нет информации о выходном классе («хороший»/ «плохой»), данная информация может быть получена, используя алгоритм k-ближайших соседей или группировки. После проведения анализа будет сформирована новая таблица данных с полной информацией.
Model Evaluation
Модуль Model Evaluation используется для оценки и сравнения различных скоринговых моделей. Для оценки модели выбираются следующие статистические меры (по каждой из которых приводится детализированный отчет).
Также модуль формирует различные отчеты:
Cut-off Point Selection
Выбор точек отсечения используется для определения скора, который будет оптимальным для разделения принятых и отклоненных заявок. Вы можете расширить процедуру приятия решения, добавив ещё одну или две точки отсечения (например, заявки со скором меньше 520 будут отклонены, заявки с оценкой выше 580 будут приняты, а с людей, подавших заявки с оценкой между этими двумя значениями, будет запрошена дополнительная информация).
Модуль предлагает различные способы выбора оптимальных точек отсечения, различные отчеты для анализа выбранного разбиения. Например, точка отсечения может быть выбрана, основываясь на Кривых Операционных Характеристик, с заданием пользовательской цены неправильной классификации.
Score Cases
Модуль Score Cases используется для оценивания новых наблюдений при помощи выбранной модели, сохраненной в виде скрипта в формате XML.
Population Stability
Модуль Population Stability предоставляет аналитические инструменты для сравнения двух массивов данных (например, текущий и исторический массивы данных) с целью определения существенных изменений в характеристиках структуры и популяции заявителей. Значительные искажения в текущем массиве данных могут означать, что требуется оценить параметры модели заново. Модуль предоставляет отчеты о стабильности характеристик популяции с соответствующими графиками.
How to Apply Reject Inference Methods
What is Reject Interference
Reject Interference is a method of improving the quality of the scorecard based on the use of data contained in rejected loan applications.
When developing a scorecard, we normally use information on those borrowers who have previously been granted a loan. However, the number of potential customers is significantly higher and a correctly developed scorecard must be able to perform as expected in the context of the entire population of potential customers.
The behavior of new types of borrowers can significantly differ from the behavior of the borrowers included in our credit portfolio.
To improve our knowledge of potential borrowers, we can use information on those customers who applied for and were refused a loan.
To develop a scorecard, we need to identify each borrower either as a “good” one or a “bad” one. However, there is no such information available for rejected loan applications. We cannot tell for sure, to which group a borrower would have belonged, had he/she been granted a loan. The Reject Interference methods are intended to provide the most correct way to perform the Good-Bad identification of rejected application in order to include them into the development set, based on which we can build a scorecard.
Simple Augmentation
The simplest way to include information on rejects is to evaluate them using the existing scorecard; rejected loan applications can be used afterwards to adjust the scorecard.
This method is called Simple Augmentation.
The first step involves developing a scorecard using the information on approved loan applications:
Using the resulting scorecard, we can evaluate the set of rejects; rejects are evaluated as “good” or “bad” based on the acceptable bad rate value.
Finally, a joint set of approved and rejected applications is used to adjust the parameters of the scorecard:
The most obvious drawback of the Simple Augmentation algorithm is the fact that rejects are evaluated using only the actual scorecard. In fact, the scorecard can cause errors, for example, due to differences in the characteristics of the credit portfolio and those of the set of rejects.
Besides, the algorithm does not take into account the probability of a loan applications being approved or rejected. Using the algorithms results in treating approval chances of approved and rejected loan applications as identical, which is undoubtedly not true.
Fuzzy Augmentation
The most accurate approach to the processing of data contained in rejected loan applications is called Fuzzy Augmentation. This method involves using rejects with weight values that correspond to the probability of a given loan application being approved or rejected.
The first step involves developing a scorecard using the information on approved loan applications:
Then, using the resulting scorecard, we evaluate the set of rejects:
For each rejected application, there are two records containing the weight values that correspond to the probabilities:
The joint dataset that is extended due to the “double” number of rejects is used to adjust the parameters of the scorecard:
The use of both the probability of rejection and the probability of approval of a reject allows adjusting the parameters of the score to cover either of the two possible types of behavior (“good” or “bad”).
Credit Scoring Software is the most easy-to-use and the fastest to integrate scoring system.
Как запихать нейронку в кофеварку
Мир машинного обучения продолжает стремительно развиваться. Всего за год технология может стать мейнстримом, и разительно измениться, придя в повседневность.
За прошедший год-полтора, одной из таких технологий, стали фреймворки выполнения моделей машинного обучения. Не то, что их не было. Но, за этот год, те которые были — стали сильно проще, удобнее, мощнее.
В статье я попробую осветить всё что повылезало за последнее время. Чтобы вы, решив использовать нейронную сеть в очередном калькуляторе, знали куда смотреть.
Перед началом статьи нужно сразу сказать несколько дисклеймеров:
Часть 1. “Что такое инференс”
Мир нейронных сетей можно разбить на две части:
Чаще всего для обучения используются Nvidia GPU (да, есть TPU от Google, или Intel Xe, но скорее это редкость). Так что софт для обучения должен хорошо поддерживать одну платформу.
Нужно ли обучение при использовании нейронной сети в проде? Очень редко. Да, у нас было несколько проектов с автоматическим дообучением. Но лучше этого избегать. Это сложно и нестабильно.
Да и если нужно, то проще утащить на внешний сервак и там дообучить.
Как следствие — можно отбросить 90% математики и обвеса, использовать только выполнение. Это и называется “инференс”. Он быстрее, чем обучение. Требует сильно меньше математики.
Но вот засада. Не тащить же для инференса GPU. Инференс может быть и на десктопах, и на мобильниках, и на серверах, и в браузере.
В чём его сложность?
Нейронные сети едят много производительности — нужно либо специальное железо и его поддержка, либо максимальная утилизация существующего, чтобы хоть как-то достать производительность.
А железо очень-очень разное. Например в телефонах Android может существовать с десяток различных вычислителей, каждый из которых имеет свою архитектуру. А значит ваш модуль должен быть универсален для большинства.
Часть 2. Железо
Железо в ML бывает очень разное. Его хотя бы примерное описание на текущий момент будет требовать десятка статей. Могу вам посоветовать очень крутую статью от 3Dvideo про технологии аппаратного ускорения нейронных сетей. И свою статью про то как устроены embedding системы в последнее время.
И то и то уже немного неактуально, ведь всё быстро-быстро меняется;)
Для упрощения понимания статьи, или для тех кто не хочет углубляться я накидал упрощённую схему которой мы будем оперировать (кликабельно):
Тут мы видим несколько направлений инференса:
Есть фреймворки которые теряют в разветвленности, но неплохо работают там где работают. Есть которые используют максимально популярные устройства, но не работают на других. Опять же, если показать это ооочень примерно, то выйдет как-то так:
Поговорим подробнее, скорее слева на право.
Специализированное железо: Gyrfalcon, Khadas, Hikvision, и.т.д.
Всё это добро я решил выделить в одну группу. Фреймворком это назвать сложно. Обычно это специализированный софт который может перенести нейронку на железо, чтобы она выполнялась там оптимально. При этом железяка у производителей зачастую одна или две.
Отличительной особенностью таких платформ является:
Более подробно рассказывать про эту часть наверное нет смысла.
Специализированное железо но от крупных фирм
Крупные производители железа обычно имеют много разного железа, но всё оно программируется в рамках одного фреймворка. Это открытые фреймворки, которые можно спокойно скачать и использовать.
Они позволяют портировать нейронку и использовать её максимально эффективно. В большинстве случаев поддерживаются все современные архитектуры, а если не поддерживаются, то есть другие способы их использовать или добавить.
Поговорим про них подробнее:
Nvidia — TensorRT
Наверное это самая классика, и не надо рассказывать почему. Больше 90% ресёрча использует именно видюхи NVIDIA. Инференс часто на них же => все стараются выжать максимум, а для этого нужны TensorRT — специальный фреймворк который максимально утилизирует мощь видеокарты для нейронных сетей.
Более того, если вы пишите на CUDA — то можете в рамках одного обработчика обрабатывать данные. Самый классический пример — NMS. Например, когда-то давно мы переписывали кусок одного детектора поз на CUDA чтобы не гонять данные на процессор. И это очень ускоряло его работу.
Нужно понимать, что NVIDIA целит в три области, и везде TensorRT используется:
Мне кажется, что если вы делаете инференс на Nvidia, то у вас просто нет альтернатив — надо использовать TensorRT. Всё остальное приведёт к падению производительности.
Triton Inference Server
Но, так как мы говорим про инференс, то нужно упомянуть Triton Inference Server. Это не совсем TensorRT (хотя TensorRT подразумевается как оптимальный для него фреймворк). Triton может использовать TensorFlow, PyTorch, Caffe. Он сам ограничивает память и настраивает любой из упомянутых фреймворков, управляя выполняющимися сетями.
Triton сам решает какие модели загружать-выгружать из памяти, сам решает какой batch использовать. Может использовать не только TensorRT модели, но и модели *.pd, *.pth, ONNX, и.т.д., (ведь далеко не все можно сконвертировать в tensorrt). Triton может раскладывать по нескольким GPU. И прочее и прочее.
Мы использовали его в продакшне в нескольких проектах — и остались ужасно довольны. Максимальная утилизация GPU с минимумом проблем.
Но… Он не сможет выполнить модель где-то за пределами Nvidia
Intel — OpenVino
Intel представлен на рынке:
Мне нравиться OpenVino так как он достаточно стабилен, прост, и имеет инференс почти везде. Я писал на Хабре статью в которой рассказывал опыт одного хоббийного проекта под Intel. Там я отлаживал на десктопах, а тестировал на RPi с мовидиусом. И все было норм.
В целом, все 2-3 проекта которые мы делали в своей практике под OpenVino, прошли примерно так же. Минимум сложностей, удобный инференс, заказчик доволен.
Open Vino интегрирован в OpenCV про который мы ещё поговорим. OpenCV тоже от Intel, но я бы рассматривал его как отдельный фреймворк/способ инференса и подхода к данным.
Отдельно я бы хотел отметить один забавный момент. Аренда GPU сервера для того чтобы развернуть модель в онлайне будет стоить где-то от 10к. рублей, где-то до 100к. рублей, в зависимости от используемых видюх.
Аренда сервака с I5 на каком-нибудь клауде зачастую возможна за 500-1000 рублей в месяц.
Разница в производительности между TensorRT и ONNX на сравнимых по цене процах может быть в 2-20 раз (зависит от сети). Как следствие — часто можно неплохо сэкономить перенеся онлайн инференс на ONNX.
Google — Edge
Google очень неоднозначная фирма сама по себе. Мало того, что Google имеет свой стек аппаратуры для инференса нейронных сетей. Ещё у Google целый стек различных фреймворков про которые мы поговорим позже. Запутанный и местами бажный. Но в целом это:
Минусом Edge является то, что из коробки поддерживаются не все модели, гарантирована поддержка лишь нескольких (coral.ai/models/). А конвертация достаточно усложнена (TF → TF Lite → Edge TPU):
Конвертация в Cloud TPU чуть проще, но и там есть свои особенности. Я не буду более подробно рассказывать про особенности этого фреймворка. Скажу лишь что каждый раз когда с ним сталкивался — оставались неприятные впечатления, так что не стали тащить его нигде в прод.
Универсализация с хорошей аппаратной поддержкой
Мы переходим в область подходов, которые достаточно оптимально используют железо, но будут требовать немного разный код на разных платформах (нельзя же на Android всё сделать на Python).
Тут я бы упорядочил как-то так (опять же, очень условно):
Пройдем по этому списку.
OpenCV
OpenCV это легендарный фреймворк ComputerVision появившийся более 15 лет назад. За свои 12 лет занятий ComputerVision я запускал его на Arm году в 2010, на BlackFin примерно тогда же, на мобильниках, на серверах, на RPi, на Jetson, и много-много где. У него есть классные биндинги на Python, Java, JavaScript, когда-то я вовсю использовал его на C#.
OpenCV более чем живой и сейчас. И нейронные сети активно просачиваются туда с самого их появления.
Мне кажется, что на сегодня у OpenCV есть несколько глобальных минусов:
По нашим тестам в OpenCV нейронные сети на CUDA выполняются медленнее чем в TensorRT всего на 5-10%, что отлично.
Это делает OpenCV весьма ценным фреймворком для серверных решений, где нужно выжимать максимум из имеющегося ускорителя, какой бы он не был.
Так же OpenCV очень неплохо поддерживает различные CPU на ARM-устройствах. На том же RPi он использует NEON.
Tensorflow lite
Чуть ближе к мобильному миру лежит TensorFlow lite. Он может исполнять нейронные сети как и на обычном GPU мобильного устройства, так и на возможных сопроцессорах, если производитель телефона соблюдает какой-то набор стандартов. Для мобильников возможные варианты выглядят примерно так:
В большинстве случаев вы автоматически можете проверить максимальный уровень ускорения и запустить именно на нём. Детальной карты того какие вендоры предоставляют какую поддержку железа я не нашёл. Но я видел несколько примеров которые начались поддерживаться. Например под Snapdragon мы когда-то портировали сети, а потом TFLite начал его поддерживать.
Чуть более подробно о том что насколько даёт прирост можно посмотреть, например, тут. Также, стоит упомянуть, что изначально поддержка GPU шла за счёт OpenGL, но в последнее время Google добавила и OpenCL, чем почти в 2 раза ускорила выполнение сетей.
Но прелесть TFlite не только в том что он работает под мобильниками. Он ещё достаточно неплох для части embedded устройств. Например, он достаточно эффективно работает под RaspberryPI. На последнем DataFest ребята из X5 рассказывали что они используют эту конструкцию в продакшне.
Так же, TFlite, за счёт XNNPACK неплохо работает на процессорах (но не так эффективно как OpenVino на Intel). Это даёт возможность использовать TFLite как способ инферить модели на десктопах. Хоть и без поддержки GPU. Зато без тонны лишних зависимостей.
ONNX runtime
В какой-то момент в гонку ворвался Microsoft, который решил зайти со стороны. Сначала они выпустили универсальный формат сохранения нейронных сетей, который сейчас достаточно популярен, — ONNX.
И, когда уже форматом многие начали пользоваться, — решили сделать свой рантайм для него.
Если честно, то я даже не знаю половину того что представлено в списке. )
Выглядит всё идеально (а ещё всё поддерживается на Python, Java, C, C++, C# и.т.д.)…
Но пока что мне не довелось использовать ONNX-runtime на практике, кроме ONNX.js, о котором будет ниже. Так что не могу гарантировать что всё работает идеально. В интернетах слишком мало примеров того как всё работает. И знакомых которые бы на этом разворачивали продакшн полноценный тоже не знаю (максимум тестировали но не решили развернуть).
Но в гайдах уверяется что даже для Raspberry PI и Jetson есть поддержка.
Про поддержку ios явно ничего не сказано. Но местами «ios» встречается по коду. А кто-то билдит.
PyTorch
Одна из проблем использования OpenCV, TFlite, ONNX Runtime: “А почему мне надо обучать в одном фреймворке, а использовать в другом?”. И авторы PyTorch тоже задают себе такой вопрос. Так что, прямо из коробки, предоставляют способ использования PyTorch на мобильниках:
Скажу честно, я не тестировал скорости инференса. Но по опросу знакомых — в целом все считают это медленным вариантом. По крайней мере инференс PyTorch на процессорах и GPU — тоже не самый быстрый. Хотя, опять же, XNNPACK используют.
Но, данный вариант вполне удобен для разработки и пуша в продакшн (нет лишних конвертаций, и.т.д.). Мне кажется, что иногда это хороший вариант (например когда нет требований на очень высокую производительность).
TensorFlow
Кроме использования TFlite можно использовать и оригинальный TF, для развертывания на embedded устройствах и десктопах. При этом TF имеет достаточно высокую степень конфигурируемости. Но, на мой взгляд, это достаточно мертвый вариант в будущем.
Китайское вторжение
Теперь мы переходим к двум вариантам, которые не тестировал почти никто из моих знакомых. Но которые выглядят весьма перспективно.
Первый из них — MNN, вариант от alibaba.
Авторы уверяют, что MNN — самый легковесный из фреймворков, который обеспечивает инференс на большом числе устройств, при использовании GPU или CPU. При этом поддерживает большой спектр моделей.
Второй вариант интереснее, это ncnn от Tencent. Согласно документации библиотека работает на большом числе устройств. Реализована на c++:
На неё даже Yolov4 спортировано. И в целом, AlexeyAB очень позитивно отзывался.
Но, опять же, у меня достаточно мало информации о практическом применении. Сам не использовал, в проектах которые видел/консультировал — никто не использовал.
При этом можно отметить, что не так много нативных решений одновременно поддерживают и телефоны и nvidia.
JS — Tensorflow.JS, ONNX.js
Я бы объединил эти две категории в общий раздел, хотя, конечно, у TensorFlow.js и ONNX.js есть много различий. TensorFlow чуть лучше поддерживает оптимизацию. ONNX чуть быстрее. LSTM не присутствует в ONNX. И прочее и прочее.
В чем особенность этого класса инференс фреймворков? В том, что они выполняются только на CPU, или на GPU. По сути через WebGL или через WebAssembly. Это наборы инструкций, которые доступны через браузерный JS.
Как плюс — имеем офигенную универсальность такого подхода. Написав один раз код на JS — можно исполнять его на любом устройстве. Если есть GPU — на нём. Если только CPU — на нём.
Основной минус — тоже понятен. Никакой поддержки за пределами CPU или GPU (ускорители/сопроцессоры). Невозможно использовать эффективные способы утилизации CPU и GPU (те же OpenVino или TensorRT).
Правда, под Node.js, TF.js умеет в TPU:
При этом этот вариант явно оптимальный, если вам нужно использовать простые модели, имея кроссплатформенность.
Мы использовали в проектах оба инференса, всё работало хорошо. Но, конечно, производительность немного жалко.
Как небольшое резюме
Выводы сложно делать. Я не смог придумать какого-то однозначного алгоритма который бы помогал выбрать платформу на которой нужно разворачивать ML решение в зависимости от бизнес требований, аппаратуры и сложности сетей.
А так… Тема объёмная. Ведь чтобы достаточно подробно рассмотреть TensorFlow lite со всеми плюсами и минусами — надо написать две таких статьи. А для полного обзора OpenCV и десяти не хватит. Но сил написать столько нет.
С другой стороны, я надеюсь, написанное поможет кому-то хоть немного структурировать логику при выборе платформы для инференса.
А если у вас есть и другие идеи как выбирать — пишите!
В последнее время делаю много мелких статей/видеороликов. Так как это не формат Хабра — то публикую их в блоге или на ютубе. Подборка всего есть в телеге и вк.
На Хабре обычно публикую, когда рассказ становится уже более самозамкнутым, иногда собрав 2-3 разных мини-рассказа на соседние темы.