0
雷鋒網(wǎng)按:文章原標(biāo)題《Predicting Portland Home Prices》,作者:Lauren Shareshian,譯者:夏天,審校:主題曲。本文原載于知乎專(zhuān)欄我是程序員。
對(duì)于我在梅蒂斯的最后一個(gè)項(xiàng)目,我希望能包含過(guò)去三個(gè)月里所學(xué)到的東西,而預(yù)測(cè)波特蘭房?jī)r(jià)這個(gè)題目正符合我的要求,因?yàn)槲夷軌驅(qū)⒕W(wǎng)絡(luò)爬取技術(shù)、文本自然語(yǔ)言處理,圖像上的深度學(xué)習(xí)模型以及梯度增強(qiáng)技術(shù)進(jìn)行整合來(lái)實(shí)現(xiàn)這個(gè)項(xiàng)目。
下面你可以看到我抓取到的 2016 年 7 月至 2017 年 7 月這段時(shí)間內(nèi)波特蘭市 8300 個(gè)獨(dú)戶(hù)住宅的銷(xiāo)售數(shù)據(jù)。
顯然,街區(qū)在這其中起了非常重要的作用。西山(紅色)是鎮(zhèn)上最昂貴的地區(qū)之一,而東波特蘭則便宜很多。平均售價(jià)為 44.2 萬(wàn)美元。
我希望能夠在比街區(qū)更細(xì)粒度的水平上預(yù)測(cè)價(jià)格。例如,假設(shè)以下房子是彼此毗鄰的。
這些房子面積相同,在同一年份建成,并位于同一條街上。但是,一個(gè)明顯能讓人產(chǎn)生購(gòu)買(mǎi)的欲望,而另一個(gè)則沒(méi)有。那么 Zillow 或 Redfin(美國(guó)的兩家大型房地產(chǎn)網(wǎng)站)或其他公司能夠僅僅依靠一些房屋的文字?jǐn)?shù)據(jù)來(lái)預(yù)測(cè)它們的價(jià)格呢?他們不能。這就是為什么我要把對(duì)房屋門(mén)口照片的分析作為其中一個(gè)特征納入預(yù)測(cè)模型的原因。
當(dāng)務(wù)之急就是要獲取到所有的數(shù)據(jù)。這比原本預(yù)想的要困難的多。首先,我使用波特蘭地圖的官方 API 來(lái)爬取波特蘭獨(dú)戶(hù)住宅的銷(xiāo)售數(shù)據(jù)。不幸的是,API 存在調(diào)用限制(每 10 分鐘約 150 次調(diào)用),所以我不得不在 AWS 服務(wù)器上長(zhǎng)時(shí)間地運(yùn)行程序來(lái)抓取所有的詳細(xì)數(shù)據(jù)。我使用 Zillow API 抓取了每個(gè)家庭的元數(shù)據(jù)和房地產(chǎn)商對(duì)房屋的描述。但是,抓取的速度也很慢,因?yàn)?Zillow 只允許你每天調(diào)用 API 1000 次。(我讓丈夫、母親和幾個(gè)朋友來(lái)幫我獲取更多的 API 密鑰)
最后,數(shù)據(jù)收集過(guò)程中最困難的部分是獲取圖像。這是因?yàn)?Zillow 有獲取圖片的 API,但 Redfin 沒(méi)有,但 Redfin 會(huì)在房子出售后仍把圖片留那,而 Zillow 不會(huì)。為了獲取到 Redfin 網(wǎng)站上的圖片,我編寫(xiě)了一個(gè) Selenium 腳本,在 Google Images 上通過(guò)在搜索條目后增加 “Redfin” 一詞來(lái)搜索房屋地址,然后抓取 Google 列出的第一張圖片的 URL。
不幸的是,雖然我有了圖像的 URL,實(shí)際要直接將它們下載下來(lái)并不簡(jiǎn)單。這是因?yàn)?Redfin 不允許你使用標(biāo)準(zhǔn)的 Python 包,例如發(fā)送請(qǐng)求獲取數(shù)據(jù),也不允許你使用簡(jiǎn)單的 curl 命令。幸運(yùn)的是,在與別人討論后,我們提出了這樣一個(gè)想法:在 curl 命令的末尾加上 “User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)……”,以此來(lái)將你的終端請(qǐng)求偽裝成瀏覽器請(qǐng)求。這終于成功了,最終我抓取到了 8300 個(gè)房屋的數(shù)據(jù)和圖片!
現(xiàn)在數(shù)據(jù)有了,我準(zhǔn)備要開(kāi)始實(shí)現(xiàn)模型了。如下圖所示:
讓我們來(lái)詳細(xì)介紹一下這三種輸入數(shù)據(jù)類(lèi)型。 Zillow 元數(shù)據(jù)包含你原本預(yù)期的描述性文字:平方英尺、街區(qū)、建造年份等等。當(dāng)我按 p 值對(duì)每個(gè)特征進(jìn)行排序時(shí),出現(xiàn)了一些驚喜的發(fā)現(xiàn)。我一直不知道格魯吉亞建筑是什么樣子的,直到我查了一下之后。
我準(zhǔn)備采用自然語(yǔ)言處理技術(shù)來(lái)分析地產(chǎn)商的描述性文字。我對(duì)地產(chǎn)商的描述性文字做了兩件事情:為每一個(gè)描述創(chuàng)建一個(gè)字矢量矩陣,這樣就可以將其與 Zillow 元數(shù)據(jù)合并到一個(gè)特征矩陣中,還有,用 NLTK 情緒包來(lái)計(jì)算情緒評(píng)分:
我想,房地產(chǎn)經(jīng)紀(jì)商的平均積極分?jǐn)?shù)很高(平均分?jǐn)?shù)為 0.6,范圍在 - 1 到 + 1 之間)并不讓人覺(jué)得奇怪。因此,把情緒評(píng)分作為特征并沒(méi)有改善模型。但是,在數(shù)據(jù)集中挖取最積極和最負(fù)面的分?jǐn)?shù)非常有趣:
最后,為了將圖片合并到模型中,我采用了 VGG16 深度神經(jīng)網(wǎng)絡(luò)對(duì)圖像進(jìn)行處理,以便提取出它們的特征(8300 x 25000 的圖像特征矩陣)。運(yùn)行該模型的計(jì)算量相當(dāng)?shù)么?,所以我需要?AWS 上安裝一個(gè) g2.8xlarge 的 GPU ubuntu 實(shí)例。
圖片模型在預(yù)測(cè)房?jī)r(jià)方面的效果如何呢?不錯(cuò)!這些是測(cè)試集中預(yù)測(cè)價(jià)格最高的三間屋子,顯然,它們真的不錯(cuò):
同樣的,圖片模型在預(yù)測(cè)廉價(jià)房屋方面也表現(xiàn)得很好:
我的模型在處理什么類(lèi)型的圖片時(shí)會(huì)存在問(wèn)題呢?包含綠化的房屋!我的模型預(yù)測(cè)下面這個(gè)房屋價(jià)值 250 萬(wàn),但實(shí)際上,圖中的很多綠化都是免費(fèi)贈(zèng)送的!
好的,現(xiàn)在我確信我的圖像模型已經(jīng)挺不錯(cuò)了。我準(zhǔn)備將 Zillow 元數(shù)據(jù)、地產(chǎn)商描述字矩陣和圖像特征矩陣組合并到一個(gè)矩陣中,然后通過(guò)使用梯度提升算法來(lái)預(yù)測(cè)房?jī)r(jià)。作為一個(gè)基準(zhǔn)預(yù)測(cè),回想一下,數(shù)據(jù)集的平均房?jī)r(jià)是 44.2 萬(wàn)元。如果我預(yù)測(cè)每個(gè)家庭都值得這么多,那么平均而言,每個(gè)房子的價(jià)格就會(huì)下降 16.1 萬(wàn)元。而將圖像合并到模型中能夠立即將該錯(cuò)誤降低 2 萬(wàn)元。把地產(chǎn)商描述添加到模型中則會(huì)將錯(cuò)誤再降低 1 萬(wàn)元。最后,將 Zillow 元數(shù)據(jù)添加進(jìn)來(lái),則將平均絕對(duì)誤差降低到大約 7.1 萬(wàn)元。
也許你想知道如果在預(yù)測(cè)房?jī)r(jià)上只使用 Zillow 元數(shù)據(jù)的話(huà)效果會(huì)怎么樣?平均來(lái)說(shuō),它給出了一個(gè) 7.0 萬(wàn)元的誤差。在添加了房地產(chǎn)商的描述后略微下降到 6.9 萬(wàn)元,但后來(lái)添加了圖片后卻增加到 7.1 萬(wàn)元。換句話(huà)說(shuō),現(xiàn)在的圖片會(huì)輕微地降低模型的質(zhì)量,而不是提升質(zhì)量。
但是,請(qǐng)注意,圖像特征矩陣具有 25000 列,而我只使用了 8300 張照片。我根本沒(méi)有足夠的數(shù)據(jù)來(lái)支撐這種模型。如果我在網(wǎng)上爬一個(gè)月并能獲得更多的圖片的話(huà),我相信將圖片整合到模型中將有助于提升預(yù)測(cè)的準(zhǔn)確率。
總而言之,在完成這個(gè)項(xiàng)目的過(guò)程中,我學(xué)到了很多東西,也克服了幾個(gè)重要的困難。我遇到的最大的困難是如何抓取 Redfin 圖像以及如何使用 VGG16 模型。我發(fā)現(xiàn) Keras 的文檔仍然很少,所以在使用它的時(shí)候需要試錯(cuò)很多次。我為自己能完成這個(gè)項(xiàng)目而感到自豪,現(xiàn)在我需要做的只是獲取更多的數(shù)據(jù)!你可以在這里找到 GitHub 項(xiàng)目。
文章為簡(jiǎn)譯,更為詳細(xì)的內(nèi)容,請(qǐng)查看原文。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。