Будучи новичком в мире науки о данных, я подумал, что это будет хороший проект для реализации всего машинного обучения, которому я уже научился. Прогнозирование цен на жилье - это соревнование Kaggle для новичков в области науки о данных, которое позволяет экспериментировать с проектированием функций и построением моделей. Моя модель получила RMSE (среднеквадратическую ошибку) около 0,1274 с точностью ~ 90%.

В этом посте мы узнаем:

  1. Интерпретация случайных лесов
  2. Настройка параметров случайных лесов
  3. Важность функций

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

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

Используя 10 деревьев (по умолчанию), я получил точность обучения ~ 96%, как показано ниже. Это вводит в заблуждение, так как во время теста поезда может быть переоснащение. (Важно удалить все нули перед использованием случайных лесов. Для этого первого теста я просто преобразовал их в другой столбец. Например, я создал столбец с именем IsLotAreaNull, и значение было равно 1, если образец не содержал никакой информации. )

Чтобы отслеживать переоснащение, мы разделяем обучающие данные на обучающий набор и набор проверки. Модель будет обучена на обучающем наборе и оценена на проверочном наборе. Таким образом, модель будет оцениваться на основе данных, которых она раньше не получала. Точность проверки падает до 80%, в то время как точность обучения составляет ~ 97%, что указывает на сильное переоснащение обучающих данных, как показано ниже.

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

Алгоритм RandomForestRegressor объясняется следующим образом:

  1. На каждом узле оцениваются все функции для лучшего разделения. Лучшее разделение - это такое разделение, которое дает наименьшую взвешенную среднеквадратическую ошибку между фактической ценой образцов и прогнозируемой ценой в узлах, на которые оно разбито. Прогнозируемая цена - это просто среднее значение цен всех образцов в этом узле.
  2. В приведенном выше дереве Общее качество (общее качество дома, оцененное от 1 до 10) - это характеристика, которая дала наилучшее разделение при оценке на уровне 7,5. Это объяснено выше. Если общее качество было меньше или равно 7,5, прогнозируемая цена составляла 158492,645. Если TotalQual было больше 7,5, прогнозируемая цена составляла 309716,493. Когда тестируется новый невидимый образец, он проходит через каждый из этих узлов, пока не заканчивается в последнем узле, и средняя (указанная как значение на диаграмме выше) цена всех образцов в этом узле считается прогнозируемой ценой.
  3. Каждый узел всегда разделяется на два других узла. Глубину дерева (уровней) можно указать в scikit-learn для RandomForestRegressor как max_depth. В дереве, показанном выше, max_depth равно 3.
  4. min_samples_leaf - минимальное количество выборок, которое должно присутствовать в каждом узле дерева. Это указано для ограничения переобучения. Если предоставлено большое количество, дерево будет разделено только так, чтобы конечные листовые узлы содержали по крайней мере min_samples_leaf количество выборок.
  5. max_features - еще один параметр, который можно указать для ограничения переобучения. Если max_features равно 0,5, только случайная половина всех функций рассматривается и оценивается для поиска лучшего разделения.
  6. n_estimators - параметр для указания количества деревьев. Всегда лучше иметь большое количество деревьев, но это может стать дорогостоящим в вычислительном отношении. Сотни деревьев - это нормально. При анализе и настройке гиперпараметров обычно используется 10–40 деревьев.
  7. n_jobs - количество ядер процессора, на котором алгоритм работает для распараллеливания. Значение -1 означает, что алгоритм использует все доступные ядра ЦП.

Причины использования деревьев решений вместо линейной регрессии:

  1. Не требуется масштабирования функций. Случайные леса инвариантны к любым монотонным преобразованиям, и любая такая операция просто смещает точки разделения соответственно.
  2. Если нет линейной зависимости, линейная регрессия не может установить взаимосвязь и потребует большого количества инженерных работ. Случайные леса не нуждаются в таком высоком уровне функциональной инженерии.
  3. Линейная регрессия требует регуляризации, чтобы предотвратить переоснащение. Случайные леса, являющиеся ансамблевыми методами, имеют встроенную регуляризацию и устойчивы к переобучению.
  4. Рассмотрим ситуацию, когда площадь дома, город и близость к центру являются характеристиками для прогнозирования цены на жилье. Интуитивно можно было ожидать, что те, которые расположены ближе к центру города, в более крупных районах и крупных городах, будут стоить дороже. Что, если бы нужно было спрогнозировать цену дома в таком маленьком городе, как Блэксбург, где близость к центру даже не имеет значения? Случайные леса хорошо отражают такие отношения. Возможно, они могут сначала разделиться на город, а затем решить, имеет ли значение для этого города близость к центру. Деревья хорошо обрабатывают хаотические данные, а большинство реальных данных несколько хаотичны.

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

Мы смотрим на распределение SalePrice, показанное выше. Он смещен влево. Применение преобразования журнала к SalePrice делает распределение нормальным, как показано ниже.

Это поможет Лесу равномерно разделить узлы деревьев, как показано выше. Первый узел разделяется на 596 и 364 выборки соответственно, в отличие от 808 и 152 ранее. Это увеличивает точность проверки до ~ 84%.

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

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

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

С этого момента я подробно расскажу обо всех выполненных функциях предварительной обработки:

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

Столбец «PeakSeason» был создан, так как дома, проданные в течение 4, 5, 6 и 7 месяцев, по-видимому, имели более высокую цену SalePrice, как показано ниже.

LotFrontage имел много нулевых записей. Я вменял эти записи, используя режим LotFrontage района, в котором находился дом. Некоторые районы показаны ниже.

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

  1. Преобразуйте их в уровни от 0 до (n-1). Недостатком этого метода является то, что он создает отношения на разных уровнях дерева, при этом они полностью независимы друг от друга.
  2. Чтобы преодолеть недостаток первого метода, рекомендуется преобразовывать категориальные сущности в фиктивные с помощью панд. Это создает независимые столбцы, на которые дерево решает разделиться, вместо того, чтобы создавать несуществующие связи. Я использовал максимум 15 категорий.

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

Используя некоторые методы переобучения, указанные ранее, и около 600 деревьев, случайный лес дал точность около 87,02% для набора проверки. Мы можем пойти еще дальше и наметить те особенности, которые важны для определения продажной цены дома.

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

Чтобы уменьшить переоснащение, мы также можем выбрать подмножество функций в зависимости от их важности. Здесь мы выбираем только те, у которых важность характеристик превышает 0,005 (основа для этого показателя не важна, поскольку это только относительный показатель). При этом и использовании перекрестной проверки точность возрастает до 88,25%.

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

Случайные леса - это ансамблевой метод, работающий на мешках, как упоминалось ранее. Регрессоры градиентного повышения - это деревья, которые действуют при повышении. Повышение - это механизм, при котором выборкам, которые не соответствовали дереву, дается более высокая вероятность их использования в следующем дереве. Таким образом, алгоритм фокусируется на повышении точности предсказания последовательно для всех выборок. Boosting использует слабых учеников и совершенствует их одного за другим. При использовании регрессоров с градиентным усилением точность перекрестной проверки подскочила до 89,80%, а RMSE снизилась до 0,1297.

Пожалуйста, найдите мою реализацию на Github. Спасибо за прочтение!