Добавил:
Да поможет вам Котельников Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Проект(CatBoost) / CatBoost (1)

.docx
Скачиваний:
2
Добавлен:
23.06.2024
Размер:
8.87 Mб
Скачать

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

2 слайд:

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

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

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

3 слайд:

Вот так например выглядит уже обученное на данных дерево решений:

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

Обратите внимание что прогноз меняется в зависимости от ответа непонятно одно откуда дерево знает какие вопросы задавать и соответственно какие прогнозы делать исходя из ответов?

Слайд 4:

Дерево выбирает подходящий вопрос исходя из качества разделения исторических данных. Оно анализирует все возможные варианты разделения данных на две группы и выбирает из этих вариантов наилучший. Чтобы выбрать лучший из всех возможных вариантов дерево применяет формулу MSE от английского Mean Squared Error - на русский означает средняя квадратичная ошибка.

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

Чтобы посчитать MSE мы делаем очень простую вещь вычитаем из каждой цены в нашей выборке среднюю а затем возводим в квадрат и усредняем. Усредняем по-другому суммируем и делим на количество наблюдений получается среднеквадратичная ошибка при этом n в формуле MSE это просто количество наблюдений в обучающей выборке.

Слайд 5:

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

Вот этот страшный символ это ничто иное как сумма выражения при i и от 1 до n.

Мы уже знаем что n = 4 вычитаем из каждой суммы среднюю возводим в квадрат получаем сумму.

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

Слайд 6:

При этом как же дерево использует MSE для выбора подходящих вопросов? Оно рассчитывает MSE для двух частей разделения и умножает оба значения на вес группы:

Например в первой группе у нас одно из четырёх наблюдений следовательно вес первой группы одна четвёртая во второй группе три из четырёх наблюдений поэтому мы домножаем значение MSE на 3/4 кстати обратите внимание что MSE первой группы равен нулю потому что в ней только одно значение. Дерево сравнивает все варианты возможных вопросов используя взвешенные MSE не надо забывать что MSE это всё-таки ошибка поэтому побеждает вариант с наименьшим значением.

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

Остается вопрос какие прогнозы давать дереву исходя из ответов на вопросы? Прогноз дерева это ничто иное как среднее значение цены для всех наблюдений из исторических данных для которых выполняются условия.

Таким образом для домов с похожими ответами на вопросы дерево дает похожие прогнозы.

Например для маленьких домов дерево прогнозирует с помощью среднего для таких же домов соответствующим образом и для больших.

Слайд 7:

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

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

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

Слайд 8:

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

Слайд 9:

Какие особенности есть у CatBoost’а?

1) Ordered boosting (упорядоченный бустинг) – что это – основные моменты:

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

Так это и происходит. Разбиение происходит так:

У нас 6 наблюдений, по 3 мы строим дерево, а по другим 3 считаем новый прогноз.

Это первый момент, второй момент касается расчета прогноза (output value). В стандартном бустинге в качестве output value берется среднее значение в листе (мы построили дерево, разбили листы, у нас в каждом конечном листе получился какой-то набор наблюдений и мы берем для прогноза на следующей итерации среднее значение). Здесь же берется не среднее значение, а каждому наблюдению, если у него есть характеристика data то они выстраиваются в хронологическом порядке, если нет, то назначается случайным образом порядковый номер. И грубо говоря каждое следующее наблюдение (прогноз по нему) строится на основе предыдущих.

Если бы это был обычный бустинг то для 6 наблюдений в качестве нового прогноза мы взяли бы средний из этих 6, а в CatBoost’е делается это так: для 3 и 4 элементов мы берем значения 1 и 2, а для 5 и 6 элемента мы берем значения с 1 по 4. Так как обычно элементов очень много и если каждое значение считать на основе предыдущих, то это будет очень затратно с расчетной точки зрения, поэтому число моделей это корень из числа элементов. Если бы у нас было 25 элементов, то у нас было бы не 24 модели, а 5 – мы бы разбили выборку по 5 элементов в каждой и строили бы следующие 5 по предыдущим 5.

Слайд 10:

CatBoost – это категориальный бустинг, т.е. он заточен по то, чтобы хорошо кодировать категориальные признаки. Обычно самый распространенный способ категориальных признаков это их кодировка с помощью One-Hot Encoding:

У нас есть 5 наблюдений и есть категория «город», т.е. оно не численное, а это название города. Мы можем взять все города, которые только могут быть, например у нас Москва и Питер и соответственно магазин может находится либо в Москве либо в Питере, стало быть если магазин в Москве, то переменная Москва будет = 1, а Питер 0 и наоборот, т.е. переменная принимает только 2 значения. Проблема One-Hot Encoding’a заключается в том, что если городов не 2, а 2000, то у нас будет 2000 переменных у которых будет всего 2 значения, что неудобно.

Как эту проблему решили в CatBoost?Используют Ordered Target Encoding:

Смысл в следующем – мы хотим что-то предсказать с помощью нашей модели, например РТО (товарооборот) магазина. Берутся все наблюдения по категориальному признаку, т.е. если у нас не цифрами а буквами обозначается переменная «город» и мы можем выбрать город Москва и поскольку мы предсказываем РТО то берем все наблюдения с региона Москва. Для всех этих наблюдений значение переменной вместо города Москва будет средним значением того показателя, который мы хотим предсказать. То есть, если у нас 4 наблюдения с городом Москва и у этих Московских магазинов средние значения РТО 600 к рублей, то у нас вместо слова Москва в переменную регион напишем 600 к. Далее берем наблюдения например для Питера, видим что среднее значение РТО для Питера 500к, пишем 500. Берем дальше Нижний Новгород там 400к и т.д. Получается, что у нас вместо большого количества переменных, у которых будет значение 1 или 0 будет одна переменная регион, но вместо названия города будет среднее значение того показателя, который мы хотим предсказать. НО, поскольку это CatBoost, мы используем не просто Target Encoding, а Ordered (упорядоченный) TE. Смысл такой же как и с Ordered бустингом – мы берем не среднее значение по всем наблюдениям с этим городом (признаком), а берем значения в хронологической последовательности, на основе предыдущих, т.е. например для 1 и 2 наблюдения среднее будет 550, для 3 наблюдения по первым трем будет 500, а для 4 по всем 4 – 525.

Последняя особенность CatBoost, на которую следует обратить внимание, это то, как строится дерево. В отличие от всех стандартных методов, с которыми мы знакомы, в CatBoost используются симметричные деревья:

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

В CatBoost берется весь data-set и для всего датасета смотрят какая переменная делит этот датасет лучше всего (например по показателю минимальной дисперсии). Потом определяем вторую лучшую переменную и так далее, в зависимости от глубины дерева, которую мы хотим. В данном примере мы взяли весь датасет и выяснили, что его лучше всего делит доход больше или меньше 50, на втором месте количество конкурентов – больше 1 или нет. При построении дерева мы не тратим время на каждый узел, чтобы определить, какую переменную использовать для его дележки, т.е. выбираем только 1 раз вначале. ВАЖНО – такое дерево (выбор переменных) только на 1 итерацию.

Слайд 11

Пример использования:

Авито выкладывали огромный датасет, в котором содержалось множество данных, таких как – что за объект выложен на сайт, кто его выложил, его стоимость (например платье, велосипед или недвижимость). Помимо текстовой ифнормации есть и картинки, но работать мы будем с текстом.

Обучаться будем на train.csv, а проверять качество модели на test.csv. Модель соответственно CatBoost на GPU. (обучение на GPU происходит быстрее чем на CPU).

Работать будем на кагловском ноутбуке: - удаленная машина на серверах кагла.

По размерности:

Первое – количество строк для обучения, второе для теста.

Слайд 12:

Здесь мы проходимся по папке с входными данными, импортируем нужные библиотеки.

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

Слайд 13

Вот некоторая визуализация этих признаков:

Здесь показано какие есть признаки и каких типов данных. Для нас важен 17 признак – вероятность того, что сделка будет совершена.

Тут показано сколько у нас уникальных значений в каждой категории.

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

Слайд14:

Соотношение городов и количества объявлений:

Также можно посмотреть какие категории товаров у нас есть:

Интересно также посмотреть на топовые слова. Для этого используем библиотеку WordCloud и попросим 500 слов:

Слайд 15:

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

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

Слайд 16:

Мешок слов занимается тем, что показывает факт – а есть ли такое-то слово в таком-то предложении. В примере выше 4 предложения и есть факт наличия или отсутствия слова (например в 0 предложении есть слова are, hello и т.д.). Если там цифра 2, то это говорит о том, как часто слово встречалось.

Подход плох тем, что не учитывает «полезность» слов. Подход tfdf учитывает это. tf – частотность слова в документе, df – частотность слова по документАМ. В данном примере tf = ¼ (для 0 предложения для слова you), df = 4/2. Главное, что есть перевод в численные значения, на которых и будет обучаться модель.

Также мы будем пользоваться стоп словами – очень частотные слова, например местоимения, базовые глаголы или частицы. Эти слова важны в речи, но для обучения модели будут мешать, поэтому мы их выкидываем. Они берутся из библиотеки nltk. Количество – 2000.

tfdf берем из библиотеки sklearn. Обучаться будем на заголовках (title). Переводим наши заголовки из обучения и из теста в tfdf представление (последнии 2 строки на картинке).

Слайд 17:

Мы получим разреженную матрицу (большое количество 0), где для обучения 1,5 млн на 2к признаков.

Выглядит матрица следующим образом:

Слайд 18:

Далее идет работа над пропусками (цифры – количество пропусков). Чтобы их убрать, например, для стоимости мы усредняем стоимость и вставляем в пропуски:

Далее выделяем категориальные признаки для нашей модели CatBoost:

Тут регион, город, категория и т.д. – в общем важные параметры, а также выкидываем неважные параметры, например id пользователя.

Получаем такой набор категорий:

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

Соседние файлы в папке Проект(CatBoost)