如何利用機器學習預測房價?
對於我在梅蒂斯的最後一個項目,我希望能包含過去三個月里所學到的東西,而預測波特蘭房價這個題目正符合我的要求,因為我能夠將網路爬取技術、文本自然語言處理,圖像上的深度學習模型以及梯度增強技術進行整合來實現這個項目。
下面你可以看到我抓取到的2016年7月至2017年7月這段時間內波特蘭市8300個獨戶住宅的銷售數據。
顯然,街區在這其中起了非常重要的作用。西山(紅色)是鎮上最昂貴的地區之一,而東波特蘭則便宜很多。平均售價為44.2萬美元。
我希望能夠在比街區更細粒度的水平上預測價格。例如,假設以下房子是彼此毗鄰的。
這些房子面積相同,在同一年份建成,並位於同一條街上。但是,一個明顯能讓人產生購買的慾望,而另一個則沒有。那麼Zillow或Redfin(美國的兩家大型房地產網站)或其他公司能夠僅僅依靠一些房屋的文字數據來預測它們的價格呢?他們不能。這就是為什麼我要把對房屋門口照片的分析作為其中一個特徵納入預測模型的原因。
當務之急就是要獲取到所有的數據。這比原本預想的要困難的多。首先,我使用波特蘭地圖的官方API來爬取波特蘭獨戶住宅的銷售數據。不幸的是,API存在調用限制(每10分鐘約150次調用),所以我不得不在AWS伺服器上長時間地運行程序來抓取所有的詳細數據。我使用Zillow API抓取了每個家庭的元數據和房地產商對房屋的描述。但是,抓取的速度也很慢,因為Zillow只允許你每天調用API 1000次。(我讓丈夫、母親和幾個朋友來幫我獲取更多的API密鑰)
最後,數據收集過程中最困難的部分是獲取圖像。這是因為Zillow有獲取圖片的API,但Redfin沒有,但Redfin會在房子出售後仍把圖片留那,而Zillow不會。為了獲取到Redfin網站上的圖片,我編寫了一個Selenium腳本,在Google Images上通過在搜索條目後增加「Redfin」一詞來搜索房屋地址,然後抓取Google列出的第一張圖片的URL。
不幸的是,雖然我有了圖像的URL,實際要直接將它們下載下來並不簡單。這是因為Redfin不允許你使用標準的Python包,例如發送請求獲取數據,也不允許你使用簡單的curl命令。幸運的是,在與別人討論後,我們提出了這樣一個想法:在curl命令的末尾加上「User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)……」,以此來將你的終端請求偽裝成瀏覽器請求。這終於成功了,最終我抓取到了8300個房屋的數據和圖片!
現在數據有了,我準備要開始實現模型了。如下圖所示:
讓我們來詳細介紹一下這三種輸入數據類型。 Zillow元數據包含你原本預期的描述性文字:平方英尺、街區、建造年份等等。當我按p值對每個特徵進行排序時,出現了一些驚喜的發現。我一直不知道喬治亞建築是什麼樣子的,直到我查了一下之後。
我準備採用自然語言處理技術來分析地產商的描述性文字。我對地產商的描述性文字做了兩件事情:為每一個描述創建一個字矢量矩陣,這樣就可以將其與Zillow元數據合併到一個特徵矩陣中,還有,用NLTK情緒包來計算情緒評分:
我想,房地產經紀商的平均積極分數很高(平均分數為0.6,範圍在-1到+1之間)並不讓人覺得奇怪。因此,把情緒評分作為特徵並沒有改善模型。但是,在數據集中挖取最積極和最負面的分數非常有趣:
最後,為了將圖片合併到模型中,我採用了VGG16深度神經網路對圖像進行處理,以便提取出它們的特徵(8300 x 25000的圖像特徵矩陣)。運行該模型的計算量相當得大,所以我需要在AWS上安裝一個g2.8xlarge的GPU ubuntu實例。
圖片模型在預測房價方面的效果如何呢?不錯!這些是測試集中預測價格最高的三間屋子,顯然,它們真的不錯:
同樣的,圖片模型在預測廉價房屋方面也表現得很好:
我的模型在處理什麼類型的圖片時會存在問題呢?包含綠化的房屋!我的模型預測下面這個房屋價值250萬,但實際上,圖中的很多綠化都是免費贈送的!
好的,現在我確信我的圖像模型已經挺不錯了。我準備將Zillow元數據、地產商描述字矩陣和圖像特徵矩陣組合併到一個矩陣中,然後通過使用梯度提升演算法來預測房價。作為一個基準預測,回想一下,數據集的平均房價是44.2萬元。如果我預測每個家庭都值得這麼多,那麼平均而言,每個房子的價格就會下降16.1萬元。而將圖像合併到模型中能夠立即將該錯誤降低2萬元。把地產商描述添加到模型中則會將錯誤再降低1萬元。最後,將Zillow元數據添加進來,則將平均絕對誤差降低到大約7.1萬元。
也許你想知道如果在預測房價上只使用Zillow元數據的話效果會怎麼樣?平均來說,它給出了一個7.0萬元的誤差。在添加了房地產商的描述後略微下降到6.9萬元,但後來添加了圖片後卻增加到7.1萬元。換句話說,現在的圖片會輕微地降低模型的質量,而不是提升質量。
但是,請注意,圖像特徵矩陣具有25000列,而我只使用了8300張照片。我根本沒有足夠的數據來支撐這種模型。如果我在網上爬一個月並能獲得更多的圖片的話,我相信將圖片整合到模型中將有助於提升預測的準確率。
總而言之,在完成這個項目的過程中,我學到了很多東西,也克服了幾個重要的困難。我遇到的最大的困難是如何抓取Redfin圖像以及如何使用VGG16模型。我發現Keras的文檔仍然很少,所以在使用它的時候需要試錯很多次。我為自己能完成這個項目而感到自豪,現在我需要做的只是獲取更多的數據!你可以在這裡找到GitHub項目。
文章原標題《Predicting Portland Home Prices》,作者:Lauren Shareshian,譯者:夏天,審校:主題曲。
※「漫畫」看黑科技如何助白娘子逃出雷鋒塔!
※專訪阿里雲易立:從實踐積累到需求沉澱,容器技術必將引領主流
※如何最省錢的使用阿里雲公網產品
※京頤產品總監柏鵬:布局未來,我們是如何應對醫療雲的挑戰與機遇
※「漫畫」DevOps:提速從研發到交付流程
TAG:雲棲社區 |