feature tree что это

Feature Trees

What is it?

A Feature Tree (sometimes also known as a Feature Model or Feature Diagram) is a hierarchical diagram that visually depicts the features of a solution in groups of increasing levels of detail. In the Feature Tree, some features may be flagged as mandatory, some optional, and some as mutually exclusive. Features may be further flagged for development cycles (1st iteration, 2nd iteration, etc.), business priority, dependencies, or other relevant information.

It is important to note that there are a lot of different definitions for what a feature is, depending on where you look. [8] In general, the features in a feature tree could include functional features (hardware, software), non-functional features (performance or other criteria), or even parameters (the same feature at varying levels of capability or cost for example). [5] In most cases however, the features of Feature Tree are mostly kept at a summary level.

Feature Trees can bear significant resemblance to Functional Decomposition Diagrams, depending on the approaches taken to creating them.

Why do it?

Feature Trees are great ways to summarize the features that will be included in a solution and how they are related in a simple visual manner.

They are most commonly used for planning the overall feature set of a single solution (scope) or product that will be evolved over time (say through multiple iterations of development, or multiple releases to the marketplace) or for defining the differing features that will be included in a product line (for example, to define the differences betweenВ Windows 7 Home, Pro, and Ultimate or for different trim levels in a range of automobiles).

They can also be used to help identify missing requirements (by showing the model to clients and asking them to note missing features).

How do I do it?

Like many Business Analysis techniques, creating a Feature Tree is relatively straight forward.В It’s the analysis involved that adds complexity.

Step 1

The first step is decide what visual model you are going to use to create the Feature Tree. Seilevel seems to prefer the fishbone diagram structure (see the links below), but I prefer to use the mind-map as I find it bit more intuitive both for myself and my clients. But you can just as easily use an Organization Chart type structure if that comes easy to you. Or if you don’t have any modeling / diagramming tools at all, you can get much of the same effect with an outline structure in a word processor (although the outline really does seem to lose a lot visual intuitiveness that makes the diagram so useful).

Step 2

Name your central point (the back-bone in a fishbone diagram, the central concept in a mind map, or the top element in an org chart type structure) after the solution or product (line) that you will be building.

Step 3

From the central point, create branches for the main feature groups that your solution will have. If your solution was a shopping web site for example, you might main feature sets for Registration, Account Management, Product Search, Product Display, and Ordering.

Step 4

For each of those main branches, create sub-branches for the main features (or feature alternatives) within those areas. For example, within Account Management there might be sections for Update Shipping Address, Update Email Address, Update Email Preferences, Update Payment Information, and similar sub-groups of features related to Account Management.

Step 5

Repeat Step 4 by further breaking down each sub-branch as appropriate. In general, you don’t want to go into so much detail that you are listing actual requirements.В Seilevel generally recommends going no further than 3 levels, but it really depends on how complex your solution is. Especially for complex product lines, you go much deeper than 3 levels. Continue iterating Step 4 until you are comfortable with the results.

Step 6

Review the resulting diagram with your stakeholders. Make sure they agree that all the features are captured. If there are alternative features or those with dependencies, make sure those are captured as well. Hopefully, the Feature Tree is so easy to comprehend that you could share it with a large number of potential users in order to get feedback via email or some other method that does not require significant interaction.

What Should the Results be?

The result of your efforts should be a tree diagram that can range from relatively small to quite large. The larger and more complex, the more difficult it can be to understand.

The image below is a partial Feature Tree where just some of the Account Management features have been diagrammed. It was created in about 15 seconds using a mind-mapping application. Use whatever tool makes the most sense for your clients and yourself (be it Visio, a mind-mapping program, or whatever works for you).

Источник

Как настроить дерево решений?

Дата публикации Nov 11, 2019

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

Настройка гиперпараметра

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

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

Следующим шагом после определения диапазона значений является использование метода настройки гиперпараметра. Существует множество, наиболее распространенным и дорогим из которых является Grid Search, где другие, такие как Random Search и Bayesian Optimization, обеспечат «более умную» и менее дорогую настройку. Эти методы не являются предметом настоящей статьи, но если вы хотите узнать больше, посмотрите справочный раздел [1].

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

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

Поскольку дерево решений в первую очередь является моделью классификации, мы рассмотрим классификатор дерева решений.

DecisionTreeClassifier

критерий: строка, необязательно (по умолчанию = «gini»):

Функция для измерения качества раскола. Поддерживаемые критерии: «Джини» для примеси Джини и «энтропия» для получения информации.

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

Согласно статье «Теоретическое сравнение между индексом Джини и критериями получения информации» [3], частота согласия / несогласия индекса Джини и получения информации составляла всего 2% от всех случаев, поэтому для всех целей и задач вы можете в значительной степени и то, и другое, но единственная разница в том, что энтропия может быть немного медленнее для вычисления, потому что она требует вычисления логарифмической функции:

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

Читайте также:  что делает триммер для бикини

разделитель: строка, необязательно (по умолчанию = «лучший»)

Стратегия, используемая для выбора разделения на каждом узле. Поддерживаемые стратегии являются «лучшими» для выбора лучшего разделения и «случайными» для выбора лучшего случайного разделения.

Согласно «лучшей» и «случайной» реализации scikit-learn [4], «лучший» и «случайный» разделители используют алгоритм на основе Фишера-Йейтса для вычисления перестановки массива функций Вам не нужно беспокоиться об алгоритме, единственное отличие состоит в том, что в «лучшем» разделителе он оценивает все разбиения с использованием критерия перед разделением, тогда как «случайный» разделитель использует случайную равномерную функцию с min_feature_value, max_feature_value и random_state как входы. Мы рассмотрим, что это ниже, но сейчас давайте посмотрим, как сплиттер повлияет на модель.

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

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

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

max_depth: int или None, необязательный (по умолчанию = None)

Максимальная глубина дерева. Если None, то узлы расширяются до тех пор, пока все листья не станут чистыми или пока все листья не будут содержать меньше чем min_samples_split samples.

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

Давайте сначала поговорим о случае None по умолчанию. Если вы не укажете глубину для дерева, scikit-learn будет расширять узлы до тех пор, пока все листья не станут чистыми, то есть у листа будут только метки, если вы выберете значение по умолчанию для min_samples_leaf, где значение по умолчанию равно единице. Обратите внимание, что большинство этих гиперпараметров связаны друг с другом, и мы вскоре поговорим о min_samples_leaf. С другой стороны, если вы укажете min_samples_split, который мы рассмотрим далее, узлы будут расширяться до тех пор, пока все листья не будут содержать меньше минимального количества выборок. Scikit-learn выберет одно над другим в зависимости от того, какая из них дает максимальную глубину для вашего дерева. Здесь много движущихся частей, min_samples_split и min_samples_leaf, поэтому давайте просто возьмем max_depth изолированно и посмотрим, что происходит с вашей моделью, когда вы ее измените, поэтому после того, как мы пройдем через min_samples_split и min_samples_leaf, мы сможем лучше понять, как все это происходит все вместе.

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

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

min_samples_split: int, float, необязательный (по умолчанию = 2)

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

Допустим, вы указали min_samples_split, и в результате разбиения получается лист с 1 сэмплом, и вы указали min_samples_leaf как 2, тогда ваш min_samples_split не будет разрешен. Другими словами, min_samples_leaf всегда гарантируется независимо от значения min_samples_split

Согласно статье, Эмпирическое исследование по настройке гиперпараметров деревьев решений [5] идеальные значения min_samples_split имеют тенденцию быть между 1 и 40 для алгоритма CART, который является алгоритмом, реализованным в scikit-learn. min_samples_split используется для управления перегонкой. Более высокие значения не позволяют модели изучать отношения, которые могут быть очень специфичными для конкретной выборки, выбранной для дерева. Слишком высокие значения также могут привести к недостаточной подгонке, поэтому в зависимости от уровня недостаточной или чрезмерной подгонки вы можете настроить значения для min_samples_split.

min_samples_leaf: int, float, необязательный (по умолчанию = 1)

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

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

В статье «Эмпирическое исследование по настройке гиперпараметров деревьев решений» [5] также говорится, что идеальные значения min_samples_leaf имеют тенденцию находиться в диапазоне от 1 до 20 для алгоритма CART. В этой статье также указывается, что min_samples_split и min_samples_leaf являются наиболее ответственными за производительность конечных деревьев из анализа их относительной важности [5].

Согласно scikit-learn, мы можем использовать min_samples_split или min_samples_leaf, чтобы гарантировать, что несколько выборок сообщают о каждом решении в дереве, контролируя, какие разбиения будут учитываться. Они также говорят, что очень маленькое число обычно означает, что дерево будет соответствовать, тогда как большое число будет препятствовать тому, чтобы дерево изучило данные, и это должно иметь смысл. Я думаю, что единственным исключением является случай, когда у вас есть проблема с несбалансированным классом, потому что тогда регионы, в которых класс меньшинства будет составлять большинство, будут очень маленькими, поэтому вам следует выбрать более низкое значение.

min_weight_fraction_leaf: float, необязательно (по умолчанию = 0.)

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

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

max_features: int, float, string или None, необязательно (по умолчанию = None)

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

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

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

Читайте также:  при какой стадии вич дается инвалидность

random_state: int, экземпляр RandomState или None, необязательно (по умолчанию = None)

Ха-ха пресловутый random_state, большинство новичков спрашивают меня, почему 1, почему 0 или почему 42? 42 потому что в этом смысл жизни, дух.

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

Это подводит меня к следующему пункту: я видел, как новые студенты играют со значениями random_state и изменениями их точности, это может произойти, потому что алгоритм дерева решений основан на жадном алгоритме [6], где он повторяется несколько раз с использованием случайного На выбор объектов (сплиттер) и на этот случайный выбор влияет генератор псевдослучайных чисел [7], который принимает значение random_state в качестве начального значения, поэтому, изменяя random_state, вы можете случайным образом выбрать хорошие функции, но вам нужно Если вы понимаете, что random_state не является гиперпараметром, то изменение точности вашей модели с помощью random_state означает, что с вашей моделью что-то не так. Это хороший намек на то, что в ваших данных много локальных минимумов, и дерево решений не очень хорошо с этим справляется, поэтому я бы предпочел, чтобы вы установили random_state и настроили другие параметры, чтобы не застревать в локальных минимумах. чем поиграть с random_state.

min_impurity_decrease: float, необязательно (по умолчанию = 0.)

Узел будет разделен, если это разделение вызовет уменьшение примеси, большее или равное этому значению.

Взвешенное уравнение уменьшения примеси имеет следующий вид:

N, N_t, N_t_R и N_t_L все ссылаются на взвешенную сумму, если sample_weight пройден.

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

class_weight: dict, список диктов, «сбалансированный» или None, по умолчанию = None

Веса, связанные с классами в форме . Если не дано, все классы должны иметь вес один. Для задач с несколькими выходами список dicts может быть предоставлен в том же порядке, что и столбцы y.

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

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

presort: bool, необязательный (по умолчанию = False)

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

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

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

Резюме

Сложность дерева решений имеет решающее значение для его точности, и она явно контролируется используемыми критериями остановки и применяемым методом сокращения. Обычно сложность дерева измеряется одной из следующих метрик: общее количество узлов, общее количество листьев, глубина дерева и количество используемых атрибутов [8]. max_depth, min_samples_split и min_samples_leaf являются критериями остановки, тогда как min_weight_fraction_leaf и min_impurity_decrease являются методами сокращения.

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

Ссылка

[3] Лора Елена Райляну и Килиан Стоффель, «Теоретическое сравнение между индексом Джини и критериями получения информацииАнналы по математике и искусственному интеллекту 41: 77–93, 2004.

[5] Рафаэль Гомес Мантовани, Томаш Хорват, Рикардо Черри, Сильвио Барбон Младший, Хоакин Ваншорен, Андре Карлос Понсе де Леон Феррейра де Карвалью, «Эмпирическое исследование гиперпараметрической настройки деревьев решений»
Arxiv: 1812,02207

Источник

Random Forest: прогулки по зимнему лесу

1. Вступление

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

2. Несколько слов о деревьях

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

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

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

Следовательно, его визуальное представление будет таким:

Разумеется, каждый признак обладает разной степенью важности. Из следующего набора данных (формат LibSVM) видно, что первый признак (его индекс 1, так как нумерация начинается не с нуля) абсолютно идентичен у представителей всех классов. Фактически, этот показатель не имеет никакой ценности для классификации, следовательно, его можно назвать избыточной информацией, которая не несёт никакой практической пользы. Аналогичная ситуация и со вторым признаком (предиктором). Однако, третий из них отличается.

Именно третий признак (feature 2) и будет служить тем самым заветным различием, с помощью которого можно предсказывать класс по вектору. Логично предположить, что задача может быть решена одним единственным условием (If-Else). Действительно, каждое дерево в алгоритме машинного обучения правильно смогло понять различия. Далее показана отладочная информация (использован классификатор Random Forest из фреймворка Apache Spark 2.1.0) для нескольких деревьев ансамбля случайного леса.

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

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

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

3. Random Forest

По сути, Random Forest является композицией (ансамблем) множества решающих деревьев, что позволяет снизить проблему переобучения и повысить точность в сравнении с одним деревом. Прогноз получается в результате агрегирования ответов множества деревьев. Тренировка деревьев происходит независимо друг от друга (на разных подмножествах), что не просто решает проблему построения одинаковых деревьев на одном и том же наборе данных, но и делает этот алгоритм весьма удобным для применения в системах распределённых вычислений. Вообще, идея бэггинга, предложенная Лео Брейманом, хорошо подходит для распределения вычислений.

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

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

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

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

Рассмотрим пример классификации на языке программирования R. Так как нам сейчас нужна классификационная модель, а не регрессионная, то в качестве первого параметра следует явно задать, что класс является именно фактором. Кроме количества деревьев уделим внимание числу признаков (mtry), которое будет использовать элементарная модель (дерево) для ветвлений. Фактически, это два основных параметра, которые есть смысл настраивать в первую очередь.

Убедимся, что это именно модель для классификации:

Ознакомимся с результатами confusion matrix:

Интересно увидеть предсказанные значения (на основе out-of-bag):

А функции varImpPlot и importance предназначены для отображения важности предикторов (ценности для точности работы классификатора).

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

Ещё один пример. На этот раз используем Apache Spark 2.1.0 и язык программирования Scala. Информацию мы прочитаем из файла формата LibSVM. После этого необходимо будет явно разделить набор данных на две части. Одна из них будет учебная, а вторая — проверочная. Выполнять стандартизацию или нормализацию нет особого смысла. Наша модель устойчива к этому, равно как и достаточно устойчива к данным различной природы (вес, возраст, доход).

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

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

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

4. Несколько мыслей о практическом применении

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

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

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

Таких примеров очень много. Расскажу ещё одну историю. Была задача повысить эффективность огромной системы управления рекламой. Её работа напрямую зависела от точности предсказания рейтинга товаров и услуг. У каждого из них был вектор из 64-ти признаков. Стратегически важно было заранее дать относительно точный прогноз значения рейтинга для каждого нового вектора признаков. До этого система управлялась нехитрыми правилами и описательной статистикой. Но, как известно, эффективности и точности в таких вопросах много не бывает. Для решения задачи повышения эффективности была использована регрессионная модель, похожая на указанную в примере:

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

Источник

Сказочный портал