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

Для построения этой модели я использовал Python, включая библиотеки Pandas, Numpy и Scikit-learn, а также Seaborn и Matplotlib для графиков.

В этом наборе данных более 2000 строк и около 80 столбцов, но не все из них заполнены: первая проблема - это БОЛЬШОЙ объем отсутствующих данных!

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

train['Lot Frontage'] = train.groupby('Neighborhood')['Lot Frontage'] = train.groupby('Neighborhood')['Lot Frontage'].transform(lambda x: fillna(x.mean())

Другие категориальные ячейки могут быть заполнены значением режима (используя тот же фрагмент кода выше и заменяя mean() на mode()), или 0, где это имеет смысл, или N / A в каких-то категоричных столбцах.

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

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

Еще одна интересная вещь, на которую стоит обратить внимание, - это то, как распределяются районы (то есть насколько они популярны), чтобы иметь предварительное представление о том, будет ли эта переменная важна в конечном итоге при окончательном определении цены дома.

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

Пора моделировать! Но прежде чем сразу приступить к делу, я попытался преобразовать как можно больше категориальных переменных в числовые значения, чтобы мой алгоритм мог быть как можно более легким с точки зрения вычислений. Некоторые из категориальных переменных описывают качество (обычно от плохого до отличного), и в таком случае довольно легко просто поменять эти ранги на числа, т. Е. плохо соответствует 1, удовлетворительно соответствует 2 и так далее…

Итак, я просто определил словарь, что-то вроде cat_dict = {'Po':1, 'Fa':2, 'TA':3, 'Gd':4, 'Ex':5}, и передал его в .replace() метод, примененный к соответствующим столбцам! После этого вы можете подумать, что вы закончили сопоставление категориальных столбцов, но, возможно, это не так! Интересно, что это не единственные переменные, которые можно преобразовать в числа: например, если вы посмотрите на MS Zoning, эти значения упорядочены по сравнению с продажной ценой, Так почему бы не преобразовать их тоже в числа? Другими словами, относитесь к ним так, как будто FV равно отлично, а A или I равны плохо, и соответственно расположите все зоны посередине.

После отбрасывания пары выбросов, фиксации оставшихся категориальных переменных и отбрасывания всех предикторов с коэффициентом корреляции с продажной ценой ниже 5%, настало время моделировать!

Не забывайте тренироваться / тестировать сплит! Вы хотите подогнать свою модель к набору поездов, а затем проверить, как она работает с невидимыми данными, то есть с вашим набором тестов. Эта процедура также поможет вам предотвратить переобучение и понять компромисс между смещением и дисперсией вашей модели, когда вы играете с объемом обучающих и тестовых данных. В итоге я выбрал соотношение 80/20, но и 90/10 работало нормально.

Какую модель мы должны использовать сейчас? Подскажу: я пробовал классическую линейную регрессию и гребень, но в итоге выбрал лассо, потому что он работал значительно лучше. Регрессия лассо также очень полезна в подобных случаях, когда у вас есть масса переменных для начала: этот метод особенно радикален и помогает быстрее избавиться от менее важных предикторов! И не забывайте, что Lasso потребует от вас масштабирования данных (только предикторов, а не цели!), Чтобы штрафные коэффициенты могли быть справедливыми среди всех переменных.

Обратной стороной этого метода является выбор оптимального гиперпараметра α. На самом деле вам не обязательно выбирать это на ровном месте, скорее всего, вам нужно написать алгоритм, который сделает это за вас. Я только что узнал о GridSearchCV и вот что использовал! Поскольку я понятия не имел о диапазоне этого α и не хотел, чтобы мой ноутбук зависал в итерациях в течение нескольких часов, я разбил исследование на две части: сначала я рассмотрел более широкий диапазон чисел, расположенных через довольно большие интервалы. . Как только я нашел первое оптимальное значение, я разбил исследование на более плотный интервал вокруг этого первого оптимального значения. Я был удивлен, так как это заняло всего несколько минут! Те, кто не знаком с GridSearch, не поймут, о чем я говорю, в том числе потому, что мое объяснение не является исчерпывающим, но это довольно сложный шаг, который требует отдельной публикации в блоге, и, возможно, я напишу об этом. В качестве альтернативы вы можете использовать LassoCV, чтобы найти свой лучший параметр: он не такой мощный, но все же подходит для этой цели.

Как только вы найдете свой гиперпараметр, вы готовы создать экземпляр и подогнать под свою модель! Моя регрессия по лассо позволила мне избавиться от 83 параметров из 179, которые у меня были изначально, довольно здорово! Кроме того, что довольно интересно, моя выигрышная особенность - это то, что я придумал сам! В исходном наборе данных было 4 столбца относительно площади в квадратных футах: 1-й этаж, 2-й этаж, надземный (который был суммой 1-го и 2-го этажей) и подвал. Я отбросил все эти колонны и создал новую: Общая площадь, равная площади в квадратных футах над землей плюс квадратные метры подвала, и это оказалось самой важной особенностью безусловно в определении окончательной цены дома в Эймсе!

На втором и третьем месте мы находим соответственно Общее качество и Год постройки, что имеет большой смысл. Конечно, не все основные предикторы положительны: некоторые другие переменные также могут быть очень сильными в снижении цены на дом. Фактически, в четвертом месте мы видим, что квадратный метр недостроенного подвала отрицательно коррелирует с ценой дома. Если есть что-то, что я узнал из этого проекта, так это то, что люди в Эймсе действительно любят свои подвалы и гаражи!

Итак, наконец, моя первая модель сделана с оценкой перекрестной проверки 90,2% на моем наборе поездов и 88,6% на тестовом наборе, что довольно неплохо! Тот факт, что оценка поезда немного выше, чем тестовая, означает, что модель немного переоборудована, поэтому для будущих разработок я рассмотрю возможность отказаться от дополнительных переменных или, возможно, немного поиграть с моим соотношением поезд / тест. Я также реализую некоторые полиномиальные функции и попытаюсь логарифмически преобразовать положительно искаженные переменные (сделав отношения с целью более линейными) и посмотрю, как это сработает!