Занимать или не брать: как использовать Python и машинное обучение, чтобы решить?

машинное обучение искусственный интеллект Python Безопасность

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

Задача

Поздравляем, вы успешно поступили на стажировку в финансовую компанию.

В свой первый рабочий день вы все еще взволнованы. Затем начальник подозвал вас и показал вам документ.

Содержимое файла такое:

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

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

  • оценка: кредитная оценка
  • sub_grade: Уровень ссудного подразделения
  • short_emp: Краткосрочная занятость в течение одного года
  • emp_length_num: годы работы
  • home_ownership: Статус проживания (в собственности, в залоге, в аренде)
  • dti: кредиты в процентах от дохода
  • цель: цель кредита
  • срок: период кредита
  • last_delinq_none: Есть ли у соискателя кредита плохая репутация
  • last_major_derog_none: Есть ли у соискателя кредита история просроченного погашения более чем на 90 дней.
  • revol_util: Лимит овердрафта в процентах от кредита
  • total_rec_late_fee: Всего просроченных штрафов
  • safe_loans: Безопасен ли кредит?

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

Правило, которое руководитель просит вас найти, может быть выражено деревом решений.

принятие решения

Давайте поговорим о том, что такое дерево решений.

Дерево решений выглядит так:

При принятии решений нужно начинать с верхнего узла. На каждой ветви есть условие суждения. Если условия выполнены, идите налево, если нет, идите направо. Как только край дерева достигнут, решение завершено.

Например, вы идете по улице и встречаете своего соседа Лао Чжана. Ты здороваешься:

«Старый Чжан, ты поел?»

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

Первый случай.

Лао Чжан: Я поел.

Ты: Почему бы тебе не прийти ко мне домой и не съесть еще?

Второй случай.

Лао Чжан: Я еще не ел.

Ты: Тогда иди домой и ешь. Прощай!

...

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

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

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

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

учиться

Что такое машинное обучение?

Когда-то люди «управляли» компьютерами. Как выполнить задачу, полностью известно в сознании людей. Люди посылают компьютеру инструкции, и компьютер несет ответственность за то, чтобы завершить работу по глупости и закончить ее.

Позже выяснилось, что для некоторых задач люди просто не знают, что делать.

В новостях несколько дней назад вы узнали, что Alpha Go и Ke Jie играют в Go. Ке Цзе не только проиграл игру, но и заплакал.

Но действительно ли люди, создавшие Alpha Go, умеют играть в шахматы, чтобы победить Ке Цзе? Вы только что сказали им отказаться от своего спортивного поведения, сохранить свои перья и собрать тряпки, чтобы играть вместе, и играть в шахматы с Кэ Цзе... Как вы думаете, кто плачет?

Как группа людей, которые не могли победить Ке Цзе, даже сами по себе играли в шахматы, создали компьютерную программу, чтобы победить «самый сильный мозг» в человеческом мире го?

Ответ — машинное обучение.

Если вы не знаете, как выполнить задачу самостоятельно, то, естественно, невозможно сказать машине «сделай это на первом шаге, сделай то на втором шаге» или «если есть ситуация А, открой первый совет». ; если возникла ситуация Б, откройте второй мешок".

Ключ к машинному обучению лежит не в человеческом опыте и мудрости, а в данных.

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

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

Машина видит часть данных и видит метку на данных, поэтому у нее есть гипотеза.

Затем вы просите его посмотреть на фрагмент данных, и он подкрепляет или изменяет исходную гипотезу.

Это процесс обучения: построение гипотез — получение обратной связи — проверка гипотез. В этом процессе машина постоянно обновляет свое собственное познание посредством итераций.

Это напоминает мне фрагмент диалога в классическом перекрестном разговоре "Toad Drum".

A: Тогда позвольте мне спросить вас, вы когда-нибудь видели жабу?

B: Кто никогда не видел жабу?

А: Как вы думаете, почему это такое маленькое животное, а звук, который оно издает, такой громкий?

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

А: У корзины для бумаг в моем доме тоже большая горловина и толстая горловина, почему она не кричит?

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

А: Шэн тоже сделан из бамбука, как он звучит?

B: Хотя он сделан из бамбука, но из-за того, что в нем есть отверстия и глаза, те, у кого есть глаза, издают шум.

A: Мое рисовое сито полно дырок, почему оно не может дуть?

Здесь комик Б пытается установить обобщающую гипотезу. К сожалению, A всегда уничтожает три точки зрения B новыми примерами.

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

После этого вы можете использовать модель, чтобы сделать обоснованные суждения.

Теперь давайте начнем. Используйте Python для создания дерева решений, которое поможет нам оценить кредитный риск.

Подготовить

Чтобы использовать Python и связанные с ним пакеты, вам необходимо сначала установить пакет Anaconda. Подробные этапы процесса см.Как сделать облако слов в Python" статья.

Этот файл данных кредита, показанный вам вашим руководителем, доступен по адресуздесьскачать.

Расширение файла - csv, вы можете открыть его в Excel, чтобы увидеть, правильно ли он скачался.

Если все в порядке, переместите его в демо-версию нашего рабочего каталога.

Перейдите в «Терминал» вашей системы (macOS, Linux) или «Командная строка» (Windows), войдите в демо-версию нашего рабочего каталога и выполните следующие команды.

pip install -U PIL

Операционная среда настроена.

В терминале или командной строке введите:

jupyter notebook

Jupyter Notebook уже работает правильно. Теперь мы можем официально написать код.

код

Во-первых, мы создаем новую записную книжку Python 2 под названием «дерево займов».

Чтобы позволить Python эффективно обрабатывать табличные данные, мы используем очень хорошую среду обработки данных Pandas.

import pandas as pd

Затем мы читаем все содержимое в файле credits.csv и сохраняем его в переменной с именем df.

df = pd.read_csv('loans.csv')

Давайте посмотрим на первые несколько строк фрейма данных df, чтобы убедиться, что данные читаются правильно.

df.head()

Поскольку количество столбцов в таблице велико, отображение на экране неполное.Мы перетаскиваем таблицу вправо, чтобы увидеть, правильно ли читаются также крайние правые столбцы таблицы.

Проверено, что все столбцы данных были прочитаны.

Подсчитайте общее количество строк, чтобы увидеть, все ли строки были прочитаны полностью.

df.shape

Результаты приведены ниже:

(46508, 13)

Количество строк и столбцов правильное, и данные читаются правильно.

Вы должны помнить, что последний столбец каждых данныхsafe_loansЭто маркер, который говорит нам, является ли этот предыдущий кредит безопасным. Мы называем этот токен целевым, а все предыдущие столбцы — «признаками». Ничего страшного, если вы не можете вспомнить эти термины сейчас, потому что вы будете сталкиваться с ними снова и снова позже. Естественно, память укрепится.

Далее мы извлечем функции и цели соответственно. Согласно обычаю в области машинного обучения, мы называем функцию X и цель y.

X = df.drop('safe_loans', axis=1)
y = df.safe_loans

Давайте посмотрим на форму данных объекта X:

X.shape

Текущий результат:

(46508, 12)

Присутствуют все строки и столбцы, кроме последнего столбца. В соответствии с нашими ожиданиями. Давайте снова посмотрим на столбец «Цель».

y.shape

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

(46508,)

Здесь нет числа после запятой, а значит есть только 1 столбец.

Давайте посмотрим на первые несколько столбцов X.

X.head()

Текущий результат:

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

Итак, приступим к картографированию:

from sklearn.preprocessing import LabelEncoder
from collections import defaultdict
d = defaultdict(LabelEncoder)
X_trans = X.apply(lambda x: d[x.name].fit_transform(x))
X_trans.head()

Результат запуска таков:

Здесь мы использовали функцию LabelEncoder для успешного преобразования категории в числовое значение. Тест: какое число в столбце оценок соответствует числу B?

Сравните две таблицы и подумайте 10 секунд.

Ответ 1. Вы поняли это правильно?

Далее нам нужно разделить данные на две части, называемые обучающим набором и тестовым набором.

Почему так расстраивает?

Потому что это имеет смысл.

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

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

Чтобы случайным образом разделить данные на обучающий набор и тестовый набор, в Python необходимы только 2 оператора.

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_trans, y, random_state=1)

Давайте посмотрим на форму обучающего набора данных:

X_train.shape

Результаты приведены ниже:

(34881, 12)

Что с тестовым набором?

X_test.shape

Это результат запуска:

(11627, 12)

На этом все работы по подготовке данных готовы. Мы начали вызывать пакет scikit-learn в Python. Была интегрирована модель дерева решений. Нужны всего 3 оператора, которые можно вызывать напрямую, что очень удобно.

from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=3)
clf = clf.fit(X_train, y_train)

Что ж, нужное вам дерево решений сгенерировано.

Это так просто. Волевой, верно?

Но как узнать, как выглядит результирующее дерево решений? Пока не увижу, не поверю!

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

with open("safe-loans.dot", 'w') as f:
     f = tree.export_graphviz(clf,
                              out_file=f,
                              max_depth = 3,
                              impurity = True,
                              feature_names = list(X_train),
                              class_names = ['not safe', 'safe'],
                              rounded = True,
                              filled= True )

from subprocess import check_call
check_call(['dot','-Tpng','safe-loans.dot','-o','safe-loans.png'])

from IPython.display import Image as PImage
from PIL import Image, ImageDraw, ImageFont
img = Image.open("safe-loans.png")
draw = ImageDraw.Draw(img)
img.save('output.png')
PImage("output.png")

Пришло время стать свидетелем чуда:

Вы так же удивлены, как впервые увидели визуализацию дерева решений?

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

контрольная работа

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

Сохрани это. Какая сейчас эпоха, а вы до сих пор так любите декламировать?

В будущем компьютер может автоматизировать решение за вас.

Ты не веришь?

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

test_rec = X_test.iloc[1,:]
clf.predict([test_rec])

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

array([1])

Как упоминалось ранее, 1 означает, что ссуда безопасна. Какова реальная ситуация? Давайте проверим. Возьмите соответствующий токен из целевого набора тестов:

y_test.iloc[1]

оказаться:

1

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

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

from sklearn.metrics import accuracy_score
accuracy_score(y_test, clf.predict(X_test))

Хотя тестовый набор содержит почти 10 000 фрагментов данных, компьютер завершает работу немедленно:

0.61615205986066912

Вы можете быть немного разочарованы - как после долгой работы получить точность более 60%? Только что прошел.

Не расстраивайтесь. Потому что во всем процессе машинного обучения вы используете значение по умолчанию, и нет времени на важную работу — оптимизацию.

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

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

Вы, наконец, избежали несчастья сбежать в первый день стажировки. Кажется, я вижу будущую звезду Уолл-Стрит на подъеме.

Гоу богатый и знатный, не забывайте друг друга.

обсуждать

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

Лайк пожалуйста лайк. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Жилан" (nkwangshyi).

Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.