Вводный урок по написанию машинного обучения на Python

Google машинное обучение Python продукт

Ключевые моменты этой статьи

  • Логистическая регрессия подходит для бинарной классификации, когда существует линейная корреляция между входными переменными и выходной переменной, которую мы пытаемся предсказать, или когда важна способность объяснить модель (например, выделение влияния любой одной входной переменной на результат). предсказание) выбрать.
  • Деревья решений и случайные леса — это нелинейные модели, которые можно хорошо использовать для вычисления более сложных взаимосвязей, но они плохо подходят для понимания человеческого поведения.
  • Важно правильно оценить производительность модели, чтобы убедиться, что ваша модель хорошо работает с данными, которых она раньше не видела.
  • Создание модели машинного обучения включает в себя множество соображений, которые отличаются от тех, что возникают при разработке модели: например, как синхронно вычислять входные данные модели? Какую информацию вам нужно записывать каждый раз, когда вы набираете очки? Как вы определяете производительность вашей модели в производстве?

Машинное обучение является долгосрочной движущей силой многих продуктов, к которым мы прикасаемся каждый день, от интеллектуальных помощников, таких как Siri от Apple и помощников Google, до механизмов рекомендаций Amazon, которые предлагают вам купить новые продукты, до рейтинга рекламы, используемого системой Google и Facebook. Совсем недавно машинное обучение снова привлекло внимание общественности благодаря разработкам в области «глубокого обучения», в том числе победе AlphaGo над южнокорейским мастером го Ли Седолем, а также впечатляющим выпускам новых продуктов в области распознавания изображений и машинного перевода.

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

Эта статья InfoQ: "Введение в машинное обучениечасть серии. Вы можете подписатьсяRSSПолучайте последующие уведомления.

В этой серии будут рассмотрены различные темы и методы, связанные с машинным обучением, возможно, самой обсуждаемой областью технологий и информатики в последние годы. Машинное обучение высокого уровня было описано в некоторых статьях, опубликованных InfoQ (например,Getting a Handle on Data ScienceОдна из серии статейGetting Started with Machine Learning), в этой статье и в следующей статье мы подробно рассмотрим концепции и методы, рассмотренные ранее, выделим конкретные примеры и попробуем выйти в новые области, включая нейронные сети и глубокое обучение.

Мы начнем с этой статьи с «кейса» расширений Python: как мы можем построить модель машинного обучения для обнаружения мошенничества с кредитными картами? (Хотя мы будем использовать язык обнаружения мошенничества, большая часть работы применяется с небольшими изменениями к другим задачам классификации, таким как прогнозирование кликов по рекламным объявлениям.) Со временем мы столкнемся со многими ключевыми идеями машинного обучения и терминологией, включая логистическую регрессию. , деревья решений, случайные леса, кривая истинного положительного и ложного положительного результата, перекрестной проверки и рабочих характеристик приемника (ROC)) и площадь под кривой (площадь Под кривой, называемой кривой AUC).

Цель: Мошенничество с кредитными картами

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

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

Для каждого исторического платежа у нас есть логическое значение, указывающее, является ли транзакция мошеннической (мошеннической), и некоторые другие атрибуты, которые, по нашему мнению, могут указывать на мошенничество, такие как сумма, уплаченная в долларах США (сумма), страна, где была выпущена карта (card_country) и сколько раз эта карта была оплачена нашей компании в один и тот же день (card_use_24h). Поэтому весьма вероятно, что данные, на которых мы строим нашу прогностическую модель, будут выглядеть следующим образом в формате CSV:

__Mon Sep 18 2017 11:17:53 GMT+0800 (CST)____Mon Sep 18 2017 11:17:53 GMT+0800 (CST)__fraudulent,charge_time,amount,card_country,card_use_24h

False,2015-12-31T23:59:59Z,20484,US,0

False,2015-12-31T23:59:59Z,1211,US,0

False,2015-12-31T23:59:59Z,8396,US,1

False,2015-12-31T23:59:59Z,2359,US,0

False,2015-12-31T23:59:59Z,1480,US,3

False,2015-12-31T23:59:59Z,535,US,3

False,2015-12-31T23:59:59Z,1632,US,0

False,2015-12-31T23:59:59Z,10305,US,1

False,2015-12-31T23:59:59Z,2783,US,0__Mon Sep 18 2017 11:17:53 GMT+0800 (CST)____Mon Sep 18 2017 11:17:53 GMT+0800 (CST)__

Есть две важные детали, которые мы пропустим в этом обсуждении, но нам нужно помнить о них, потому что они так же важны, даже более важны, чем вопросы построения модели, которые мы рассмотрели здесь.

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

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

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

логистическая регрессия

Начнем с базовой модели, линейной модели. Найдем коэффициенты a, b, ..., z следующим образом

Для каждого платежа мы подставим значения суммы, card_country и card_use_24h в приведенную выше формулу, и если вероятность больше 0,5, мы «предскажем», что платеж является мошенническим, в противном случае мы предскажем это законно.

Прежде чем мы обсудим, как вычислить a, b, ..., z, нам нужно решить две текущие задачи:

  1. Для вероятности (мошенничества) требуется число от 0 до 1, но число в правой части может быть сколь угодно большим (по абсолютной величине), в зависимости от значения суммы и card_use_24h (если значения этих признаков достаточно велики). и a или b имеют по крайней мере ненулевое значение).
  2. card_country — это не число, оно принимает одно из многих значений (например, US, AU, GB и т. д.). Эти функции называются категориальными и должны быть правильно «закодированы», прежде чем мы сможем обучить модель.

Логит-функция

Чтобы решить проблему (1), вместо того, чтобы строить модель непосредственно по p = Вероятность (мошенничество), мы построим модель логарифмических шансов, называемую мошенником, поэтому наша модель станет

Если событие происходит с вероятностью p, его вероятность равна p/(1 - p), поэтому мы называем левую часть формулы "логарифм шансов" или "логит".

Учитывая значения и характеристики a, b, ..., z, мы можем рассчитать прогнозируемую вероятность мошенничества, обратив формулу, приведенную выше, и получить следующую формулу

Вероятность мошенничества p представляет собой функцию преобразования L=a x сумма + b x использование_карты_24h + …, которая является линейной функцией и выглядит следующим образом:

Независимо от значения линейной функции сигмоида соответствует числу от 0 до 1, что является допустимой вероятностью.

Категориальные переменные

Чтобы решить проблему (2), мы будем использовать категориальную переменную card_country (возьмем 1 из N различных значений) и расширим до N-1 «фиктивных» переменных. Эти новые функции представлены в логическом формате: card_country = AU, card_country = GB и т. д. Нам просто нужен N-1 «фиктивный», потому что значение N обязательно включается, когда все фиктивные значения N-1 ложны. Для простоты предположим, что card_country может использовать только одно из трех значений AU, GB и US. Затем нам нужны две фиктивные переменные для кодирования этого значения, и модель, которую мы хотим подогнать (например, найти значения коэффициентов):

Тип модели называется логистической регрессией.

подходящая модель

Как мы определяем значения a, b, c, d и Z? Начнем со случайного выбора a, b, c, d и Z. Мы можем определить вероятность этого набора догадок как:

То есть возьмите каждую выборку из нашего набора данных и рассчитайте прогнозируемую вероятность мошенничества p при условии, что вы угадаете значения a, b, c, d и Z (собственные значения для каждой выборки), используя:

Для каждой выборки, которая на самом деле мошенническая, мы хотим, чтобы p было относительно близко к 1, а для каждой выборки, которая не является мошеннической, мы хотим, чтобы p было относительно близко к 0 (поэтому 1-p должно быть относительно близко к 1). Поэтому мы берем p-произведение для всех мошеннических образцов и 1-p произведение для всех немошеннических образцов, чтобы получить оценку того, насколько хороши a, b, c, d и Z. Мы хотим сделать функцию правдоподобия как можно большей (например, как можно ближе к 1). Чтобы начать наше предположение, мы итеративно корректируем a, b, c, d и Z, увеличивая вероятность до тех пор, пока не обнаружим, что она больше не может быть усилена коэффициентом возмущения. Распространенным методом оптимизации являетсяСтохастический градиентный спуск.

Реализация Python

Теперь мы воспользуемся стандартными инструментами Python с открытым исходным кодом, чтобы применить на практике принципы, которые мы только что обсудили. Мы будем использовать pandas, который привносит R-подобные фреймы данных в Python, и scikit-learn, популярный пакет машинного обучения. Назовем CSV-файл, описанный ранее, «data.csv», мы можем загрузить данные и посмотреть на код ниже:

Мы можем закодировать card_country как подходящую фиктивную переменную, используя следующий код

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

Прежде чем приступить к обучению модели, у нас есть еще один вопрос для обсуждения. Мы хотим, чтобы наша модель хорошо обобщала, т. е. она должна быть точной при классификации платежей способом, которого мы раньше не видели, а не только теми специальными шаблонами, которые вычисляются во время платежа. Чтобы гарантировать, что переобучение модели на существующих данных не станет шумом, мы разделим данные на два обучающих набора, один будет использоваться для оценки параметров модели (a, b, c, d и Z) и набор проверки ( также называемый тестовым набором), другой набор данных будет использоваться для расчета показателей производительности модели (которые мы рассмотрим в следующей главе). Если модель переобучена, она будет хорошо работать на тренировочном наборе (поскольку она изучит шаблоны в этом наборе), но плохо на проверочном наборе. Существуют и другие способы перекрестной проверки (например, k-кратная перекрестная проверка), но здесь для наших целей подойдет разделение «тест-поезд».

Мы можем легко разделить данные на обучающие и тестовые наборы с помощью sckit следующим образом:

В этом примере мы будем использовать 2/3 данных для обучения модели и 1/3 данных для проверки модели. Теперь мы готовы обучить модель, здесь все просто:

Эта функция подбора запускает процедуру подбора (максимизируя упомянутую выше функцию правдоподобия), а затем мы можем запросить у возвращаемого объекта значения a, b, c, d (при coef_) и Z (при перехвате_). Итак, наша окончательная модель

Оцените производительность модели

После того, как модель обучена, нам нужно определить, насколько хорошо модель предсказывает интересующую переменную (в данном случае логическое значение, указывающее, является ли платеж мошенническим). Напомним, мы говорили, что хотим классифицировать платеж как мошеннический, а если вероятность (мошенничество) больше 0,5, мы хотим классифицировать его как легитимный. Для оценки производительности модели и правила классификации обычно используются две переменные:

  • Ложноположительная ставка: часть всех законных сборов, которая ошибочно классифицируется как мошенническая, и
  • Истинная положительная ставка (также известная как показатель отзыва или чувствительности) — часть всех мошеннических доходов, которая правильно классифицируется как мошенническая.

Есть много способов оценить эффективность классификации, мы зафиксируем эти две переменные.

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

Переменные fpr, tpr и порог содержат данные для всех ROC-кривых, но мы выбираем некоторые целевые выборки: если вероятность (мошенничество) больше 0,514, а доля ложных срабатываний равна 0,374, а доля истинных срабатываний равна 0,681, мы предполагаем что сборы являются мошенническими. Кривая ROC и точки графика, которые мы выбрали:

Модель работает тем лучше, чем ближе она к ROC-кривой (синяя линия вверху), тем ближе она будет к верхней левой границе графика. Обратите внимание, что кривая ROC может сказать вам, насколько хороша модель, которую можно рассчитать, используя число AUC или глядя на площадь под кривой. Чем ближе значение AUC к 1, тем лучше производительность модели.

Конечно, когда вы вводите значение модели в производство и используете его, вам обычно нужно будет предпринять действия для вывода вероятностной модели, как мы сделали выше, то есть сравнить их пороги, и если вероятность (мошенничество)> 0,5 , мы считаем комиссию A мошеннической. Таким образом, для конкретного приложения производительность модели соответствует точке на ROC-кривой, а кривая в целом снова контролирует только компромисс между ложноположительной скоростью и истинной положительной скоростью, например, расположение в пределах диапазона вариантов политики разные.

Деревья решений и случайные леса

Описанная выше модель логистической регрессии является примером модели линейного машинного обучения. Представьте, что каждый пример платежа, который у нас есть, представляет собой точку в пространстве, координаты которой являются собственными значениями. Если бы у нас было только два собственных значения, каждая точка примера была бы точкой на плоскости X-Y. Линейные модели, такие как логистическая регрессия, обычно работают хорошо, если мы можем использовать линейную функцию для отделения выборок, не связанных с мошенничеством, от выборок, связанных с мошенничеством, что означает, что почти все выборки, не связанные с мошенничеством, находятся на одной стороне линии, в то время как почти все выборки, не связанные с мошенничеством, находятся на другой стороне. другую сторону этой линии.

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

Для каждого узла мы сравниваем значение конкретного признака с некоторыми порогами и в зависимости от результата сравнения различаем левый или правый. Мы продолжаем в том же духе (аналогично игре «Двадцать вопросов», хотя число не требует двадцати слоев в глубину), пока не дойдем до листьев деревьев. Листья состоят из всех образцов в нашем обучающем наборе, и сравниваются удовлетворительные пути каждого узла в дереве Мошенническая часть выборки листьев оценивается как мошенническая по вероятности того, что модель сообщает о прогнозе. Когда у нас есть новый образец, который нужно классифицировать, пока он не достигнет листьев, мы генерируем его признаки и начинаем играть в «игру в двадцать вопросов», затем предсказываем вероятность мошенничества, описанную ниже.

Хотя мы не будем вдаваться в подробности того, как генерируется дерево (хотя, вкратце, мы выбираем признаки и пороги для каждого узла, максимизируя прирост информации или понятие дискриминации, коэффициент Джини, показанный на графике выше, и в рекурсии до тех пор, пока не будет достигнут некоторый заранее заданный критерий остановки), обучение модели дерева решений с помощью scikit так же просто, как обучение логистической регрессии (или фактически любой другой модели):

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

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

Продуктивные модели машинного обучения

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

Хотя мы не будем здесь вдаваться в подробности, переход в производство сопряжен с рядом проблем, например, вы можете развертывать модели на Python, но стек производственного программного обеспечения находится на Ruby. Если это так, вам нужно будет преобразовать вашу модель из Python в Ruby в сериализованной форме определенного формата и заставить ваш производственный код Ruby прочитать сериализацию или использовать сервис-ориентированную системную архитектуру для реализации сериализации из Python. Сервисный запрос к Ruby, выберите один из двух.

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

Материальная поддержка

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

об авторе

Michael Manapat (@mlmanapat)Отвечает за ведущую разработку продуктов машинного обучения в Stripe, в том числеStripe Radar. До прихода в Stripe он был инженером в Google, научным сотрудником и преподавателем прикладной математики в Гарвардском университете. Он получил докторскую степень по математике в Массачусетском технологическом институте (MIT).

 

Машинное обучение является долгосрочной движущей силой многих продуктов, к которым мы прикасаемся каждый день, от интеллектуальных помощников, таких как Siri от Apple и помощников Google, до механизмов рекомендаций Amazon, которые предлагают вам купить новые продукты, до рейтинга рекламы, используемого системой Google и Facebook. Совсем недавно машинное обучение стало привлекать внимание общественности благодаря разработкам в области «глубокого обучения», в том числе победе AlphaGo над южнокорейским мастером го Ли Седолем и выпуску впечатляющих новых продуктов в области распознавания изображений и машинного перевода.

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

Посмотреть исходный английский текст:Introduction to Machine Learning with Python


благодарныйзимний дождьОбзор этой статьи.

Чтобы внести свой вклад в китайскую станцию ​​InfoQ или принять участие в работе по переводу контента, отправьте электронное письмо по адресуeditors@cn.infoq.com. Вы также можете использовать Sina Weibo (@InfoQ,@dingxiaoyun), WeChat (идентификатор WeChat:InfoQChina)Подписывайтесь на нас.