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

Какая-то ужасная терминология

  • Корневой узел. Самый верхний узел дерева, как показано в оранжевом блоке выше.
  • Листовой узел. Узлы, которые не разделяются дальше, как показано в зеленых блоках. Эти узлы содержат метку класса, определяемую большинством.
  • Внутренний узел. Узлы, которые далее делятся на подузлы, как показано в синих блоках.
  • Разделение: разделение целевых выборок на основе функции, по которой они разделены.

Интуиция дерева решений

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

Итак, у вас было 52 довольных человека и 50 неудовлетворенных. При построении приведенного выше дерева решений вы обнаружили, что люди более удовлетворены, когда у вас есть шоколад в мороженом, и менее удовлетворены, когда у вас нет шоколада в мороженом. Но как насчет тех двух человек, которые остались недовольны даже шоколадным мороженым? Мы можем попытаться увидеть другие переменные для дальнейшего разделения, или мы можем проигнорировать и сказать, что, поскольку большинство удовлетворено, они тоже будут удовлетворены, и присвоить этому узлу метку «Удовлетворено», а другому метку «Не удовлетворено». Это самое простое из возможных деревьев решений, то есть с одним разбиением.

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

pi — вероятность класса для узла. Чем ниже индекс Джини, тем лучше разделение. Затем мы приступаем к поиску разделения для каждого узла и создаем дерево решений.

Типы дерева решений

  • ID3: Итеративный дихотомайзер 3. ID3 в основном используется для задач классификации. Для процесса разделения ID3 использует получение информации, чтобы найти лучшее разделение.
  • CART: деревья классификации и регрессии. В случае с деревьями классификации алгоритм CART использует показатель, называемый индексом Джини, для поиска лучших разбиений. В случае деревьев регрессии алгоритм CART ищет разбиения, которые минимизируют наименьшее квадратичное отклонение (LSD), выбирая разбиения, которые минимизируют результат из всех возможных вариантов.
  • CHAID: автоматическое обнаружение взаимодействий по методу хи-квадрат. CHAID полагается на тесты независимости хи-квадрата, чтобы определить наилучшее разделение на каждом шаге. Он выбирает независимую переменную, которая имеет самое сильное взаимодействие с зависимой переменной.
  • C4.5: C4.5 является преемником ID3 и может обрабатывать как категориальные, так и непрерывные данные. Его можно использовать для построения как деревьев классификации, так и деревьев регрессии. C4.5 использует коэффициент усиления, чтобы найти лучшее разделение. Еще одна возможность C4.5 заключается в том, что он может обрезать DT.
  • MARS: многомерный адаптивный регрессионный сплайн. MARS используется для задач регрессии.

Работа с деревом решений

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

ТемператураВлажностьВетерИграть в теннис?ГорячийВысокийСлабыйНетГорячийВысокийСильныйНетЖаркийВысокийСлабыйДаХолодныйНормальныйСлабыйДаХолодныйНормальныйСильныйНетХолодныйНормальныйСильныйДа

Итак, давайте начнем с расчета индекса Джини для разделения по температуре. Если мы разделим функцию «Температура», мы получим следующее дерево.

Итак, чтобы немного объяснить разделение, когда мы видим столбец температуры, мы видим, что для значения hot у нас есть 1 Да и 2 Нет в Play Tennis, поэтому, когда мы разделяем, мы можем сказать, что если температура высокая, то блок имеет 1 Да и 2 Нет строк из обучающего набора данных. То же самое и для мягкого и холодного. Теперь давайте вычислим индекс Джини листовых узлов.

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

Теперь, когда мы рассчитали индекс Джини для температуры, мы проделаем те же шаги и рассчитаем индекс Джини для влажности и ветра.

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

Примечание. Индекс Джини для чистых листовых узлов равен 0.

Разделение для непрерывного значения

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

Область жилищной ссуды одобрена?2Да1.2Да8.6Нет6Нет12.2Да

Теперь, чтобы сделать разделение на основе Площади дома, мы начнем с сортировки данных и нахождения средней точки между ними. Как только у нас будут средние точки, мы рассчитаем индекс Джини для всех из них и используем тот, у которого наименьший индекс Джини, для условия разделения. Но на чем основывается разделение? Это двоичное разделение, основанное на ‹x, где x — одна из средних точек.

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

Энтропия

Энтропия, проще говоря, – это мера случайности данных.

Получение информации

Прирост информации — это снижение энтропии после разделения.

Коэффициент усиления

Коэффициент усиления - это соотношение прироста информации и разделения информации.

Реализация дерева решений с использованием sklearn

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

#Loading the dataset
from sklearn.datasets import load_iris
cancer = load_iris()
X = cancer.data
Y = cancer.target

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

#Importing train_test_split method
from sklearn.model_selection import train_test_split
#Splitting the train and test data
x_train, x_test, y_train, y_test = train_test_split(X,Y, test_size = 0.3)

Теперь, когда у нас есть данные для обучения и тестирования, давайте создадим наш объект DecisionTreeClassifier и обучим его на данных обучения. Для обучения данных мы используем метод fit(), как всегда. Давай сделаем это.

#importing the DecisionTreeClassifier class
from sklearn.tree import DecisionTreeClassifier
#Loading the data into the model
clf = DecisionTreeClassifier()
clf.fit(x_train, y_train)

Обратите внимание, что если вы хотите решить проблему регрессии с помощью дерева решений, вы можете использовать DecisionTreeRegressor. Теперь давайте проверим, насколько точна модель, найдя показатель точности для тестового набора данных. Для этой модели он оказался равным 0,955, что означает, что около 95,5% прогнозов были правильными.

#Importing accuracy_score method
from sklearn.metrics import accuracy_score
#Calculating the accuracy score
print(accuracy_score(y_test,clf.predict(x_test)))

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

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

#Confusion matrix
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test,clf.predict(x_test)))

Чтение матрицы путаницы — это простой элемент (0,0), который сообщает, сколько выборок было правильно предсказано как класс 0, элемент (1,1) сообщает, сколько выборок было правильно предсказано как класс 1, и так далее. Теперь элемент (0,1) сообщает, сколько выборок было предсказано как класс 0, но на самом деле было классом 1, а элемент (1,0) сообщает, сколько выборок было предсказано как класс 1, но на самом деле было классом 0. Если цель имеет n классов, то матрица путаницы будет иметь вид n*n.

Преимущества алгоритма дерева решений

  1. Не требует масштабирования или нормализации данных.
  2. Модель очень интуитивно понятна и проста в объяснении.
  3. Не влияет на пропущенные значения.

Недостатки Алгоритм дерева решений

  1. Небольшое изменение данных может привести к большому изменению структуры дерева решений, вызывая нестабильность.
  2. Вычислительно дорого.
  3. Поиск лучшего дерева — задача NP-Hard.
  4. Очень склонен к переоснащению.