Давайте временно обновим эту серию статей о машинном обучении вручную. В настоящее время завершена поддержка векторной машины SVM, дерева решений, KNN, байесовской, линейной регрессии и логистической регрессии. Для других алгоритмов, пожалуйста, позвольте Taoye отдать должное здесь сначала Позже будет время наверстать упущенное.
Это обновление также получило положительные отзывы от некоторых читателей. Хотя это не так много, я очень благодарен за вашу поддержку, и я надеюсь, что каждый читатель, прочитавший его, сможет что-то почерпнуть.
Все содержание этой серии статей написано Таойе исключительно от руки.Также есть отсылки ко многим книгам и общедоступным ресурсам.Общее количество слов в серии около 15W (включая исходный код), которые будут заполнены позже.Подробнее технические статьи могут посетить общественность Taoye.Циничный кодер. Документ можно распространять свободно, но будьте осторожны, не изменяйте его содержание.
Если в статье есть какие-либо вопросы, которые вы не понимаете, вы можете задать их напрямую, и Taoye ответит, как только они ее увидят.В то же время каждый может прийти сюда, чтобы напомнить Taoye в частном порядке:Циничный кодер, в официальном аккаунте также есть личная контактная информация Таое. Несколько слов, Таойе может говорить с тобой тайно только там (#`О')
Чтобы улучшить опыт чтения для всех, серия статей Taoye по машинному обучению была организована в видеPDF и HTML, эффект чтения очень хороший,Ответьте на [666] под официальным аккаунтом [Cynical Coder], чтобы получить его бесплатно.
Мы уже подробно объясняли предварительный процесс оптимизации линейных SVM и SMO, подробнее см.
- «Машинное обучение в действии» — анализ машин опорных векторов и оптимизация SMO
- «Машинное обучение в действии» — анализ машин опорных векторов, разрыв линейного SVM одной рукой
Что касается содержания нелинейности SVM, мы оставим его на следующую неделю.
В этой статье рассмотрим содержание дерева решений, по сравнению с SVM дерево решений намного проще и не имеет особо сложных формул. Дерево решений, которое я понимаю, представляет собой просто модель с древовидной структурой, обученную на основе существующего набора данных, чтобы мы могли делать прогнозы на основе данных, результаты классификации которых нам неизвестны, на основе модели. ** Простое дерево решений чем-то похоже на бинарное дерево сортировки, которое мы использовали, когда изучали структуры данных. Конечно, в дополнение к классификации деревья решений также могут выполнять регрессию.Главное обсуждение здесь - проблема классификации.
Что касается содержания, связанного с деревьями решений, можно представить две статьи. Первая в основном предназначена для объяснения базовых знаний о дереве решений и процессе обучения его принятию решений, то есть в нашей статье, которая фокусируется на теории и выводах, а также на понимании. Основное содержание второй статьи - фактический кодовый бой дерева решений, а фактический кодовый бой выполняется на основе знакомства с теоретической основой, поэтому необходимо понимать теоретические знания, связанные с деревом решений. Если возможно, будет третья статья, в основном об операции обрезки Гуань Юя для предотвращения переобучения деревьев решений.
1. Что такое дерево решений
Что касается определения дерева решений, Ли Ханг - «Статистические методы обучения» (второе издание) описывает его следующим образом:
Модель дерева решений классификации представляет собой древовидную структуру, описывающую классификацию экземпляров.Дерево решений состоит из узлов и направленных ребер. Существует два типа узлов:внутренний узел(внутренний узел) илистовой узел(листовой узел). Внутренние узлы представляют функцию или атрибут, а конечные узлы представляют класс.
Вышеупомянутые внутренние узлы можно понимать как атрибуты образцов, конечные узлы можно понимать как метки образцов, а направленные ребра можно понимать как результаты различных атрибутов. Как правило, когда мы рисуем дерево решений, внутренние узлы представляются в виде прямоугольников или прямоугольников, а листовые узлы представляются в виде кругов или эллипсов. (Примечание: Это не является абсолютным. В разных материалах могут быть разные способы представления. Например, в книге "Статистические методы обучения" для представления внутренних узлов используются кружки, а для представления листовых узлов - квадраты. В книге " Практика машинного обучения» представляет собой полную противоположность)
Скучное текстовое описание всегда будет снижать желание читателя читать, поэтому проиллюстрируем его практическим примером, чтобы закрепить понимание читателем дерева решений.
Например, при описании красоты и безобразия девушек обычно используется несколько индикаторов Этот пример кажется немного опасным, поэтому давайте его изменим.
Источник примера: Ли Ханг - «Статистические методы обучения» (второе издание)
Например, если у нас закончились деньги и мы хотим пойти в банк за кредитом, банк решит, давать вам деньги взаймы или нет, исходя из ваших личных характеристик. Предположим, что здесь есть четыре характеристики-атрибуты, а именно: возраст, возможность работать, иметь ли дом и статус кредитоспособности.Эти характеристики-атрибуты эквивалентнывнутренний узел, метка (результат), эквивалентна ли выплаталистовой узел, а результаты различных признаков атрибутов представляют собой направленные границы, такие как молодой, средний и пожилой возраст, хороший, средний и очень хороший кредитный статус и т. д., представляют различные направленные границы.
В связи с этим мы можем по собственным ощущениямрисовать вручнуюПростая модель дерева решений:
Мы знаем, что приведенное выше дерево решений реализуется нами только вручную и может не применяться для решения практических задач. Задача дерева решений состоит в том, чтобы получить такую древовидную модель на основе существующего набора выборок данных, чтобы предсказать категорию данных неизвестной классификации. В связи с этим мы хотим получить такоймаксимально идеальнодерево решений, вы должны рассмотреть следующие вопросы:
- В каком порядке должны выбираться показатели (атрибуты) дерева решений? Какая функция должна быть приоритетной?
- Если в построенном дереве решений есть проблема переобучения, то это значит, что наше обучение неплохое, но когда мы его тестируем, это ГГ, как нам решить ее в этот раз?
В данной работе основное содержание составляет приоритетный выбор атрибутивных признаков.
Выбор атрибутов
Для выбора атрибутивных функций мы должны предпочтительно выбирать функции с очевидной способностью классификации для набора обучающих данных, что может повысить эффективность обучения нашего дерева решений. Если результат классификации признака атрибута в основном такой же, как и при случайной классификации, то мы можем сказать, что этот признак атрибута в основном не имеет возможности классификации.
Например, здесь у нас есть 12 выборок данных о красоте и некрасивости девушек, шесть из них некрасивые, остальные шесть красивые, три из шести некрасивых девушек ростом 165 см, три 185 см и остальные шесть красивые. верно для роста.В этом случае мы в принципе не имеем возможности классифицировать красоту девушек только по росту. (Просто пример, никакого мнения)
Итак, в идеале генерация нашего дерева решений должна выглядеть так:По мере продолжения процесса принятия решений мы надеемся, что образцы, содержащиеся в узлах ветвления дерева решений, максимально принадлежат к одной категории (с одной и той же меткой), то есть "чистота" узлов становится все больше и больше. выше и выше.
Следовательно, ключевая технология ** дерева решений заключается в выборе атрибутивных признаков. **Для выбора атрибутивных признаков у нас обычно есть три критерия:Прирост информации, коэффициент прироста информации (коэффициент усиления) и индекс Джини.
2.1 Получение информации
Концентрация выборки указана выше.Например у меня здесь 10 девушек,и 10 из них красивые женщины,значит концентрация выборки в это время высокая.Если красивых и некрасивых женщин пять-пять баллов,то концентрация в это время относительно низкая. Вот что здесь означает «концентрация».Он в основном нацелен на ярлыки (результаты)..
Наиболее часто используемым показателем «концентрации» выборки является «информационная энтропия».. Предположим, что текущий набор образцовБкласс (всегокласс) образецСоотношение**, то образецИнформационная энтропия это:
С помощью приведенной выше формулы мы можем узнать, что информационная энтропия 10 красавиц (одна категория) равна
Информационная энтропия красавиц и некрасивых женщин составляет пять-пять баллов (два типа):
Благодаря простому расчету информационной энтропии, приведенному выше, мы можем узнать, чтоЧем меньше значение информационной энтропии, тем выше чистота.
Теперь, когда мы поняли формулу расчета прироста информации и ее значение, как нам использовать код для ее расчета для набора выборок данных? Давай попробуем.
Образец данных, использованный на этот раз, взят из Li Hang - "Statistical Learning Methods" (Second Edition) Данные о заявках на получение кредита, а именно:
Итак, теперь давайте посчитаем информационную энтропию этого набора данных в кодовой форме:
Сначала создайтеestablish_data
метод создания двумерного массива для хранения соответствующей информации из приведенного выше набора выборок данных (для значений 0, 1, 2 и т. д. для функций атрибута вы можете обратиться к приведенной выше таблице, чтобы проверить число , и я не буду здесь слишком много объяснять):
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:创建训数据集
"""
def establish_data():
data = [[0, 0, 0, 0, 'N'], # 样本数据集相关信息,前面几项代表属性特征,最后一项表示是否放款
[0, 0, 0, 1, 'N'],
[0, 1, 0, 1, 'Y'],
[0, 1, 1, 0, 'Y'],
[0, 0, 0, 0, 'N'],
[1, 0, 0, 0, 'N'],
[1, 0, 0, 1, 'N'],
[1, 1, 1, 1, 'Y'],
[1, 0, 1, 2, 'Y'],
[1, 0, 1, 2, 'Y'],
[2, 0, 1, 2, 'Y'],
[2, 0, 1, 1, 'Y'],
[2, 1, 0, 1, 'Y'],
[2, 1, 0, 2, 'Y'],
[2, 0, 0, 0, 'N']]
return np.array(data)
Затем мы создаемcalc_information_entropy
Метод используется для расчета информационной энтропии, а код процесса расчета можно рассматривать в сочетании с приведенной выше формулой. Кроме того, необходимо сказать, что для облегчения классификации результатов кредита мы используемpandas
пакет обрабатывается, оpandas
Для использования вы можете обратиться к документу, и Taoye сделает копию позже. Конечно же нетpandas
Модули также могут реализовать эту функцию, а заинтересованные читатели могут попробовать это сами, и это несложно.calc_information_entropy
Конкретный код выглядит следующим образом:
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算信息熵
"""
def calc_information_entropy(data):
data_number, _ = data.shape
information_entropy = 0
for item in pd.DataFrame(data).groupby(_ - 1):
print(item[1])
proportion = item[1].shape[0] / data_number
information_entropy += - proportion * np.log2(proportion)
return information_entropy
Давайте запустим приведенный выше код, чтобы увидеть конкретные результаты информационной энтропии:
По сравнению со всеми, каждый понимает понятие информационной энтропии и может вручную вычислить информационную энтропию выборки.Теперь давайте выдвинем информационный прирост.
Предположим, атрибутивная функцияимеютвозможные значения, если использоватьк набору образцовразделить, чтобыузлы ответвления, гдеузлы ветвления содержатвсе в свойствахВерхнее значениеобразец, обозначаемый как. Таким образом, атрибутивные признаки могут быть рассчитаны с использованиемдля набора образцов**«Информационный прирост»**, полученный подразделением, составляет:
Выше приведено описание получения информации Чжоу Чжихуа в книге «Машинное обучение».
Скучное текстовое описание всегда будет снижать желание читателя читать.Вышеуказанные символы также слишком много.Мы могли бы также взять приведенные выше данные кредита, чтобы лучше понять содержание вышеуказанной информации:
Давайте возьмем только признак возраста, чтобы рассчитать его информационный прирост, Он имеет три возможных значения молодости, среднего возраста и старости, то есть выше,, а выборка данныхДля приведенных выше 15 выборок данных, поскольку существует три возможных значения возраста, в это время будут сгенерированы три ветви, а именно. Мы рассчитали ранее, теперь нам просто нужно вычислить последний членЗначение, соответствующее признаку атрибута, может быть полученополучение информации:
С помощью данных мы наблюдали следующую информацию:
- Для атрибута, характерного для возраста, есть 5 юность, средний возраст и старость.
- Среди 5 молодых людей 2 разрешили кредиты и 3 нет; среди среднего возраста 3 разрешили кредиты, 2 не разрешили кредиты; среди пенсионеров 4 разрешили кредиты и 1 не разрешили кредиты.
Для этого мы можем рассчитать:
В связи с этим информационный прирост, соответствующий атрибутивному признаку возраста, в нашем расчете составляет:
Мы можем понять содержание последнего термина как условную вероятность. Кроме того,Чем больше прирост информации, тем сильнее классификационная способность соответствующего признака атрибута, то есть признака, который мы должны выбрать первым.
Таким же образом мы можем рассчитать прирост информации, соответствующий атрибутам работы, дома и кредита:
Когда мы сравниваем значения прироста информации атрибутов старшего брата, мы можем обнаружить, чтоНаиболее характерной чертой этого объекта является дом., так что это должно быть нашей предпочтительной функцией атрибута.
Зная расчет прироста информации и его значение, посчитаем его через код (значение кода см. в комментариях):
import numpy as np
import pandas as pd
np.__version__
pd.__version__
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:创建训数据集
"""
def establish_data():
data = [[0, 0, 0, 0, 'N'], # 样本数据集相关信息,前面几项代表属性特征,最后一项表示是否放款
[0, 0, 0, 1, 'N'],
[0, 1, 0, 1, 'Y'],
[0, 1, 1, 0, 'Y'],
[0, 0, 0, 0, 'N'],
[1, 0, 0, 0, 'N'],
[1, 0, 0, 1, 'N'],
[1, 1, 1, 1, 'Y'],
[1, 0, 1, 2, 'Y'],
[1, 0, 1, 2, 'Y'],
[2, 0, 1, 2, 'Y'],
[2, 0, 1, 1, 'Y'],
[2, 1, 0, 1, 'Y'],
[2, 1, 0, 2, 'Y'],
[2, 0, 0, 0, 'N']]
return np.array(data)
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算信息熵
"""
def calc_information_entropy(data):
data_number, _ = data.shape
information_entropy = 0
for item in pd.DataFrame(data).groupby(_ - 1):
proportion = item[1].shape[0] / data_number
information_entropy += - proportion * np.log2(proportion)
return information_entropy
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:找出对应属性特征值的样本,比如找出所有年纪为青年的样本数据集
"""
def handle_data(data, axis, value):
result_data = list()
for item in data:
if item[axis] == value: result_data.append(item)
return result_data
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算最大的信息增益,并输出其所对应的特征索引
"""
def calc_information_gain(data):
feature_number = data.shape[1] - 1 # 属性特征的数量
base_entropy = calc_information_entropy(data) # 计算总体数据集的信息熵
max_information_gain, best_feature = 0.0, -1 # 初始化最大信息增益和对应的特征索引
for index in range(feature_number):
feat_list = [item[index] for item in data]
feat_set = set(feat_list)
new_entropy = 0.0
for set_item in feat_set: # 计算属性特征划分后的信息增益
sub_data = handle_data(data, index, set_item)
proportion = len(sub_data) / float(data.shape[0]) # 计算子集的比例
new_entropy += proportion * calc_information_entropy(np.array(sub_data))
temp_information_gain = base_entropy - new_entropy # 计算信息增益
print("第%d个属性特征所对应的的增益为%.3f" % (index + 1, temp_information_gain)) # 输出每个特征的信息增益
if (temp_information_gain > max_information_gain):
max_information_gain, best_feature = temp_information_gain, index # 更新信息增益,确定的最大的信息增益对应的索引
return best_feature
if __name__ == "__main__":
data = establish_data()
print("属性特征对应的最大的信息增益对应的索引为:%d" % calc_information_gain(data))
Запустив приведенный выше код, вы можете увидеть прирост информации для каждого атрибута выходных данных и индекс функции, соответствующий максимальному приросту информации:
Можно обнаружить, что это то же самое, что и наш ручной расчет, поэтому в настоящее время мы должны предпочтительно выбрать атрибут с индексом 2 в качестве критерия принятия решения, то есть дом.
2.2 Коэффициент усиления информации (коэффициент усиления)
Когда мы используем прирост информации в качестве индикатора выбора признаков, возникает проблема смещения выбора признаков с большим количеством значений.
Например, мы используем идентификатор в качестве атрибута классификации приведенного выше набора данных.С помощью вычислений мы можем обнаружить, что прирост информации является самым большим, но на самом деле идентификатор не имеет никакой способности классификации для категории, поэтому дерево решений полученный таким образом, не обладает способностью к обобщению и не может быть использован для новой выборки для эффективных прогнозов.
Чтобы решить эту проблему прироста информации, введем понятие коэффициента прироста информации (коэффициента усиления).Знаменитый алгоритм C4.5 использует «коэффициент усиления» в качестве оптимального атрибута деления. Коэффициент усиления определяется как:
называется«Внутренняя ценность» . как правилоЧем больше значений, тем большебудет больше. один из нихНапример, упомянутый выше возраст имеет три значения: молодой, средний и старый.
Для приведенного выше набора кредитных данных существует три типа кредитных условий: средние, хорошие и очень хорошие, и соотношение делится на. Стингер, мы можем рассчитать «внутреннюю стоимость» кредитного профиля:
Таким образом, для атрибута кредита скорость прироста равна:
Точно так же мы можем рассчитать коэффициент усиления других функций атрибута:
Конкретный код для расчета коэффициента усиления может называться следующим образом:
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算增益率
"""
def calc_gain_ratio(data):
feature_number = data.shape[1] - 1 # 属性特征的数量
base_entropy = calc_information_entropy(data) # 计算总体数据集的信息熵
for index in range(feature_number):
feat_list = [item[index] for item in data]
feat_set = set(feat_list)
new_entropy, iv = 0.0, 0.0
for set_item in feat_set: # 计算属性特征划分后的信息增益
sub_data = handle_data(data, index, set_item)
proportion = len(sub_data) / float(data.shape[0]) # 计算子集的比例
new_entropy += proportion * calc_information_entropy(np.array(sub_data))
iv += -proportion * np.log2(proportion)
temp_information_gain = base_entropy - new_entropy # 计算信息增益
gain_ratio = temp_information_gain / iv
print("第%d个属性特征所对应的增益率为%.3f,信息增益为%.3f" % (index + 1, gain_ratio, temp_information_gain)) # 输出每个特征的信息增益
Результаты приведены ниже:
В алгоритме C4.5 коэффициент усиления не используется напрямую для принятия решений о выборе признаков признаков, ноВ качестве кандидатов сначала выбираются атрибуты выше среднего уровня прироста информации, а затем из кандидатов выбираются те, которые имеют наивысший коэффициент прироста.
Об алгоритме C4.5 мы поговорим позже.
2.3 Индекс Джини
Индекс Джини — еще один индикатор выбора атрибутов.
Как мы упоминали ранее, информационная энтропия является стандартом для описания чистоты выборок данных, и значение Джини в индексе Джини также может отражать чистоту выборок данных. Набор выборок данныхМожно использовать значение Джинипредставлять (гдеуказывает на то, что естьрезультаты маркировки):
Значение ДжиниЧем меньше значение, тем выше чистота выборки данных. в то время как атрибутыСоответствующий индекс Джиниможно определить как:
Мы также рассчитываем индекс Джини для приведенного выше набора данных по кредитам отдельно.
Для атрибутивной характеристики кредитной ситуации процесс ручного расчета индекса Джини выглядит следующим образом:
Для индекса Джини других атрибутов читатель может рассчитать его в соответствии с описанным выше процессом (действительно очень простым). Код расчета индекса Джини см. в следующем:
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算基尼指数
"""
def calc_gini_index(data):
feature_number = data.shape[1] - 1 # 属性特征的数量
base_entropy = calc_information_entropy(data) # 计算总体数据集的信息熵
for index in range(feature_number):
feat_list = [item[index] for item in data]
feat_set = set(feat_list)
new_entropy, iv, gini_index = 0.0, 0.0, 0.0
for set_item in feat_set: # 计算属性特征划分后的信息增益
sub_data = handle_data(data, index, set_item)
temp_df = pd.DataFrame(sub_data)
yes_proportion = temp_df[temp_df[temp_df.shape[1]-1] == "Y"].shape[0] / len(sub_data)
gini_value = 1 - (yes_proportion ** 2) - ((1- yes_proportion) ** 2)
proportion = len(sub_data) / float(data.shape[0]) # 计算子集的比例
new_entropy += proportion * calc_information_entropy(np.array(sub_data))
iv += -proportion * np.log2(proportion)
gini_index += gini_value * proportion # 计算基尼指数
temp_information_gain = base_entropy - new_entropy # 计算信息增益
gain_ratio = temp_information_gain / iv
print("第%d个属性特征所对应的信息增益为%.3f,增益率为%.3f, 基尼指数为%.3f" % (index + 1, temp_information_gain, gain_ratio, gini_index))
результат операции:
Выше приведен расчет индекса Джини и связанных с ним кодов.. Вообще говоря, чем меньше индекс Джини, тем приоритет должен быть разделен.
Полный код для вышеуказанного выглядит следующим образом:
import numpy as np
import pandas as pd
np.__version__
pd.__version__
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:创建训数据集
"""
def establish_data():
data = [[0, 0, 0, 0, 'N'], # 样本数据集相关信息,前面几项代表属性特征,最后一项表示是否放款
[0, 0, 0, 1, 'N'],
[0, 1, 0, 1, 'Y'],
[0, 1, 1, 0, 'Y'],
[0, 0, 0, 0, 'N'],
[1, 0, 0, 0, 'N'],
[1, 0, 0, 1, 'N'],
[1, 1, 1, 1, 'Y'],
[1, 0, 1, 2, 'Y'],
[1, 0, 1, 2, 'Y'],
[2, 0, 1, 2, 'Y'],
[2, 0, 1, 1, 'Y'],
[2, 1, 0, 1, 'Y'],
[2, 1, 0, 2, 'Y'],
[2, 0, 0, 0, 'N']]
return np.array(data)
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算信息熵
"""
def calc_information_entropy(data):
data_number, _ = data.shape
information_entropy = 0
for item in pd.DataFrame(data).groupby(_ - 1):
proportion = item[1].shape[0] / data_number
information_entropy += - proportion * np.log2(proportion)
return information_entropy
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:找出对应属性特征值的样本,比如找出所有年纪为青年的样本数据集
"""
def handle_data(data, axis, value):
result_data = list()
for item in data:
if item[axis] == value: result_data.append(item)
return result_data
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算最大的信息增益,并输出其所对应的特征索引
"""
def calc_information_gain(data):
feature_number = data.shape[1] - 1 # 属性特征的数量
base_entropy = calc_information_entropy(data) # 计算总体数据集的信息熵
max_information_gain, best_feature = 0.0, -1 # 初始化最大信息增益和对应的特征索引
for index in range(feature_number):
feat_list = [item[index] for item in data]
feat_set = set(feat_list)
new_entropy = 0.0
for set_item in feat_set: # 计算属性特征划分后的信息增益
sub_data = handle_data(data, index, set_item)
proportion = len(sub_data) / float(data.shape[0]) # 计算子集的比例
new_entropy += proportion * calc_information_entropy(np.array(sub_data))
temp_information_gain = base_entropy - new_entropy # 计算信息增益
print("第%d个属性特征所对应的的增益为%.3f" % (index + 1, temp_information_gain)) # 输出每个特征的信息增益
if (temp_information_gain > max_information_gain):
max_information_gain, best_feature = temp_information_gain, index # 更新信息增益,确定的最大的信息增益对应的索引
return best_feature
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算增益率
"""
def calc_gain_ratio(data):
feature_number = data.shape[1] - 1 # 属性特征的数量
base_entropy = calc_information_entropy(data) # 计算总体数据集的信息熵
for index in range(feature_number):
feat_list = [item[index] for item in data]
feat_set = set(feat_list)
new_entropy, iv = 0.0, 0.0
for set_item in feat_set: # 计算属性特征划分后的信息增益
sub_data = handle_data(data, index, set_item)
proportion = len(sub_data) / float(data.shape[0]) # 计算子集的比例
new_entropy += proportion * calc_information_entropy(np.array(sub_data))
iv += -proportion * np.log2(proportion)
temp_information_gain = base_entropy - new_entropy # 计算信息增益
gain_ratio = temp_information_gain / iv
print("第%d个属性特征所对应的增益率为%.3f,信息增益为%.3f" % (index + 1, gain_ratio, temp_information_gain)) # 输出每个特征的信息增益
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain:计算基尼指数
"""
def calc_gini_index(data):
feature_number = data.shape[1] - 1 # 属性特征的数量
base_entropy = calc_information_entropy(data) # 计算总体数据集的信息熵
for index in range(feature_number):
feat_list = [item[index] for item in data]
feat_set = set(feat_list)
new_entropy, iv, gini_index = 0.0, 0.0, 0.0
for set_item in feat_set: # 计算属性特征划分后的信息增益
sub_data = handle_data(data, index, set_item)
temp_df = pd.DataFrame(sub_data)
yes_proportion = temp_df[temp_df[temp_df.shape[1]-1] == "Y"].shape[0] / len(sub_data)
gini_value = 1 - (yes_proportion ** 2) - ((1- yes_proportion) ** 2)
proportion = len(sub_data) / float(data.shape[0]) # 计算子集的比例
new_entropy += proportion * calc_information_entropy(np.array(sub_data))
iv += -proportion * np.log2(proportion)
gini_index += gini_value * proportion
temp_information_gain = base_entropy - new_entropy # 计算信息增益
gain_ratio = temp_information_gain / iv
print("第%d个属性特征所对应的信息增益为%.3f,增益率为%.3f, 基尼指数为%.3f" % (index + 1, temp_information_gain, gain_ratio, gini_index))
if __name__ == "__main__":
data = establish_data()
calc_gini_index(data)
Существует три основных показателя приоритетного выбора атрибутивных признаков, а именно прирост информации, коэффициент усиления и индекс Джини. Кратко о вышеизложенном:
- Чем выше информационный прирост признака атрибута, тем вышеЛогически говоряСледует предпочесть, часто используется для**алгоритм**
- Чем выше коэффициент усиления признака атрибута, темЛогически говоряДолжен быть выбран первым, обычно используется с **алгоритм**
- признаки атрибута имеют низкий индекс Никки,Логически говоряСледует предпочесть, часто используется для**алгоритм**
Эта статья в основном посвящена теоретической части дерева решений, тому, какой тип дерева решений вводится, и трем критериям принятия решений, которые необходимо предпочтительно выбирать при создании дерева решений. Если вы изучали SVM или читали несколько статей по SVM, написанных Taoye ранее, вы можете обнаружить, что дерево решений намного проще, чем SVM, и не так много сложных выводов формулы. О другом содержании дерева решений, таком как генерация дерева решений, визуализация, обрезка и т. д., мы напишем в нескольких статьях позже.
Я Taoye, я люблю учиться, делиться и люблю различные технологии. В свободное время я люблю играть в шахматы, слушать музыку и говорить об анимации. Я надеюсь использовать это, чтобы записать свой собственный процесс роста и жизни. Я также надеюсь, что смогу завести больше друзей-единомышленников в кругу, и приглашаю посетить WeChat Princess для получения большего количества контента:Циничный кодер.
Использованная литература:
[1] «Машинное обучение на практике»: издательство Питера Харрингтона «Народная почта и телекоммуникации».
[2] «Статистические методы обучения»: Li Hang, второе издание, издательство Университета Цинхуа.
[3] «Машинное обучение»: Чжоу Чжихуа, издательство Университета Цинхуа.
Рекомендуемое чтение
«Машинное обучение в действии» — анализ машин опорных векторов и оптимизация SMO
«Машинное обучение в действии» — анализ машин опорных векторов, разрыв линейного SVM одной рукой
print("Привет, NumPy!")
Что ты не можешь сделать, сначала поешь
Таойе проникла в штаб-квартиру черной платформы, и правда, стоящая за этим, была чрезвычайно ужасающей.
«База данных Dahua» — когда выполняется оператор SQL, какие небольшие действия выполняет нижний уровень?
В те годы Git, в который мы играли, действительно ароматный
Создание среды глубокого обучения на основе блокнота Ubuntu+Python+Tensorflow+Jupyter
Причудливый синтаксический анализ веб-страницы
Рука об руку, чтобы помочь вам понять технологию контейнеров Docker
Подробное объяснение сайта Hexo+Github Xiaobai.
Правильный способ открытия ElasticSearch, kibana, logstash