Kodowanie sezonowości w celu ulepszenia naszych modeli wyceny nieruchomości

Wstęp
W Homebound zespół Machine Learning & Pricing jest odpowiedzialny za opracowanie i utrzymanie modelu automatycznej wyceny (AVM) w celu dokładnego przewidywania wartości nieruchomości. Nazwany tutaj modelem wyceny Homebound (HVM), cechy takie jak wielkość domu, widok nieruchomości, bliskość głównych dróg i wiele innych są wykorzystywane do oszacowania ceny nieruchomości. Dzięki temu nasz zespół ubezpieczeniowy może szybko i dokładnie wycenić nieruchomości dla klientów, którzy chcą sprzedać swoje domy za pośrednictwem portalu Homebound Property Purchase Portal .
Nasz zespół nieustannie pracuje nad ulepszeniem HVM, projektując nowe funkcje, modyfikując architekturę modelu i poprawiając jakość danych. Jedną z funkcji, którą niedawno wprowadziliśmy do naszych modeli, jest sezonowość. Pora roku, w której decydujesz się na zakup lub sprzedaż domu, może mieć wpływ na to, ile jest warta Twoja nieruchomość. W zależności od lokalizacji domu ceny są wyższe w miesiącach wiosennych i letnich, a niższe w okresie zimowym. Podczas gdy nasze początkowe modele naiwnie uchwyciły niektóre aspekty sezonowości za pomocą funkcji, takich jak czas, jaki upłynął od ostatniej sprzedaży domu, chcieliśmy wyraźnie zakodować aspekty sezonowości w naszych modelach.
Kodowanie sezonowości
Tradycyjnie cena aukcji domu zależy od niedawno sprzedanych, porównywalnych domów w pobliżu lub ofert. Podczas gdy sprzedawca wystawiający swój dom może nie planować, kiedy będzie sprzedawał swój dom, rzeczoznawca lub agent nieruchomości uwzględnia sezon w cenie oferty swojego domu. W przypadku modeli uczenia maszynowego ta sezonowość musi być jawnie uwzględniona w modelu i można to zrobić na wiele sposobów.
Miesięczny
Kodowanie sezonowości w ciągu miesiąca, w którym wystąpiło zdarzenie, porządkowe lub kategoryczne, jest prawdopodobnie najczęstszym i najprostszym sposobem wyodrębnienia cech sezonowych. W Homebound jest to miesiąc, w którym nieruchomość została wystawiona na sprzedaż. Chociaż jest to łatwe do zaimplementowania i zinterpretowania, metoda ta często nie spełnia tego, co model powinien zrozumieć na temat sezonowości. Na przykład, jeśli te dane są zakodowane na gorąco, każdy miesiąc jest uważany za niezależny, podczas gdy w rzeczywistości wiemy, że istnieje związek w czasie. Jeśli te dane są porządkowe, uwzględniamy podobieństwo między miesiącami, takimi jak styczeń i luty, jednocześnie oddzielając odmienne miesiące, takie jak styczeń i czerwiec, ale następnie natrafiamy na kwestię stycznia i grudnia, które są reprezentowane jako najmniej podobne miesiące.

Wiadro
Innym sposobem przedstawienia sezonowości jest grupowanie lub grupowanie czasu, który może być istotny dla przewidywanego wyniku. Na przykład ręcznie pogrupowaliśmy daty list na dwa potencjalnie istotne sposoby, kwartalnie i sezonowo. Chociaż zmniejsza to wymiarowość i ręcznie koduje aspekty postrzeganej sezonowości, te same problemy omówione powyżej utrzymują się zarówno w przypadku kategorycznych, jak i porządkowych reprezentacji tych grup zbiorczych.

Cykliczny
Chociaż zarówno miesięczne, jak i kubełkowe reprezentacje czasu pomagają w interpretacji i przedstawianiu sezonowości jako cech modelu, mają trudności z uchwyceniem cykliczności czasu i pór roku. Alternatywnym sposobem uchwycenia tego cyklu sezonowego jest przekształcenie dat w roku w dwuwymiarową, sinusoidalną i kosinusoidalną przestrzeń cech. Odbywa się to poprzez normalizację numerycznego dnia roku do wartości między 0 a 1, przekształcenie tych wartości między przedziałami sinus i cosinus od 0 do 2π, a następnie uzyskanie sinusa i cosinusa tych wartości (przypomnij sobie koło jednostkowe z trygonometrii ). Każdy dzień w roku jest następnie reprezentowany przez unikalną parę wartości sinus i cosinus, która tworzy okrąg, jak pokazano na poniższym rysunku.

Wadą tej metodologii jest brak możliwości interpretacji. Posiadanie dwóch cech reprezentujących czas utrudnia rozszyfrowanie ważności cechy i jej ogólnego wpływu na zmienną wynikową. Ponadto niektóre modele, takie jak metody oparte na drzewach, mogą mieć problem z tworzeniem użytecznych podziałów na dwie cechy reprezentujące jeden element, sezonowość. Jednym z potencjalnych rozwiązań tego problemu jest stworzenie podobnej, jednowymiarowej cechy cyklicznej, która jest interpretowana jako N dni od określonego, wybranego punktu w czasie. Jest to równoważne przedstawieniu czasu jako znormalizowanej reprezentacji czasu cosinusowej z góry, gdzie każdy dzień dzieli N dni od 1 stycznia do zbieżności N w lipcu. Prowadzi to jednak do tego, że dwie różne pory roku są reprezentowane przez tę samą wartość.

Ostatecznie nie ma „właściwego” sposobu kodowania sezonowości. Każda z tych metod ma swoje zalety i wady w zależności od problemu, wymagań biznesowych i wybranego modelu. Dlatego jedynym sposobem na rzetelną ocenę, która metoda była najlepsza dla HVM, były eksperymenty.
Ocena eksperymentów
Aby określić, jak najlepiej reprezentować sezonowość w HVM, przeprowadziliśmy eksperymenty w celu określenia funkcji, która zminimalizowała błąd, zgodnie z definicją średniego średniego błędu precyzji (MAPE), i ostatecznie zapewniła największy wzrost dokładności modelu. W Homebound używamy mlflow do śledzenia eksperymentów, przechowywania szczegółów modelu i oceny kluczowych wskaźników w różnych regionach. Poniższa tabela zawiera informacje o przeprowadzonych eksperymentach sezonowości.

Biorąc pod uwagę, że cykliczne kodowanie cech jest zwykle używane w modelach nieopartych na drzewach, często w modelach głębokiego uczenia, byliśmy zaskoczeni, widząc, że daje nam to największy wzrost wydajności modelu. HVM jest zespołem metod opartych na drzewach, dlatego nie byliśmy pewni, czy jest w stanie wykryć sezonowość cen domów z dwuwymiarowej przestrzeni cech.
Jeśli nie masz pewności, jak zakodować sezonowość w swoich projektach, wypróbuj te metody, możesz być zaskoczony tym, co działa!
Kolejne kroki i przyszłe prace
Jak wspomniano wcześniej, jednym z głównych celów naszych zespołów jest pomoc zespołowi ubezpieczeniowemu Homebound w składaniu szybkich, dokładnych i uczciwych ofert potencjalnym klientom Homebound. Zapewnienie większej przejrzystości prognoz HVM to jeden ze sposobów na poprawę partnerstwa między naszymi zespołami. Chociaż włączenie dwuwymiarowych funkcji cyklicznych było świetne do zwiększenia wydajności modelu, nieco zmniejszyło jego interpretację.
Jednym ze sposobów, w jaki zespół uczenia maszynowego uzyskuje wgląd w poszczególne prognozy i wpływ sezonowości na prognozy, są wartości Shapleya . W przyszłości zapewnienie tego samego poziomu interpretowalności prognoz HVM również zespołowi ds. underwritingu mogłoby pomóc nam w iteracji i lepszym zrozumieniu sezonowości cen domów na różnych rynkach regionalnych oraz ulepszeniu naszych modeli.
Implementacja Pythona
Ta sekcja skupi się przede wszystkim na implementacji różnych funkcji sezonowości omówionych powyżej w Pythonie.
Zaczynamy od zaimportowania pakietów potrzebnych do stworzenia atrapy Pandas DataFrame zawierającej daty z ostatnich trzech lat (2019–2021), z której można wyodrębnić cechy sezonowości.
# import packages
import pandas as pd
import numpy as np
# create dummy dataframe of dates over the past 3 years (2019-2021)
df = pd.DataFrame()
df['date'] = pd.Series(pd.date_range('2019', periods=1096, freq='D'))
# extract month number for ordinal representation of months
df['month_ordinal'] = df['date'].dt.month
# extract month name for categorical representation of months
df['month_categorical'] = df['date'].dt.month_name()
# extract quarters for bucketed representation of time
# note: the last two characters are removed to keep the quarter without year
df['quarter'] = df['date'].dt.to_period('Q').astype('str').str[-2:]
# create list of desired month number to group mapping
seasons = ['Winter', 'Winter', 'Spring', 'Spring', 'Spring', 'Summer',
'Summer', 'Summer', 'Fall', 'Fall', 'Fall', 'Winter']
# map month number (1-12) to desired group (list created above)
season_month_map = dict(zip(range(1,len(seasons)+1), seasons))
# map extracted month number (month_ordinal) to desired group
df['season'] = df['month_ordinal'].apply(lambda x: season_month_map[x])
# extract day of year from date
df['day_of_year'] = df['date'].dt.dayofyear
# create cyclic sine and cosine normalized representation of time using extracted day of year
# note: divide by 366 to normalize & account for leap years (max number of days in a year)
# note: using just cos_date feature is equivalent to the one-dimnesional feature described
df['sin_date'] = np.sin(2 * np.pi * df['day_of_year']/366)
df['cos_date'] = np.cos(2 * np.pi * df['day_of_year']/366)

Homebound zatrudnia! Zainteresowany pracą w Homebound? Sprawdź naszą stronę kariery !
Aby dowiedzieć się więcej o Homebound, odwiedź witrynę Homebound lub przejdź do bloga Homebound Technology Blog , aby zobaczyć więcej historii naszego zespołu.
Bibliografia
[1] Araj, Wiktoria. „Najlepsza pora roku na zakup domu”. Rocket Mortgage , 1 listopada 2022,https://www.rocketmortgage.com/learn/best-time-of-year-to-buy-a-house.
[2] Bescond, Pierre-Louis. „Cyclical Features Encoding, Najwyższy czas!”, Ku Data Science , 8 czerwca 2020 r.,https://towardsdatascience.com/cyclical-features-encoding-its-about-time-ce23581845ca.
[3] Zbiornik. „Ai w podróży, część 2: reprezentowanie cech cyklicznych i geograficznych”. Medium — Życie w Hopperze , 27 kwietnia 2018 r.,https:///life-at-hopper/ai-in-travel-part-2-representing-cyclic-and-geographic-features-4ada33dd0b22.