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

Написано: 13 августа 2018 г. Sourish Dey

https://www.linkedin.com/in/sourish-dey-03420b1a/

Разработка важных функций:

В своей предыдущей статье я обсуждал важность создания богатых функций из ограниченного числа функций. Действительно, реальное качество модели машинного обучения / глубокого обучения зависит от обширной разработки функций, а не от самой техники моделирования. Хотя конкретный метод машинного обучения может лучше всего работать для конкретной бизнес-задачи / набора данных, функции являются универсальными драйверами / важными компонентами для любого проекта моделирования. Извлечение как можно большего количества информации из доступных наборов данных имеет решающее значение для создания эффективного решения.

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

Почему автоматическая разработка функций:

Традиционно аналитики / специалисты по обработке данных использовали для создания функций ручной процесс на основе знаний предметной области / бизнеса. Часто это называется созданием функций вручную. Хотя в науке о данных мы не можем отрицать важность знания предметной области, этот тип разработки функций имеет некоторые недостатки:

1. Утомительно. Разработка функций вручную может быть утомительным процессом. Сколько новых функций можно создать из списка родительских переменных? Например, из переменной даты специалист по данным может создать 4 новых функции (месяц, год, час и день недели). Однако другой специалист по данным может создать 5 дополнительных функций (индикатор выходных, индикатор праздничного сезона, индикатор месяца X-mass, индекс сезонности, номер недели в месяце и т. Д.). Есть ли какая-либо связь / взаимодействие с какой-либо другой переменной? Таким образом, ручная разработка функций ограничена как человеческими временными рамками, так и воображением: мы просто не можем представить себе каждую возможную функцию, которая будет полезна.

2. Влияние человеческой предвзятости: Чаще всего человек, работающий над определенной областью / проектом моделирования, создает глубокую предвзятость в отношении некоторых функций (особенно, если она была создана этим аналитиком ранее!), Независимо от того, добавляет стоимость модели или нет.

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

Бизнес-проблема и актуальность CNN

Здесь бизнес-цель состоит в том, чтобы спрогнозировать вероятность кредитного дефолта на основе платежного статуса владельца кредитной карты, баланса и истории платежей, отслеживаемых за последние несколько винтажей (последние 6 месяцев от прогнозируемого периода). Для простоты давайте проигнорируем период задержки (обычно существует задержка между извлечением информации о клиенте и загрузкой данных в систему для анализа). Мотивация этой бизнес-проблемы и подготовки данных взята из https://medium.com/@guaisang/credit-default-prediction-with-logistic-regression-b5bd89f2799f.

Я не использовал перекрестные компоненты (например, пол, образование и т. Д.) В данных, а только сохранил переменные временного ряда (баланс, история платежей и т. Д.), Чтобы представить CNN в этой бизнес-проблеме. Цель этой статьи - концептуализировать и реализовать CNN на этих структурированных данных и сгенерировать 100 новых функций из этих данных с использованием модели CNN. Вы можете получить данные и весь код здесь.

О данных:

В наборах данных в качестве переменной ответа используется двоичная переменная «платеж по умолчанию в следующем месяце» (Да = 1, Нет = 0). В этом наборе 18 функций (без ID):

  • 1: 6 = X1 статус погашения в последний месяц периода прогноза; . . .; X6 = статус погашения за 6-й месяц до периода прогнозирования. Шкала измерения статуса погашения: -1 = надлежащая оплата; 1 = отсрочка платежа на один месяц; 2 = отсрочка платежа на два месяца; . . .; 8 = отсрочка платежа на восемь месяцев; 9 = отсрочка платежа от девяти месяцев и более. 0 означает, что транзакции нет
  • X7 = сумма выписки по счету за последний месяц отчетного периода;…. X12 = сумма выписки по счету за 6-й месяц до отчетного периода;
  • X13 = сумма выписки по счету за последний месяц отчетного периода;…. X18 = сумма платежа за 6-й месяц до контрольного срока;

Представление данных в формате CNN:

Методы глубокого обучения, в частности CNN, добились большого успеха в области данных на основе изображений, где данные предлагают четко структурированную топологию в регулярной решетке пикселей, хотя подробное обсуждение сверточной нейронной сети (CNN или ConvNet) выходит за рамки этой статьи, давайте посмотрим, что делает CNN такими популярными?

Методы глубокого обучения, в частности CNN, добились большого успеха в области данных на основе изображений, где данные предлагают четко структурированную топологию в виде регулярной решетки пикселей. Хотя подробное обсуждение CNN или ConvNet выходит за рамки этой статьи, давайте посмотрим, что делает CNN такими популярными?

Уменьшенные параметры (совместное использование параметров): во время операции свертки (слой) каждое выходное значение (свернутый элемент на рисунке) не требуется для подключения к каждому нейрону в предыдущем слое. (изображение на рисунке), но только для тех, которые называются рецептивными полями, где в настоящее время применяется ядро ​​свертки. Эта характеристика слоя свертки называется Локальная связность. Кроме того, к свертке применяются одинаковые веса до следующего обновления параметров. Эта характеристика сверточного слоя называется Parameter Sharing. Они значительно сократили количество необходимых параметров по сравнению с обычной структурой ANN (искусственная нейронная сеть), где существует связь между каждой парой входных / выходных нейронов. .

Отклонение сдвига / трансляции: это означает, что при сдвиге ввода вывод также сдвигается, но в остальном остается неизменным. В частности, для изображения вы можете распознать объект как объект, даже если его внешний вид изменяется каким-либо образом.

Таким образом, чтобы применить CNN к любым данным, данные должны быть подготовлены таким образом, чтобы были локальные шаблоны, и одни и те же локальные шаблоны были актуальны повсюду. Чтобы конкретизировать наши данные, у нас есть горизонты временных рядов событий (баланс, платежи и т. Д.) Для отдельного клиента, что делает данные для него полными локальных шаблонов, и, следовательно, эти параметры могут совместно использоваться клиентами. Нам просто нужно подготовить данные, подходящие для подачи в матрицу характеристик CNN для отдельных клиентов, так же, как матрица кадра изображения d * w * n (d, w и n - глубина, ширина и номер канала кадр изображения).

Чтобы уточнить, есть ли у нас N клиентов с m функциями (здесь баланс / платеж и т. Д.) На t временных горизонтах (здесь месяц 1, месяц 2 и т. Д.) Для p разных сделок (сделки - это разные кредитные линии, такие как розничные карты, ипотека и т. Д.) ). Таким образом, просто m функций, t временных горизонтов и p сделок для отдельных клиентов аналогичны ширине, глубине и количеству каналов в массиве функций изображения. Именно для наших данных размерность для каждого клиента будет m * t * p, а для всех данных будет N * m * t * p. Теперь это превращает изначально структурированные данные в данные типа кадра изображения, идеально подходящие для применения CNN для извлечения сложных нелинейных локальных шаблонов среди клиентов с помощью операции свертки.

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

Исходный набор данных состоял из одной торгово-розничной карты. Чтобы сделать его более актуальным и сложным, я создал фиктивный набор данных (пометив статус целевой переменной как исходные данные) для одной дополнительной сделки - ипотеки. Этих данных меньше, чем данных розничных карт, и значения могут быть не на 100% логичными. Окончательный набор данных (CreditDefault.csv) хранится здесь.

Итак, у нас есть 30 000 различных идентификаторов клиентов и всего 60 000 наблюдений, первые 30 000 наблюдений относятся к розничной карте, следующие 30 000 - к ипотеке.

Подробное решение, включая код для подготовки данных, находится по адресу https://github.com/nitsourish/CNN-automated-Feature-Extraction/blob/master/CNN_feature_extraction.ipynb. Сложная часть этой проблемы заключается в том, чтобы подготовить данные в формате (формате, подобном изображению), чтобы мы могли применить CNN. Точно для наших данных размерность для каждого клиента будет 3 (нет функций) * 6 (временные горизонты) * 2 (сделки) и будет 30000 кадров этого измерения. Таким образом, для всех данных это будет массив размером 30000 * 3 (ширина) * 6 (глубина) * 2 (количество каналов). Таким образом, данные будут идеальными для обучения сверточной сети.

После подготовки данных по конкретному каналу мы видим измерение:

shape of channel1(retail)data: (30000, 3, 6, 1)
shape of channel2(mortgage)data: (30000, 3, 6, 1)

После объединения этих двух массивов данные можно подавать в CNN в качестве входного объема для извлечения сложных функций с нелинейным взаимодействием.

shape of input volume(layer)data: (30000, 3, 6, 2)

Теперь данные выглядят как данные кадра изображения, как данные изображения (30000 кадров изображения объемом 3 * 6 * 2). Теперь нам нужно сопоставить целевую переменную (платеж по умолчанию в следующем месяце) с идентификатором клиента в одном формате горячего кодирования.

X = np.concatenate((retail, mort),axis=3)
Y = event_id[['default payment next month']].values
Y = to_categorical(Y,2)
In our data we have payment default rate is: 28.402671 percent

В данных мы имеем коэффициент payment_default 28,40%. Хотя частота событий не составляет 50%, мы можем сказать, что это довольно сбалансированные данные. так что не нужно делать коррекцию веса

Извлечение признаков из CNN

Чтобы извлечь особенности из модели CNN, нам нужно сначала обучить сеть CNN с последним сигмоидальным / логистическим плотным слоем (здесь измерение 2) w.r.t. целевая переменная. Целью обучающей сети является определение правильных весов для сети с помощью нескольких прямых и обратных итераций, которые в конечном итоге пытаются минимизировать двоичную кросс-энтропию (стоимость ошибочной классификации). Здесь я буду использовать фреймворк keras с серверной частью как TensorFlow (tf). Для нашей бизнес-задачи AUC - это метрика оценки, и мы будем проводить оптимизацию, максимизируя значение AUC в каждую эпоху (у Keras нет метрики AUC по умолчанию. Однако мы можем использовать tf для создания настраиваемой функции оценки для AUC).

Архитектура CNN

Мы построили следующую CNN с 4-мя конвекционными слоями (conv + активация + объединение (необязательно)) и 2 FC (полностью связанные слои) перед тем, как добраться до последнего сигмоидного выходного слоя.

Мы обучили нашу модель для эпох = 100, используя раннюю остановку для предотвращения переобучения. Обучение с использованием моего графического процессора NVIDIA GTX GeForce 1060 с val_auc = 0,8317 заняло менее 10 минут.

Методология извлечения признаков

Теперь, используя предварительно обученную модель, мы можем напрямую применить эти веса к данным, удалив последний сигмоидный / логистический слой (в этой задаче до плотного слоя размерности 100). Мы можем использовать это для любых новых данных той же бизнес-задачи для расчета этих характеристик. Нам нужно просто передать сеть вперед, и она будет напрямую отображать окончательные веса для расчета функций на каком-то промежуточном уровне, без повторного построения сети. Из трансферного обучения. Исходя из нашего требования об отсутствии признаков, мы можем извлекать объекты на любом промежуточном плотном слое с желаемым размером. Для этой проблемы мы извлечем функцию с помощью промежуточной модели до уровня «feature_dense» CNN.

#Preparing Indermediate model-removing last sigmoid layer
intermediate_layer_model = Model(inputs=model.input,outputs=model.get_layer('feature_dense').output)
intermediate_layer_model.summary()

Размер выходного слоя равен 100, поэтому, если мы спрогнозируем использование этой сети для новых данных с тем же входным размером, мы сможем создать 100 новых сложных объектов.

#predict to get featured data
feauture_engg_data = intermediate_layer_model.predict(X)
feauture_engg_data = pd.DataFrame(feauture_engg_data)
print('feauture_engg_data shape:', feauture_engg_data.shape)
feauture_engg_data shape: (30000, 100)
  • Мы успешно зафиксировали 100 сложных взаимодействий между необработанными переменными.

Дальнейшее изучение feauture_engg_data

· Давайте посмотрим, имеют ли эти функции какую-либо ценность. Хотя есть несколько лучших способов, для простоты давайте зафиксируем некоторые двумерные отношения этих новых функций с целевой переменной «платеж по умолчанию в следующем месяце». Хотя для категориальной целевой переменной корреляция не является 100% правильным методом, мы рассчитаем корреляцию всех новых значений с целью как приближение переменных, которые могут быть важны для окончательной модели.

#Sorting correlation values in decsending order
new_corrs = sorted(new_corrs, key = lambda x: abs(x[1]), reverse = True)
#Let's see top 10 correlation values
new_corrs[:10] 
[('PAY_1', 0.32479372847862253),
 ('PAY_2', 0.26355120167216467),
 ('PAY_3', 0.2352525137249163),
 ('feat_78', -0.22173805212223915),
 ('PAY_4', 0.21661363684242424),
 ('PAY_5', 0.20414891387616674),
 ('feat_86', -0.20047655459374053),
 ('feat_6', -0.19189993720885604),
 ('PAY_6', 0.1868663616535449),
 ('feat_3', -0.17394080015462873)]

Мы видим, что 4 вновь созданные переменные (feat_78, feat_86, feat_6, feat_3) находятся в топ-10 с точки зрения корреляции (хотя и псевдо) с «платежом по умолчанию в следующем месяце». Хотя на основании этого ничего конкретного нельзя сказать о предсказательной силе этой переменной, по крайней мере, эти переменные заслуживают дальнейшего исследования.

Мы также можем посмотреть на график KDE (оценка плотности ядра) самых коррелированных переменных с точки зрения абсолютной корреляции величин.

Акцент на CNN для извлечения функций

Теперь критический вопрос заключается в том, почему метод CNN / глубокого обучения используется только для извлечения признаков. Почему бы не использовать его также в качестве классификатора. Есть две основные причины:

Локальный шаблон: данные, которые мы использовали в этой бизнес-задаче (которая применима к большинству сценариев, где мы используем структурные данные), также состоят из поперечных (статических) переменных, в которых мы не найдем никаких местный образец. Таким образом, мы не можем использовать CNN для всех данных в качестве классификатора. Конечно, для данных, которые содержат свойство инвариантности сдвига / трансляции, мы можем использовать CNN в качестве конечного классификатора.

Инфраструктурная проблема. Для создания крупномасштабных промышленных данных и их внедрения в производство требуется значительная инфраструктурная поддержка (графические процессоры, AWS и т. д.), которая может быть недоступна для каждой организации.

Задержка при запуске модели: даже при надлежащей инфраструктуре прямое распространение достаточно сложных моделей глубокого обучения занимает значительно больше времени, чем высокоэффективные классификаторы, такие как XGBoost, RF, SVM и т. д. временного прогнозирования, лучшим решением в этом случае является извлечение функции с помощью автоматизированного метода, такого как извлечение функции CNN, а затем добавление относительно более простого классификатора.

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

Улучшение и дорога вперед:

Как точно сказал современный гуру искусственного интеллекта и глубокого обучения Эндрю Нг: … прикладное машинное обучение - это в основном разработка функций, важность создания значимого пространства функций невозможно переоценить, и методы автоматизированной разработки функций направлены на то, чтобы помочь специалист по данным, занимающийся проблемой создания функций, без труда создавая сотни или тысячи новых функций из необработанных данных. Однако цель состоит не в том, чтобы заменить специалиста по данным. Скорее это позволит ей сосредоточиться на других важных частях конвейера машинного обучения, таких как выбор функций, изучение новой методологии, внедрение надежных моделей в производство и т. Д. Мы только что обсудили один из потенциальных методов автоматизированного проектирования функций. Конечно, есть еще несколько сопоставимых техник. Люблю исследовать их в будущем. Тем временем жаждет услышать другие приложения CNN по структурированным данным (реляционная база данных), в любых других бизнес-задачах.