Чудили ли сте се някога как уебсайтове като Zillow или Redfin оценяват цените на жилищата с голяма точност? Може да изглежда, че има много кодиране, но това е повече от това. Машинното обучение е комбинация от изкуство и наука. По време на пътуването си да стана инженер по машинно обучение, започнах да обичам да намирам модели в необработените данни. Особено съм много любопитен да намеря тенденции, които не се откриват лесно от човешки очи. В тази статия ще илюстрирам как успях да изградя модел за прогнозиране на цените на жилищата в Еймс, Айова, използвайки алгоритъм за линейна регресия.

Преди да монтирам набора от данни в модела, трябваше да премина през процеси на почистване на данни и инженерни функции.

Нулеви стойности:

Едно нещо, което винаги трябва да имаме предвид за машинното обучение е, че то не се разбира добре с липсващи стойности. Следователно трябваше да предприема следните стъпки при работа с нулеви стойности:

  • Премахнете всяка текстова колона, съдържаща една или повече нулеви стойности
  • Премахнете всяка цифрова колона с повече от 5% нулеви стойности
  • Попълнете всяка цифрова колона, съдържаща по-малко от 5% нулеви стойности с най-честата стойност (режим) в тази колона

Създайте функции:

Колони като „Yr Sold“, „Year Romod/Add“ и „Year Built“ няма да имат никакво полезно значение, когато са избрани като функции за модела. Преди да премахна тези колони, реших да създам смислени функции от тези колони. Затова комбинирах тези колони, за да създам полезни функции за модела

  • Изваждането на „Year Remod/Add“ от „Yr Sold“ ще ни даде броя години, изминали от реконструкцията на къщата
  • Изваждането на „Година на построяване“ от „Година на продажба“ ще ни даде броя години, изминали от построяването на къщата

Премахнете функциите:

Има някои колони, които не са полезни за нашия модел. По-долу са функциите, които изпуснах.

not_needed = ['Order', 'PID', 'Year Built', 'Year Remod/Add', 'Mo Sold', 'Yr Sold', "Sale Condition", "Sale Type", "Yr Sold"]

Праг на корелация за избор на характеристики:

След цялата трансформация все още трябваше да реша кои функции да избера за модела. Затова реших да избера функциите, които корелират най-много с целевата колона „SalePrice“. Зададох праг от 40%, което означава, че ако колона има по-малко от 40% корелация с целта, тя ще бъде премахната.

Таблицата по-горе илюстрира връзката на всяка функция с целевата колона „SalePrice“. Всичко под 40% не е полезно за модела и затова беше премахнато.

Категорични стойности:

За всяка текстова колона, която да се използва в модела, тя трябва да има числови стойности. Следователно трябваше да трансформирам всяка нечислова стойност в двоична стойност в рамките на колоните. Всяка колона, която може да бъде категоризирана като номинална променлива, е кандидат за преобразуване в категориален тип данни. За да конвертирате тези колони в категоричен тип данни:

  • Трябваше да задам ограничение за това колко уникални стойности трябва да има всяка колона и да премахна всяка колона, която надвишава ограничението.
  • От останалите колони, които не надвишават ограничението, премахнах колоните, които имат ниска вариация. Ниската вариация означава, че стойностите са почти идентични и следователно не са разпръснати
  • Преобразувах останалите колони в категоричен тип данни и създадох фиктивен набор от данни от тях
  • Накрая комбинирах оригиналния набор от данни с фиктивния набор от данни

За да се избегне дублирането на функцията, всяка функция с повече от 10 уникални стойности беше премахната.

Всяка колона, която показва повече от 95% в таблицата по-горе, означава ниска дисперсия. С други думи, тези колони нямат различни стойности и затова трябваше да бъдат премахнати.

За да направя стойностите в текстовите колони полезни за модела, преобразувах тези стойности в категоричен тип данни. След преобразуването създадох фиктивен набор от данни от тези категорични стойности и го комбинирах с оригиналния набор от данни. Накрая премахнах оригиналните колони, които бяха преобразувани във фиктивен набор от данни.

Проектиране на модела:

След почистване на данни и инженеринг на функции, сега беше време да изградим модела:

  • Използвайте всички колони като функции за модела
  • Използвайте методите за задържане и кръстосано валидиране, за да експериментирате с различен брой сгъвания
  • График на RMSE стойности от различни гънки (разделяне)

Горната функция приема брой сгъвания като параметър и връща RMSE за съответния K параметър. Превъртях функцията през различни гънки, за да намеря оптималната производителност (RMSE). Създадох речник, който да съдържа всяко число на сгъване със съответната му RMSE стойност.

Накрая визуализирах стойностите на RMSE със съответния им номер на сгъване.

Средноквадратична грешка (RMSE) е стандартното отклонение на остатъците (грешки при прогнозиране). Остатъчните стойности са мярка за това колко далеч са точките от данни от регресионната линия. RMSE е мярка за това колко разпръснати са тези остатъци. С други думи, той ни казва колко концентрирани са данните около линията на най-доброто прилягане. Освен RMSE, нека да видим колко точен е моделът за прогнозиране. Тъй като 20 сгъвания се представят относително по-добре от други комбинации, нека видим резултата за точност за 20 сгъвания.

The model is 87.4% accurate with cross-validation of 20 folds

Заключение:

Преди да монтирам функциите в модела, минах през процеса на почистване на данни и инженеринг на функции. Силно разчитайки на връзката между потенциалните характеристики и целта (продажна цена), ограничените познания за домейна в областта на жилищата и интуицията си, успях да измисля набор от функции за модела. Както можете да видите по-горе, моделът изпълнява около 33 000 RMSE с метода на задържане (разделяне на обучение/тест). Въпреки това, тъй като броят на сгъванията се увеличава, RMSE намалява, което е добра индикация. С други думи, колкото повече използваме всяка част от набора от данни за обучение и тестване, толкова по-малко предубеден е нашият прогнозен модел. При 20 сгъвания RMSE спадна до около 27800 RMSE, което означава 87,4% точност. Вярвам, че наличието на достатъчно познания в областта е много важно в инженерството на функции. Целта ми е да минимизирам RMSE, като науча повече за жилищния пазар, за да пасна на моя модел с най-относителните характеристики.

Благодаря ви, че прочетохте.

Аплодисментите са добре дошли.