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

Затем эти модели объединяются для получения окончательного результата. Это очень похоже на то, как вы ищете голоса своих друзей для какого-то решения, которое вы можете принять. БОЛЬШЕ ГОЛОВОК, БОЛЬШЕ ИДЕЙ И ЛУЧШИХ РЕЗУЛЬТАТОВ — основная идея этих моделей.

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

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

Модели ансамбля можно понять по картинке ниже:

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

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

  • ЗАГРУЗКА. Самозагрузка означает выбор образцов из данных с заменой. Каждая выбранная выборка называется BAG, а наблюдения, не входящие в состав BAG, называются выборками OUT OF BAG.
  • ГИПЕРПАРАМЕТРЫ. Гиперпараметры, связанные со случайным лесом:
  • Количество деревьев решений
  • Количество записей/функций для выборки
  • Критерии глубины и поиска (аналогично деревьям классификации — Джини/Энтропия)
  • ВЫБОР ФУНКЦИЙ. В отличие от начальной загрузки (где функции выбираются с заменой), выбор функций в Random Forest выполняется без замены. Это означает, что если одна из подмоделей получила определенный набор функций, скажем, расчетный счет, то следующие подмодели не получат расчетный счет как функцию.
  • ПАРАМЕТРЫ: здесь мы используем несколько функций, и есть несколько параметров (обязательных аргументов), которые принимают эти функции, я расскажу о некоторых из них:
  1. train_test_split — принимает кадры данных (X и Y) и нужное вам разделение в %
  2. RandomForestClassifier — принимает кадры данных (поезд X и поезд Y)
  3. RandomForestClassifier — использует кадр данных (тест X) для прогнозирования значений прогноза, которые можно сравнить со значениями поезда Y.

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

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

Реализация случайного леса

Мы будем использовать данные German Credit Score для построения нашей модели Random Forest, вы можете увидеть описание модели:

['checkin_acc',
 'duration',
 'credit_history',
 'amount',
 'savings_acc',
 'present_emp_since',
 'inst_rate',
 'personal_status',
 'residing_since',
 'age',
 'inst_plans',
 'num_credits',
 'job']

Прежде чем мы начнем реализацию классификатора, давайте разберемся с параметрами, которые необходимы для создания модели. RandomForestClassifier доступен в библиотеке sklearn.ensemble и принимает следующие параметры:

  1. n_estimators (Integer): количество деревьев в лесу (по сути, это наши подмодели)
  2. критерий (строка): это критерии для измерения точности разделения (джини или энтропия), чтобы прочитать о них вы можете прочитать здесь (вставить ссылку)
  3. max_features (Integer/ Float/ String): количество функций, которые будут использоваться для каждого дерева (подмоделей).
  • Авто/Нет: все функции используются для отдельных деревьев.
  • sqrt: возьмет квадратный корень из числа объектов, доступных в данных.
  • float: примет % от количества функций в данных.

Оценка модели

Теперь мы оценим модель random forest, мы будем использовать параметр predict_proba классификатора случайного леса, чтобы проверить точность модели при тестовом прогнозировании.

predict_proba дает результат в виде пары, если вы обратите внимание, что общая сумма каждой строки равна 1. Каждое из чисел в таблице вероятностей дает вероятность получения 0 и 1 соответственно.

Например, в первой строке мы видим, что вероятность получения 0 равна 0,853859, а 1 — 0,146141. Теперь первая запись будет отнесена к категории 0, если вероятность 0 больше 0,5.

Значение отсечения по умолчанию для классификатора «RandomForest» равно 0,5. Давайте посмотрим, как выглядит наш фрейм данных predict_proba.

pd.DataFrame(rforest_clf.predict_proba(test_X)).head()

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

Как и в случае с нашей моделью логистической регрессии ЧИТАЙТЕ ЗДЕСЬ, наша модель предсказывает 0 с довольно хорошей точностью, мы можем использовать такие показатели, как индекс Youlden's и т. д., для дальнейшего улучшения модели. Мы также можем посмотреть такие показатели, как Precision и Recall, используя classification_report.

print(metrics.classification_report(predicted_dataframe.Actual,predicted_dataframe.Predicted_Classification))
precision    recall  f1-score   support

           0       0.76      0.88      0.82       214
           1       0.51      0.30      0.38        86

    accuracy                           0.72       300
   macro avg       0.63      0.59      0.60       300
weighted avg       0.69      0.72      0.69       300

Мы видим, что есть хороший прогноз по прогнозированию «Хороший кредит». Однако мы хотели бы улучшить предсказание для 1. Мы бы попробовали пару вещей:

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

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

Поскольку мы знаем, что предел отсечки по умолчанию равен 0,5, мы можем видеть, что при ~0,4 модель, по-видимому, имеет максимальное усиление, и поэтому отсечка должна быть на уровне 0,4. Давайте посмотрим на график точного отзыва, чтобы лучше понять это.

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

precision    recall  f1-score   support

           0       0.86      0.42      0.56       214
           1       0.36      0.83      0.50        86

    accuracy                           0.53       300
   macro avg       0.61      0.62      0.53       300
weighted avg       0.71      0.53      0.54       300

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

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

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

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

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

Это можно понять по приведенной ниже схеме.

Поиск оптимальных параметров в сетке:

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

ПРИМЕЧАНИЕ. Вероятность по умолчанию для вычислений по-прежнему будет равна 0,5 с гипернастроенным параметром. Мы можем дополнительно оптимизировать модель, изменив наш cut-off

Мы будем оптимизировать следующие параметры:

  1. Максимальная глубина дерева — 5,10,15,20,30
  2. n_оценщиков — 5,10,15,20,30
  3. max_features — sqrt или 0,2

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

print(clf.best_score_)
print(clf.best_params_)

0.7747096372542235
{'max_depth': 30, 'max_features': 'sqrt', 'n_estimators': 30}

Как мы видим, лучшая оценка AUC из выбранных параметров составляет 0,77, а лучшими параметрами являются:

  • макс_глубина: 30
  • max_features: кврт
  • n_оценщиков: 30

Поэтому мы закончили с настройкой гиперпараметров.

Кривая ROC указывает на то, что нам, возможно, придется разделить на 0,4. Мы попытаемся построить график точности и порога, чтобы лучше понять.

Точность отзыва указывает на 0,4 в качестве разделения. Мы будем использовать ту же отсечку для разделения.

print(metrics.classification_report(predicted_dataframe.Actual, predicted_dataframe.Predicted_Classification))
precision    recall  f1-score   support

           0       0.77      0.90      0.83       214
           1       0.57      0.33      0.41        86

    accuracy                           0.74       300
   macro avg       0.67      0.61      0.62       300
weighted avg       0.71      0.74      0.71       300
pd.crosstab(predicted_dataframe.Actual, predicted_dataframe.Predicted_Classification, 
             normalize = False,margins= True)

Наша точность по 1 классификации низкая, поэтому мы можем улучшить вероятность 0, еще больше увеличив балл классификации. Давайте попробуем с 0,2 и посмотрим на точность и полноту.

predicted_dataframe.Predicted_Classification = predicted_dataframe['Predicted_Probability'].map(lambda x: 1
                                                                                                if x > 0.2 else 0)
print(metrics.classification_report(predicted_dataframe.Actual, predicted_dataframe.Predicted_Classification))
precision    recall  f1-score   support

           0       0.89      0.51      0.65       214
           1       0.41      0.85      0.55        86

    accuracy                           0.61       300
   macro avg       0.65      0.68      0.60       300
weighted avg       0.75      0.61      0.62       300
pd.crosstab(predicted_dataframe.Actual, predicted_dataframe.Predicted_Classification, 
             normalize = False,margins= True)

We can see that we have improved the accuracy of bad-credit significantly, there is some loss in terms of predicting good-credit. However, this model performs pretty well against the normal logistic regression model.

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



Подбор лучших параметров

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

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

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