Mengkodekan Musiman untuk Meningkatkan Model Penilaian Properti Kami

pengantar
Di Homebound, tim Machine Learning & Pricing bertanggung jawab untuk mengembangkan dan memelihara Automated Valuation Model (AVM) untuk memprediksi nilai properti secara akurat. Dijuluki di sini sebagai Homebound Valuation Model (HVM), karakteristik seperti ukuran rumah, tampilan properti, kedekatan dengan jalan utama, dan masih banyak lagi digunakan untuk memperkirakan harga properti. Hal ini memungkinkan tim underwriting kami dengan cepat dan akurat menilai properti bagi pelanggan yang ingin menjual rumah mereka melalui Portal Pembelian Properti Homebound .
Tim kami terus berupaya meningkatkan HVM dengan merekayasa fitur baru, memodifikasi arsitektur model, dan meningkatkan kualitas data. Salah satu fitur yang baru-baru ini kami masukkan ke dalam model kami adalah musiman. Waktu tahun di mana Anda memutuskan untuk membeli atau menjual rumah Anda dapat berdampak pada seberapa besar nilai properti Anda. Bergantung pada lokasi rumah, harga cenderung lebih tinggi selama musim semi dan musim panas dan lebih rendah selama musim dingin. Sementara model awal kami secara naif menangkap beberapa aspek musiman melalui fitur seperti jumlah waktu sejak rumah terakhir dijual, kami ingin secara eksplisit menyandikan aspek musiman ke dalam model kami.
Mengkode Musiman
Secara tradisional, harga daftar rumah bergantung pada rumah yang baru dijual, sebanding di dekatnya, atau perusahaan. Sementara penjual yang mendaftarkan rumah mereka mungkin tidak berencana untuk menjual rumah mereka, penilai atau agen real estat memasukkan musim ke dalam harga daftar rumah mereka. Untuk model pembelajaran mesin, musiman ini harus disertakan secara eksplisit dalam model, dan dapat dilakukan dengan berbagai cara.
Bulanan
Mengkodekan musiman selama bulan terjadinya suatu peristiwa, baik secara ordinal maupun kategoris, mungkin merupakan cara yang paling umum dan paling sederhana untuk mengekstrak fitur musiman. Di Homebound, ini adalah bulan di mana sebuah properti terdaftar untuk dijual. Meskipun mudah diimplementasikan dan diinterpretasikan, metode ini sering kekurangan apa yang kita ingin model pahami tentang musiman. Misalnya, jika data ini dikodekan satu kali, setiap bulan dianggap independen, padahal kenyataannya kita tahu ada hubungan dalam waktu. Jika data ini ordinal, kami memperhitungkan kesamaan antara bulan seperti Januari dan Februari, sementara menjauhkan bulan yang berbeda seperti Januari dan Juni, tetapi kemudian mengalami masalah Januari dan Desember sebagai bulan yang paling tidak mirip.

Bucket
Cara lain untuk merepresentasikan musiman adalah dengan mengelompokkan, atau mengelompokkan waktu yang mungkin relevan dengan hasil yang diprediksi. Misalnya, kami mengelompokkan tanggal daftar secara manual menjadi dua cara yang berpotensi relevan, triwulanan dan musiman. Meskipun hal ini mengurangi dimensi dan secara manual mengkodekan aspek musiman yang dirasakan, masalah yang sama yang dibahas di atas tetap ada dengan representasi kategorikal dan ordinal dari grup yang dikelompokkan ini.

Berhubung dgn putaran
Meskipun representasi waktu bulanan dan ember membantu dalam menafsirkan dan merepresentasikan musiman sebagai fitur model, mereka kesulitan menangkap sifat siklus waktu dan musim. Cara alternatif untuk menangkap siklus musiman ini adalah dengan mengubah tanggal dalam satu tahun menjadi ruang fitur dua dimensi, sinus dan kosinus. Hal ini dilakukan dengan menormalkan hari numerik dalam setahun ke nilai antara 0 dan 1, mengubah nilai tersebut antara interval sinus dan kosinus 0 dan 2π, dan kemudian memperoleh sinus dan kosinus dari nilai tersebut (pikirkan kembali ke lingkaran satuan dari trigonometri ). Setiap hari dalam setahun kemudian diwakili oleh pasangan nilai sinus dan kosinus unik yang membentuk lingkaran, seperti yang terlihat pada gambar di bawah ini.

Satu kelemahan dari metodologi ini adalah kurangnya interpretasi. Memiliki dua fitur yang merepresentasikan waktu membuatnya lebih sulit untuk menguraikan kepentingan fitur dan efek umumnya pada variabel hasil. Selain itu, beberapa model seperti metode berbasis pohon, mungkin mengalami kesulitan dalam membuat pemisahan yang berguna pada dua fitur yang mewakili satu elemen, musiman. Salah satu solusi potensial untuk masalah ini adalah membuat fitur siklik satu dimensi serupa yang ditafsirkan sebagai N hari dari titik waktu tertentu yang dipilih. Ini sama dengan merepresentasikan waktu hanya sebagai representasi kosinus waktu yang dinormalisasi dari atas, di mana setiap hari berjarak N hari dari tanggal 1 Januari hingga N bertemu di bulan Juli. Namun hal ini menyebabkan dua waktu berbeda dalam setahun diwakili oleh nilai yang sama.

Pada akhirnya, tidak ada cara yang “benar” untuk menyandikan musim. Masing-masing metode ini memiliki pro dan kontra berdasarkan masalah yang dihadapi, persyaratan bisnis, dan model yang dipilih. Oleh karena itu, satu-satunya cara kami dapat mengevaluasi secara adil metode mana yang terbaik untuk HVM adalah melalui eksperimen.
Mengevaluasi Eksperimen
Untuk menentukan cara terbaik merepresentasikan musiman di HVM, kami menjalankan eksperimen untuk menentukan fitur yang meminimalkan kesalahan, sebagaimana didefinisikan oleh Mean Average Precision Error (MAPE), dan pada akhirnya memberikan peningkatan terbesar dalam akurasi model. Di Homebound, kami menggunakan mlflow untuk melacak eksperimen, menyimpan detail model, dan mengevaluasi metrik utama di berbagai wilayah. Tabel di bawah berisi informasi tentang eksperimen musiman yang dijalankan.

Mengingat pengkodean fitur siklik umumnya digunakan dalam model berbasis non-pohon, seringkali dalam model pembelajaran mendalam, kami terkejut melihatnya memberi kami peningkatan terbesar dalam kinerja model. HVM adalah ansambel metode berbasis pohon, dan oleh karena itu kami tidak yakin tentang kemampuannya untuk mengambil harga rumah musiman dari ruang fitur dua dimensi.
Jika Anda tidak yakin tentang cara menyandikan musiman untuk proyek Anda, cobalah metode ini, Anda mungkin akan terkejut dengan apa yang berhasil!
Langkah Selanjutnya & Pekerjaan Masa Depan
Seperti disebutkan sebelumnya, salah satu tujuan utama tim kami adalah membantu tim underwriting Homebound dalam membuat penawaran yang cepat, akurat, dan adil kepada calon pelanggan Homebound. Memberikan lebih banyak penjelasan ke dalam prediksi HVM adalah salah satu cara kami dapat meningkatkan kemitraan antara tim kami. Meskipun menggabungkan fitur siklik dua dimensi sangat bagus untuk meningkatkan kinerja model, hal itu agak menurunkan kemampuan interpretasi model.
Salah satu cara tim Machine Learning mendapatkan wawasan tentang prediksi individu dan efek musiman pada prediksi adalah melalui nilai Shapley . Di masa mendatang, memberikan tingkat interpretasi yang sama terhadap prediksi HVM untuk tim underwriting juga dapat membantu kami mengulangi dan meningkatkan pemahaman kami tentang musiman harga rumah dengan lebih baik di pasar regional yang berbeda dan menyempurnakan model kami.
Implementasi Python
Bagian ini akan berfokus terutama pada penerapan berbagai fitur musiman yang dibahas di atas, dengan Python.
Kami mulai dengan mengimpor paket yang diperlukan untuk membuat boneka DataFrame Pandas yang berisi tanggal selama tiga tahun terakhir (2019–2021) untuk mengekstraksi fitur musiman.
# 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 sedang merekrut! Tertarik bekerja di Homebound? Lihat halaman karir kami !
Untuk mempelajari lebih lanjut tentang Homebound, kunjungi situs web Homebound atau buka Blog Teknologi Homebound untuk melihat lebih banyak cerita dari tim kami.
Referensi
[1] Araj, Victoria. “Waktu Terbaik Tahun Ini untuk Membeli Rumah.” Hipotek Roket , 1 November 2022,https://www.rocketmortgage.com/learn/best-time-of-year-to-buy-a-house.
[2] Bescond, Pierre-Louis. “Encoding Fitur Siklus, It's about Time!”, Menuju Ilmu Data , 8 Juni 2020,https://towardsdatascience.com/cyclical-features-encoding-its-about-time-ce23581845ca.
[3] Hopper. "Ai dalam Perjalanan, Bagian 2: Mewakili Fitur Siklik dan Geografis." Sedang — Kehidupan di Hopper , 27 April 2018,https:///life-at-hopper/ai-in-travel-part-2-representing-cyclic-and-geographic-features-4ada33dd0b22.