Я потерял счет количеству моделей машинного обучения, которые доступны в нашем распоряжении для решения сложных задач, но каждая из них имеет свой собственный набор параметров настройки. Даже когда дело доходит до простейших древовидных моделей, они имеют множество параметров, которые можно настроить для улучшения прогностических характеристик модели.
Мы собираемся изучить, как мы можем использовать RandomSearchCV и GridSearchCV практически для любого алгоритма машинного обучения. Мы также обсудим преимущества и недостатки обоих этих методов. Некоторые из самых известных алгоритмов, такие как Random Forest и XGBoost, представляют собой ансамблевые модели (набор древовидных моделей), поэтому мы сосредоточимся на древовидных моделях. Это облегчит связь и практическое применение этих методов в ваших проектах и предстоящих конкурсах.
Параметры модели
Среди многих доступных параметров модели, вот несколько, которые были приняты во внимание, чтобы объяснить важность настройки параметров.
- Максимальная глубина
- min_sample_split
- max_leaf_nodes
- min_samples_leaf
Параметр 1: max_depth:
Максимальная_глубина дерева определяется как самый длинный путь между корневым узлом и конечным узлом:
Используя параметр max_depth, мы можем ограничить глубину роста нашей модели дерева.
На этом графике мы ясно видим, что по мере увеличения максимальной глубины дерева решений производительность модели имеет тенденцию к увеличению до 16, после чего значительного улучшения не наблюдается. По мере того, как мы увеличиваем максимальную глубину для любой модели дерева, она имеет тенденцию превышать данные обучения, и в этом случае точность тестирования начнет падать. Таким образом, нам нужно уметь находить точную глубину, на которой точность тестирования максимальна и за пределами которой нет существенного улучшения. В этом случае число будет 16.
Параметр 2: min_sample_split:
Это параметр, который сообщает дереву решений минимально необходимое количество наблюдений в любом заданном узле, чтобы разделить его.
Значение по умолчанию Minimum_sample_split для DecisionTreeClassifier равно 2. Это означает, что если какой-либо конечный узел имеет более двух точек данных и не является чистым узлом, мы можем разбить его на подузлы.
Увеличивая значение min_sample_split, мы можем уменьшить количество разбиений, которые происходят в дереве решений, и, следовательно, предотвратить переоснащение модели. Теперь давайте посмотрим, как min_samples_split влияет на производительность модели. График ниже построен с учетом того, что все остальные параметры остались прежними, изменилось только значение min_samples_split:
При увеличении значения параметра min_sample_split мы можем ясно видеть, что когда значение ближе к нулю, существует большая разница между тренировочной и тестовой оценкой. Но когда значение увеличивается, разница в тестировании и тренировочном балле уменьшается.
Есть одна вещь, которую вы должны всегда помнить: когда значение min_sample_split слишком сильно увеличивается, количество разбиений, которые может сделать дерево, будет значительно уменьшено, а это означает, что дерево будет не соответствовать данным. Таким образом, оптимальное значение должно быть выбрано соответствующим образом.
Параметр 3: max_leaf_nodes:
Этот параметр задает условие разделения узлов дерева и, следовательно, ограничивает рост дерева. Если после разделения у нас будет больше конечных узлов, чем заданное количество конечных узлов, это остановит разделение, и дерево не будет расти дальше.
В приведенном выше примере для параметра max_leaf_nodes установлено значение 4. Используя этот параметр, мы можем ограничить глубину дерева и, таким образом, предотвратить переобучение. Теперь мы рассмотрим влияние этого на производительность модели.
Мы можем видеть, что когда значение параметра ближе к нулю, дерево не соответствует требованиям, и по мере увеличения значения параметра производительность дерева как в тесте, так и в поезде увеличивается. Согласно этому графику, дерево начинает переобучать, когда значение параметра выходит за пределы 25.
Параметр 4: min_samples_leaf
Этот параметр модели дерева указывает минимальное количество выборок, которые должны присутствовать в конечном узле после разделения узла.
Давайте разберемся с min_sample_leaf на примере. Допустим, мы установили минимальные выборки для конечного узла как 5:
Дерево слева представляет собой неограниченное дерево. Здесь узлы, отмеченные зеленым цветом, удовлетворяют условию, так как имеют минимум 5 выборок. Следовательно, они будут рассматриваться как конечные или конечные узлы.
Однако красный узел имеет только 3 выборки и, следовательно, не будет считаться конечным узлом. Его родительский узел станет конечным узлом. Вот почему дерево справа представляет результаты, когда мы установили минимальные выборки для конечного узла равными 5.
Итак, мы контролировали рост дерева, установив критерий минимальной выборки для терминальных узлов. Как вы могли догадаться, подобно двум упомянутым выше гиперпараметрам, этот параметр также помогает предотвратить переоснащение при увеличении значения параметра.
Если мы построим график значения производительности/параметра, как и раньше:
Мы можем ясно видеть, что древовидная модель переоснащается, когда значение параметра очень низкое (когда значение параметра ‹ 100), но производительность модели быстро растет и устраняет проблему переобучения (100 ‹ значение параметра ‹ 400). Но когда мы продолжаем увеличивать значение параметра (> 500), модель медленно дрейфует в сторону недообучения.
Вышеописанное — это всего лишь несколько параметров, которые мы обсудили, также есть и другие параметры. В случае сложной модели очень приходилось настраивать каждый параметр индивидуально, так как это требует много времени и терпения. Мы собираемся обсудить два метода, которые можно использовать для уменьшения наших усилий и экономии времени, а именно:
1. Поиск по сетке
2. Случайный поиск
Поиск по сетке
Поиск по сетке можно рассматривать как исчерпывающий поиск для выбора модели. В Grid Search специалист по данным настраивает сетку значений параметров и для каждой комбинации обучает модель и оценивает данные тестирования. При таком подходе проверяются все комбинации значений параметров, что может быть очень неэффективно.
Поиск 20 различных значений параметров для каждого из 4 параметров, например, потребует 1 60 000 перекрестных проверок. Если используется 10-кратная перекрестная проверка, это эквивалентно 16 00 000 подгонок модели и 16 00 000 прогнозов. Хотя Scikit Learn предоставляет функциональность GridSearchCV для упрощения процесса, как вычислительная мощность, так и время выполнения были бы чрезвычайно дорогими.
Случайный поиск
Напротив, случайный поиск устанавливает сетку значений параметров и выбирает случайные комбинации для обучения модели и оценки. Это позволяет вам явно контролировать количество комбинаций параметров, которые будут предприняты. Количество итераций поиска задается в зависимости от времени или ресурсов. Scikit Learn предлагает для этого процесса функцию RandomizedSearchCV.
Поиск по сетке и случайный поиск
Чтобы сравнить эффективность двух методов, я проанализировал данные ноутбука/компьютера. В частности, я проанализировал взаимосвязь между функциями ноутбука/компьютера (например, ПЗУ, графическая карта и т. д.) и его себестоимостью. База данных содержит 4000 точек данных и была создана на основе сбора данных о продажах ноутбуков/компьютеров различных компаний.
Было очевидно, что Grid Search работает лучше, потому что он учитывает все возможные комбинации, в отличие от Random Search CV, который учитывает случайные комбинации. Поэтому я выполнил ту же операцию с набором тестовых данных с тем же количеством образцов и функций, используя функцию Scikit Learn «make_classification», и снова сравнил их.
И снова поиск по сетке превзошел случайный поиск. Скорее всего, это связано с небольшими размерами набора данных (всего 4000 выборок). Для больших наборов данных рекомендуется вместо этого выполнять рандомизированный поиск.
Выводы и основные выводы:
Процесс поиска лучших параметров алгоритма машинного обучения для набора данных называется настройкой алгоритма. Random и Grid Search — это два метода настройки структурированных параметров, и эти функции предоставляются Scikit Learn через GridSearchCV и RandomizedSearchCV.
Поиск по сетке может дать надежные результаты с ограниченными наборами данных и большим количеством ресурсов. Однако высокие размерности могут значительно замедлить время вычислений для массивных наборов данных и быть очень дорогими. В этом случае предлагается использовать рандомизированный поиск, поскольку специалист по обработке и анализу данных специально указывает количество итераций.