Машинное обучение и нейронные сети - страница 69

 

5.4 Введение в Scikit-learn (L05: Машинное обучение с помощью Scikit-Learn)



5.4 Введение в Scikit-learn (L05: Машинное обучение с помощью Scikit-Learn)

Цель этого относительно короткого видео — представить машинное обучение с помощью scikit-learn. Scikit-learn — это широко используемая библиотека машинного обучения на Python, которая предоставляет полный набор инструментов и алгоритмов для различных задач машинного обучения. Хотя вы, возможно, видели scikit-learn раньше в контексте лекций k-nearest сосед (KNN), это видео направлено на то, чтобы сделать шаг назад и должным образом представить библиотеку.

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

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

Теперь давайте более подробно обсудим машинное обучение с помощью scikit-learn. Scikit-learn широко считается основной библиотекой машинного обучения для Python из-за ее устоявшейся репутации, большой пользовательской базы и удобного характера. Это хорошо спроектированная библиотека, которая предлагает согласованный и интуитивно понятный API. Scikit-learn также активно поддерживается и регулярно обновляется благодаря многочисленным участникам, что делает его надежным и надежным выбором для задач машинного обучения.

Важно отметить, что scikit-learn в первую очередь ориентирован на традиционные методы машинного обучения и не предназначен для глубокого обучения. Глубокое обучение — это отдельная область со своими специализированными библиотеками. Для глубокого обучения обычно используются другие библиотеки, такие как TensorFlow или PyTorch. Однако для традиционных задач машинного обучения scikit-learn часто является подходящей библиотекой.

Scikit-learn существует уже некоторое время, его первоначальный выпуск датируется 2007 годом. Несмотря на свой возраст, он остается популярной и активно поддерживаемой библиотекой. Он начался как проект Google Summer of Code Дэвида Курнапо и со временем получил вклад от многих других разработчиков. С более чем 1875 участниками на GitHub и почти 150 000 пользователей очевидно, что scikit-learn является высоко оцененной библиотекой с существенной поддержкой сообщества.

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

Чтобы понять API оценки scikit-learn, давайте углубимся в его основные компоненты. Estimator API используется для контролируемых задач обучения и включает регрессоры для регрессионного анализа и классификаторы для задач классификации. При использовании scikit-learn вы обычно инициализируете оценщик с определенными гиперпараметрами, которые задаются в конструкторе класса.

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

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

Кроме того, scikit-learn предоставляет метод оценки, который вычисляет производительность модели. Для классификаторов он часто представляет собой точность, тогда как для регрессоров он обычно вычисляет коэффициент детерминации (оценка R ^ 2). Этот метод служит удобным способом оценки производительности модели.

В дополнение к этим основным компонентам scikit-learn также предлагает широкий спектр методов предварительной обработки и утилит для улучшения вашего рабочего процесса машинного обучения.

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

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

Еще один полезный метод предварительной обработки — обработка пропущенных значений. Класс SimpleImputer предоставляет стратегии замены отсутствующих значений подходящими альтернативами, такими как использование среднего, медианы или наиболее частых значений соответствующих признаков.

При работе с категориальными переменными scikit-learn предлагает классы OneHotEncoder и LabelEncoder. LabelEncoder преобразует категориальные метки в числовые значения, а OneHotEncoder преобразует категориальные признаки в двоичное векторное представление, позволяя алгоритмам эффективно работать с категориальными данными.

Чтобы упростить рабочий процесс машинного обучения, scikit-learn предоставляет мощный инструмент, называемый конвейерами. Конвейер объединяет несколько шагов предварительной обработки и модель машинного обучения в один объект, что упрощает управление и последовательное применение всего рабочего процесса.

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

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

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

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

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

Показатели оценки модели, такие как точность, воспроизводимость, полнота, оценка F1 и площадь под кривой ROC, имеют решающее значение для оценки производительности вашей модели в различных задачах. Scikit-learn предлагает широкий спектр таких метрик, которые можно легко вычислить и сравнить.

Scikit-learn — это мощная и популярная библиотека машинного обучения на Python, которая предоставляет широкий спектр инструментов и алгоритмов для различных задач машинного обучения. Его удобный API, обширная документация и активное сообщество делают его отличным выбором как для начинающих, так и для опытных практиков. Если вам нужно предварительно обработать данные, построить конвейеры, выбрать модели или оценить производительность, у scikit-learn есть инструменты, необходимые для эффективного и действенного выполнения работы.

 

5.5 Scikit-learn Transformer API (L05: Машинное обучение с помощью Scikit-Learn)


5.5 Scikit-learn Transformer API (L05: Машинное обучение с помощью Scikit-Learn)

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

Докладчик начинает с рассмотрения проблем, связанных со случайной подвыборкой, которая включает в себя разделение набора данных на два подмножества, обычно обучающий набор и тестовый набор. Они объясняют, что случайное разделение набора данных может привести к изменениям в распределении меток классов, что приведет к неправильному представлению классов как в обучающем, так и в тестовом наборах. Чтобы преодолеть эту проблему, ведущий предлагает использовать послойное разделение, которое обеспечивает сохранение распределения или пропорций классов в подмножествах. Они продолжают демонстрировать, как добиться стратифицированного разделения, используя функцию train_test_split из подмодуля scikit-learn model_selection.

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

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

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

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

Затем докладчик фокусируется на работе с категориальными данными. Они вводят игрушечный набор данных, состоящий из трех столбцов характеристик и одного столбца меток, подчеркивая, что категориальные переменные можно разделить на два типа: порядковые и номинальные. Порядковые переменные имеют определенный порядок или иерархию, а номинальные переменные — нет. В качестве иллюстрации они выделяют столбец «размер» как порядковую переменную, где размеры футболок, такие как M, L и XXL, демонстрируют четкий порядок. Для обработки порядковых переменных видео рекомендует использовать словарь сопоставления для преобразования значений в числовые представления.

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

Для столбцов номинальных характеристик, таких как «цвет», где не подразумевается порядок, использование кодировщика меток может ввести вводящую в заблуждение информацию. В таких случаях в видео в качестве подходящей альтернативы используется однократное кодирование. Этот метод включает создание нового столбца признаков для каждого отдельного значения в номинальном столбце признаков и присвоение 0 и 1, чтобы указать наличие или отсутствие определенного значения. Упоминается, что удаление одного из результирующих столбцов функций может устранить избыточность без потери важной информации.

Видео кратко касается отсутствующих данных и предлагает некоторые основные подходы к их обработке. Одна стратегия включает удаление строк или столбцов, содержащих пропущенные значения, если они появляются случайно и не указывают на систематическую проблему. Это можно сделать с помощью метода dropna() в библиотеке pandas. Другой подход заключается в заполнении отсутствующих данных путем заполнения пробелов статистическими мерами, такими как среднее значение или медиана, с использованием таких инструментов, как преобразователь SimpleImputer. Тем не менее, видео предупреждает, что вменение данных следует тщательно обдумывать, так как оно может привести к непреднамеренным смещениям.

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

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

 

5.6 Конвейеры Scikit-learn (L05: Машинное обучение с помощью Scikit-Learn)



5.6 Конвейеры Scikit-learn (L05: Машинное обучение с помощью Scikit-Learn)

Итак, все, мы наконец добрались до последней части пятой лекции, которая, на мой взгляд, самая интересная: священные конвейеры обучения. Эти конвейеры — невероятно полезные объекты или классы, которые позволяют нам беспрепятственно комбинировать этапы обработки данных и прогнозирования. Чтобы дать вам общее представление, я представлю блок-схему работы конвейеров, хотя пока не буду вдаваться во все детали.

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

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

Позвольте мне проиллюстрировать это на простом примере кода конвейера. Здесь я создаю конвейер, используя функцию make_pipeline из подмодуля sklearn.pipeline священного обучения. Это удобный способ создания конвейеров. В этом примере я создаю базовый конвейер, состоящий из стандартного масштабатора и классификатора K-ближайших соседей. Стандартный масштабатор, как мы обсуждали в предыдущем видео, стандартизирует данные, заставляя их иметь нулевое среднее значение и единичную дисперсию. Мы инициализируем стандартный масштабатор и классификатор K-ближайших соседей как компоненты конвейера.

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

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

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

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

В scikit-learn мы можем выполнить метод удержания и настройку гиперпараметров, используя метод, называемый поиском по сетке. Поиск по сетке включает в себя создание сетки параметров, которая определяет комбинации гиперпараметров, которые мы хотим оценить. Например, в случае k ближайших соседей мы можем рассматривать разные значения количества соседей (k) и метрики расстояния (p). Поиск по сетке перебирает все возможные комбинации, подбирая модели в обучающем наборе и оценивая их в проверочном наборе.

Хотя поиск по сетке обычно используется с K-кратной перекрестной проверкой, в этом примере мы сосредоточимся на методе удержания. Чтобы применить метод удержания и поиск по сетке с использованием конвейера, мы можем использовать класс GridSearchCV из scikit-learn. Этот класс позволяет нам определить сетку параметров и конвейер, а также обрабатывает процесс подбора моделей и их оценки.

Вот пример фрагмента кода, демонстрирующий использование GridSearchCV с конвейером:

 from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline

# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a pipeline
pipeline = make_pipeline(StandardScaler(), KNeighborsClassifier())

# Define the parameter grid for grid search
param_grid = { 'kneighborsclassifier__n_neighbors' : [ 3 , 5 , 7 ],
               'kneighborsclassifier__weights' : [ 'uniform' , 'distance' ]}

# Create a GridSearchCV object
grid_search = GridSearchCV(pipeline, param_grid, cv= 5 )

# Fit the models and perform grid search
grid_search.fit(X_train, y_train)

# Print the best parameters and best score
print( "Best Parameters: " , grid_search.best_params_)
print( "Best Score: " , grid_search.best_score_)

# Evaluate the best model on the test set
best_model = grid_search.best_estimator_
accuracy = best_model.score(X_test, y_test)
print( "Test Accuracy: " , accuracy)
В этом примере мы начинаем с загрузки набора данных Iris и разделения его на обучающие и тестовые наборы с помощью функции train_test_split. Затем мы создаем конвейер, используя make_pipeline, состоящий из StandardScaler для масштабирования данных и KNeighborsClassifier в качестве оценщика.

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

Мы создаем объект GridSearchCV, передавая конвейер, сетку параметров и желаемое количество перекрестных проверок (cv). Класс GridSearchCV автоматически выполняет поиск в сетке, подгоняя конвейер к обучающим данным и оценивая модели в проверочном наборе.

После завершения поиска в сетке мы можем получить доступ к лучшим параметрам и лучшему результату, используя атрибуты best_params_ и best_score_ объекта GridSearchCV. Мы печатаем эти значения, чтобы увидеть, какая комбинация гиперпараметров дала наилучшую производительность.

Наконец, мы оцениваем лучшую модель в тестовом наборе, обращаясь к ней из атрибута best_estimator_ объекта GridSearchCV и вычисляя точность с помощью метода оценки.

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

 

6.1 Введение в деревья решений (L06: деревья решений)



6.1 Введение в деревья решений (L06: деревья решений)

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

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

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

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

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

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

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

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

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

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

Деревья решений также можно интерпретировать как наборы правил, аналогичные операторам if-else в программировании. На самом деле деревья решений можно преобразовать в наборы правил, хотя обратное преобразование не всегда возможно. Эта характеристика деревьев решений делает их легко интерпретируемыми и объяснимыми, что имеет решающее значение в областях, где важны интерпретируемость и объяснимость, например, в юридических и медицинских областях.

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

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

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

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

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

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

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

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

 

6.2 Рекурсивные алгоритмы и Big-O (L06: Деревья решений)



6.2 Рекурсивные алгоритмы и Big-O (L06: Деревья решений)

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

Чтобы понять идею рекурсии, давайте рассмотрим пример рекурсивного алгоритма, реализованного в Python. Ради обсуждения я намеренно скрыл фактическое имя функции, чтобы побудить вас проанализировать ее назначение, прежде чем мы углубимся в ее детали. Я призываю вас подумать о том, что может делать эта функция. Вы можете приостановить видео или даже поэкспериментировать с ним в блокноте Jupyter, чтобы понять его поведение.

Предполагая, что вы потратили время на его анализ, давайте вместе изучим функцию. Эта конкретная функция работает со списками Python. Например, рассмотрим список вроде [1, 2, 3]. Цель этой функции — определить длину массива или списка. Давайте рассмотрим, как это работает. Функция принимает входные данные, обозначенные здесь как «X», и проверяет два условия. Во-первых, он проверяет, пуст ли список. Если это так, функция возвращает 0, поскольку пустой список имеет нулевую длину, что действует как условие остановки. В противном случае, если список не пуст, функция возвращает 1 и вызывает себя с меньшим вводом.

Если это кажется абстрактным, давайте разберем его шаг за шагом. Предположим, мы начинаем с полного списка, такого как [1, 2, 3]. Сначала функция проверяет, пуст ли список, а это не так. Следовательно, он переходит к оператору else, где возвращает 1 и рекурсивно вызывает сам себя с меньшим вводом. В этом случае ввод становится [2, 3], так как мы удаляем первый элемент из исходного списка. Мы повторяем процесс: функция снова возвращает 1, вызывает себя с новым вводом [3] и в конечном итоге вызывает себя с пустым списком.

При достижении пустого списка функция еще раз проверяет условие if, которое теперь истинно. В результате она возвращает 0. Когда мы оцениваем все выражение, мы получаем значение 3. Таким образом, эта функция вычисляет длину массива, используя рекурсию, где функция вызывает себя в пределах своего собственного определения. Стоит отметить, что хотя рекурсия является концептуально элегантным решением в теории информатики, она не всегда может быть наиболее практичным подходом к реализации. В Python рекурсия имеет ограничения на количество самовызовов, а чрезмерно большие списки могут вызвать ошибку переполнения стека.

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

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

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

Давайте рассмотрим пример, чтобы понять процесс. Предположим, у нас есть несортированный список [7, 2, 5, 1, 9, 3]. Алгоритм быстрой сортировки будет выглядеть следующим образом:

  1. Опорный элемент выбирается в качестве первого элемента, который равен 7.
  2. Создаются два пустых списка, меньший и больший.
  3. Итерация по списку, исключая сводную:
    • 2 меньше 7, поэтому он попадает в меньший список.
    • 5 меньше 7, поэтому он попадает в меньший список.
    • 1 меньше 7, поэтому он попадает в меньший список.
    • 9 больше, чем 7, поэтому он входит в больший список.
    • 3 меньше 7, поэтому он попадает в меньший список.
  4. Рекурсивно вызывайте быструю сортировку как для меньшего, так и для большего списка.
    • Для меньшего списка: [2, 5, 1, 3]
      • Выберите 2 в качестве опорного и создайте пустые списки.
      • Итерация по списку:
        • 5 больше, чем 2, поэтому он попадает в больший список.
        • 1 меньше 2, поэтому он попадает в меньший список.
        • 3 больше, чем 2, поэтому он попадает в больший список.
      • Рекурсивно вызывайте быструю сортировку как для меньшего, так и для большего списка.
        • Для меньшего списка: [1]
          • В списке меньше двух элементов, поэтому он возвращается как есть.
        • Для большего списка: [5, 3]
          • Выберите 5 в качестве опорного и создайте пустые списки.
          • Итерация по списку:
            • 3 меньше 5, поэтому он попадает в меньший список.
          • Рекурсивно вызывайте быструю сортировку как для меньшего, так и для большего списка.
            • Для меньшего списка: [3]
              • Список содержит менее двух элементов, поэтому он возвращается как есть.
            • Для большего списка: [5]
              • Список содержит менее двух элементов, поэтому он возвращается как есть.
      • Окончательный отсортированный меньший список — [1].
      • Окончательный отсортированный большой список — [3, 5].
    • Для большего списка: [9]
      • Список содержит менее двух элементов, поэтому он возвращается как есть.
  5. Окончательный отсортированный меньший список — [1].
  6. Окончательный отсортированный большой список — это [3, 5, 9].
  7. Объедините отсортированный меньший список, сводную (7) и отсортированный больший список.
    • Отсортированный список становится [1, 3, 5, 7, 9].

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

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

 

6.3 Типы деревьев решений (L06: Деревья решений)



6.3 Типы деревьев решений (L06: Деревья решений)

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

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

Однако, как мы продемонстрировали ранее, используя визуализацию дерева решений в scikit-learn, мы также можем использовать непрерывные функции и преобразовывать их в бинарные разбиения. Например, мы можем выбрать функцию, назовем ее xj, и разделить ее на две части, используя порог, обозначенный как «t». Этот критерий разделения может быть определен как xj меньше t или xj больше или равно t, что может быть представлено как истинное или ложное. Это позволяет нам выполнять бинарное разделение даже с непрерывными функциями, поскольку мы можем настроить порог принятия решения в процессе разделения. У вас будет возможность поработать над таким разделением в домашнем задании.

Теперь давайте сосредоточимся на реализации алгоритма дерева решений. В каждом узле дерева решений мы рассматриваем один признак, обозначаемый как xj, где j находится в диапазоне от 1 до m, что соответствует до m признаков. Когда мы разделяем родительский узел на два дочерних узла, скажем, дочерний нулевой и дочерний один, нам нужно определить, какой признак выбрать для разделения. Для непрерывных функций нам также необходимо учитывать порог принятия решения, где мы сравниваем, больше ли xj или равно определенному значению «t». Выбор подходящей функции и порога имеет решающее значение, и нам требуется мера качества для оценки качества разделения.

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

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

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

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

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

Энтропия — это мера примеси или беспорядка в узле. Он количественно определяет неопределенность, связанную с метками класса точек данных в этом узле. Энтропия узла рассчитывается по следующей формуле:

Энтропия (узел) = - сумма (p (i) * log2 (p (i))), для всех классов i

где p(i) представляет долю точек данных в узле, принадлежащих классу i. Значение энтропии находится в диапазоне от 0 до 1, где 0 указывает на чистый узел (все точки данных принадлежат одному классу), а 1 указывает на максимальную примесь (равное распределение точек данных по всем классам).

Чтобы оценить качество разделения, мы вычисляем средневзвешенное значение энтропии для полученных дочерних узлов. Это известно как прирост информации. Прирост информации рассчитывается следующим образом:

Прирост информации = энтропия (родительский) - сумма ((|Sv| / |S|) * энтропия (Sv)), для всех дочерних узлов v

где Entropy(parent) — энтропия родительского узла, |Sv| представляет количество точек данных в дочернем узле v, а |S| общее количество точек данных в родительском узле. Прирост информации измеряет снижение энтропии, достигнутое за счет разделения узла на основе определенной функции.

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

Джини (узел) = 1 - сумма (p (i) ^ 2), для всех классов i

где p(i) представляет долю точек данных в узле, принадлежащих классу i. Подобно энтропии, значение примеси Джини находится в диапазоне от 0 до 1, где 0 указывает на чистый узел, а 1 указывает на максимальную примесь.

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

Индекс Джини = сумма ((|Sv| / |S|) * Джини(Sv)), для всех дочерних узлов v

где |Sв| представляет количество точек данных в дочернем узле v, а |S| общее количество точек данных в родительском узле. Индекс Джини измеряет снижение примеси Джини, достигнутое путем разделения узла на основе определенного признака.

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

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

 

6.4 Критерии разделения (L06: Деревья решений)



6.4 Критерии разделения (L06: Деревья решений)

В видео спикер углубляется в тонкости деревьев решений и вводит понятие критериев разделения в рамках этой структуры. Критерии разделения — это, по сути, критерии или меры, используемые для определения наиболее подходящей функции для разделения родительского узла на его дочерние узлы. Как правило, набор данных включает в себя несколько функций, обозначаемых как x1, x2, x3, ..., xm, где j представляет собой значение в диапазоне от 1 до m.

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

Чтобы проиллюстрировать работу деревьев решений, спикер представляет игрушечный набор данных, состоящий из трех признаков: x1, x2, x3 и столбца, обозначающего метку класса y. Метки классов в этом наборе данных являются бинарными и принимают значения единиц или нулей. Докладчик отмечает, что, используя только две функции, можно достичь точности обучения 100% для этого конкретного набора данных.

Бросая вызов аудитории, спикер предлагает им найти два правила, основанные на трех признаках, которые могут привести к точности обучения 100%. Они предлагают поставить видео на паузу, чтобы обдумать решение. Затем спикер раскрывает решение, объясняя, что релевантными и полезными функциями являются только x1 и x2, тогда как x3, по-видимому, является случайным и не способствует точности.

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

Первоначальное разделение основано на том, что x1 больше 5,5. Это деление разделяет данные на две области, одна из которых помечена синим цветом, а другая — красным. Докладчик отмечает, что, хотя это разделение правильно классифицирует некоторые точки данных, оно также неправильно классифицирует другие. Последующее разделение основано на том, что x2 больше 10,5. Это дополнительно уточняет процесс классификации и в конечном итоге приводит к дереву решений, которое достигает 100% точности обучения.

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

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

Наконец, спикер упоминает альтернативный подход к достижению 100% точности обучения за счет использования исключительно второй функции. Они демонстрируют дерево решений, основанное на этом альтернативном подходе, демонстрируя, как функцию два можно разделить на значения 7,5 и 10, чтобы точно разделить точки данных на нужные классы.

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

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

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

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

Чтобы проиллюстрировать эту концепцию, давайте рассмотрим несколько примеров. Если у нас есть вероятность 0,5, количество требуемых битов будет равно 1. Если вероятность равна 0, требуемое количество битов будет бесконечностью, что означает абсолютную уверенность. И наоборот, если вероятность равна 1, требуемое количество битов будет равно 0, что указывает на полную неопределенность. Следовательно, диапазон значений термина -log2(p) простирается от минус бесконечности до 0.

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

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

 

6.5 Джини и энтропия по сравнению с ошибкой неправильной классификации (L06: Деревья решений)


6.5 Джини и энтропия по сравнению с ошибкой неправильной классификации (L06: Деревья решений)

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

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

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

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

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

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

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

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

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

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

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

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

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

Напротив, ошибка ошибочной классификации имеет линейную форму с острым пиком на уровне 0,5. Он рассматривает все ошибочные классификации одинаково и не различает разные степени ошибочных классификаций. Это делает ошибку неправильной классификации более чувствительной к дисбалансу классов и менее эффективной в сценариях с несбалансированными наборами данных.

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

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

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

 

6.6 Усовершенствования и работа с переоснащением (L06: Деревья решений)



6.6 Усовершенствования и работа с переоснащением (L06: Деревья решений)

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

Чтобы освежить память, напомним три критерия разделения: энтропия, масштабированная энтропия (для сравнения с примесью Джини) и ошибка неправильной классификации. Форма этих мер примесей может быть визуализирована следующим образом: энтропия представляет собой вогнутую функцию, представленную высокой черной линией; масштабированная энтропия также вогнута и получается путем умножения энтропии на 0,5; а ошибка неправильной классификации демонстрирует острый пик при 0,5 и линейном наклоне.

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

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

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

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

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

Ошибка неправильной классификации основана на потере 0-1, которая измеряет долю ошибочно классифицированных меток. Например, если у нас есть узел с метками 001111, большинство голосов будет предсказывать 0, потому что это класс большинства. Однако, учитывая распределение, мы окажемся правильными только четыре раза из шести, что даст точность 4/6 или 66,6%. Ошибка будет 2/6 или 33,3%.

Чтобы сравнить энтропию и ошибку неправильной классификации, мы наблюдаем, что энтропия вогнута, в то время как ошибка неправильной классификации демонстрирует острый пик на уровне 0,5 и линейный наклон. Это различие имеет решающее значение для понимания того, почему энтропия предпочтительнее ошибки неправильной классификации для выращивания деревьев решений.

Чтобы проиллюстрировать это, давайте рассмотрим простой игрушечный набор данных с родительским узлом, содержащим 40 примеров из первого класса и 80 примеров из нулевого класса. Предполагая, что лучший признак для разделения — это x1, мы делим набор данных в зависимости от того, равны ли значения признаков единице или нулю. Мы получаем два дочерних узла: дочерний узел один и дочерний узел два. Анализируя распределение классов, мы обнаруживаем, что второй дочерний узел более чистый, чем родительский, а первый дочерний узел хуже.

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

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

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

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

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

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

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

 

6.7 Пример кода, реализующий деревья решений в Scikit-Learn (L06: деревья решений)



6.7 Пример кода, реализующий деревья решений в Scikit-Learn (L06: деревья решений)

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

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

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

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

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

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

Чтобы отобразить график дерева решений, мы загружаем сгенерированный файл PNG с помощью модуля отображения ipython. Мы импортируем класс изображения из дисплея ipython и используем его для загрузки файла PNG. Это позволяет нам просматривать график дерева решений непосредственно в Jupyter Notebook. График дерева решений показывает разделения и границы решений в виде вертикальных и горизонтальных линий соответственно на основе выбранных признаков.

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

Причина обращения: