Сценарист: Лука Брклячич

Оглавление

  1. Введение
  2. Дерево решений
    а. Деревья классификации
    б. Деревья регрессии
  3. Примеры Python
    а. Деревья классификации
    б. Деревья регрессии

Введение

Добро пожаловать в третье издание нашего обзора машинного обучения! В этом посте мы углубимся в механизмы машинного обучения, подробно изучив деревья решений. Чтобы получить полную картину, обязательно сначала ознакомьтесь с Часть 1 и Часть 2.

Если в какой-то момент вы обнаружите, что перегружены, но хотите продолжать учиться, я настоятельно рекомендую проверить этот замечательный плейлист на YouTube о машинном обучении от StatQuest!

Деревья решений

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

Деревья классификации

Как правило, деревья классификации предсказывают некоторый результат, выполняя следующие действия:

  1. Делать заявление
  2. Примите решение, основываясь на том, верно это утверждение или нет.
  3. Повторяйте до нижней части дерева.

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

  • Размер (кв. фут)
  • Соседство («Плохое», «Хорошее», «Отличное»)
  • Цена ($)

Ваши требования:

  • Размер ≥ 2000 кв. футов
  • Соседство!= «Плохое»
  • Цена≤ 300 000 долларов США.

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

  • Начальный узел называется Корневой узел (стрелки указывают только от него).
  • Остальные серые узлы называются Ветви (стрелки указывают туда и обратно).
  • Красные и зеленые узлы называются конечными узлами (стрелки указывают только на них).

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

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

Примесь Джини листьев = 1 — Вероятность («Высокая»)² — Вероятность («Низкая»)²

Общее количество примесей Джини = средневзвешенное значение (примеси Джини листьев)

Для нашей категориальной переменной Тип расчет показателя Всего примесей Джини довольно прост. Начнем с создания Type нашего корневого узла. Затем мы вычисляем количество вхождений для каждого конечного узла и получаем оценку Gini Impurity для каждого листа. Наконец, мы берем средневзвешенное значение двух оценок Примеси Джини для листьев, чтобы получить Общую оценку примесей Джини для переменной Тип.

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

Теперь мы вычисляем примесь Джини, используя каждое из этих средних значений в качестве корневого узла и следуя той же процедуре, что и с категориальными переменными. Мы делаем это до тех пор, пока не получим значение Total Gini Impurity для каждого среднего значения выше. Как только мы получим все эти значения, самое низкое из них будет сохранено как Общая примесь Джини для столбца Размер в целом.

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

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

Деревья регрессии

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

Деревья регрессии, как и их аналог классификации, предсказывают некоторый результат, выполняя следующие действия:

  1. Заявление
  2. Принятие решения на основе значения в заявлении
  3. Повторяем до нижней части дерева

Пример: Вернемся к нашему примеру с покупкой дома, приведенному выше. В этом примере вы хотите купить свой первый дом и у вас есть следующие данные:

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

Затем нам нужно решить, какая из трех независимых переменных (Тип, Размер, Возраст) должна служить нашим Корневым узлом. Для этого мы вычисляем сумму квадратов остатков (SSR) для каждой переменной и наносим ее на график относительно каждой независимой переменной. Для иллюстрации начнем с Размер:

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

Листовые узлы будут представлять собой среднее значение Price с каждой стороны нашей линии.

Нанеся эти значения на нашу диаграмму рассеяния, мы можем визуализировать качество использования Size ‹ 1315 в качестве нашего корневого узла:

Однако, чтобы лучше понять, насколько хорош корневой узел, мы можем рассчитать его SSR, взяв разницу между каждой точкой и зеленой пунктирной линией, возведя в квадрат его, а затем сложить все эти значения вместе. Когда мы это делаем, мы получаем SSR 235 988 888 889 для этого выбора корневого узла. Наконец, мы наносим это значение на диаграмму рассеяния в зависимости от значения Размер, используемого в качестве критерия Корневой узел:

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

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

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

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

Примеры Python

Дерева решений

Набор данных: База данных о диабете индейцев пима (информационная страница здесь)

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

# Load all libraries
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split 
from sklearn import metrics
# Load the dataset
diabetes = pd.read_csv("/diabetes.csv")

diabetes = diabetes.dropna()

Наша цель с этим набором данных — создать модель, способную точно предсказать, есть ли у пациента диабет. Начнем с определения наших независимых (x) и зависимых (y) переменных.

# Define the independent and dependent variables
independent_cols = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
x = diabetes[independent_cols] # Independent Variables
y = diabetes['Outcome'] # Dependent Variables

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

# Split the dataset into training and testing sets
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1) # 70% training and 30% test

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

# Create the Decision Tree Regressor object
classifier = DecisionTreeClassifier()

# Train the classifer
classifier = classifier.fit(x_train, y_train)

# Predict the response for test dataset
y_pred = classifier.predict(x_test)

Теперь, когда у нас есть модель, мы можем:

  • Изучите результаты визуально, построив дерево решений. Обратите внимание, что это конкретное дерево довольно большое, поэтому было бы сложно интерпретировать результаты по одному изображению.
from sklearn import tree
from matplotlib.pyplot import figure

figure(figsize = (30, 10), dpi = 100)
tree.plot_tree(classifier)

  • Оцените точность модели
# Evaluate the model
print(f"Accuracy: {round(metrics.accuracy_score(y_test, y_pred), 4)*100}%")

Деревья регрессии

Датасет: Ожидаемая продолжительность жизни (ВОЗ) (информационная страница здесь)

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

# Load all libraries
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split 
from sklearn import metrics
# Read in a subset of the data
cols_of_interest = ['Alcohol', 'infant deaths', 'BMI', 'Total expenditure', 'GDP', 'Population', 'Schooling', 'Life expectancy']

data = pd.read_csv("/Life Expectancy Data.csv", usecols = cols_of_interest)

data = data.dropna()

Наша цель с этим набором данных — создать модель, способную точно предсказать ожидаемую продолжительность жизни в стране. Как и раньше, мы начинаем с определения наших независимых (x) и зависимых (y) переменных.

# Define the independent and dependent variables
independent_cols = ['Alcohol', 'infant deaths', 'BMI', 'Total expenditure', 'GDP', 'Population', 'Schooling']
x = data[independent_cols] # Independent Variables
y = data['Life expectancy'] # Dependent Variables

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

# Split the dataset into training and testing sets
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 1) # 70% training and 30% test

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

# Create the Decision Tree Regressor object
classifier = DecisionTreeRegressor()

# Train the classifer
classifier = classifier.fit(x_train, y_train)

# Predict the response for test dataset
y_pred = classifier.predict(x_test)

Теперь, когда у нас есть модель, мы можем:

  • Изучите результаты визуально, построив дерево решений. Обратите внимание, что это конкретное дерево довольно большое, поэтому было бы сложно интерпретировать результаты по одному изображению.
from sklearn import tree
from matplotlib.pyplot import figure

figure(figsize = (30, 10), dpi = 100)
tree.plot_tree(classifier)

  • Оцените точность модели
# Evaluate the model
print(f"MAPE: {round(metrics.mean_absolute_percentage_error(y_test, y_pred), 4)}")

print(f"R2: {round(metrics.r2_score(y_test, y_pred), 3)}")

Последние мысли

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

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

Ресурсы и дополнительная литература

99P DevPortal: https://developer.99plabs.io/home/

Помимо алгоритмов: https://www.routledge.com/Beyond-Algorithms-Delivering-AI-for-Business/Luke-Porter-Santhanam/p/book/9780367613266

Статквест: https://statquest.org/

3Blue1Brown: https://www.3blue1brown.com/#lessons

Электронная книга Введение в статистическое обучение: https://hastie.su.domains/ISLR2/ISLRv2_website.pdf

Электронная книга Элементы статистического обучения: https://hastie.su.domains/Papers/ESLII.pdf

Электронная книга Computer Age Statistical Inference: https://hastie.su.domains/CASI_files/PDF/casi.pdf