當前位置:
首頁 > 知識 > 用Python預測Airbnb 價格

用Python預測Airbnb 價格

用Python預測Airbnb 價格

機器學習無疑是目前數據科學中最熱門的話題。它也是支撐一些最令人興奮的技術領域的基本概念,比如自動駕駛汽車和預測分析。谷歌上機器學習的搜索量在2019年4月達到了歷史新高,自那以後,人們對機器學習的興趣並沒有下降多少。

但實際上學習機器學習是很困難的。你要麼使用像「黑匣子」一樣的預先構建的軟體包,在那裡你輸入數據,魔術就會從另一端出來,要麼你必須處理高級數學和線性代數。這兩種方法都使機器學習既具有挑戰性又令人生畏。

本教程旨在向你介紹機器學習的基本概念。隨著你的跟進,你將從頭構建你的第一個模型來進行預測,同時準確地理解你的模型是如何工作的。


什麼是機器學習?

簡而言之,機器學習是構建系統(稱為模型)的實踐,這些系統可以使用數據進行訓練,以發現模式,然後使用這些模式對新數據進行預測。

與許多其他編程不同,機器學習模型不是一個基於規則的系統。基於規則的系統,使用一系列「if/then」語句來確定結果(例如,「如果學生曠課超過50%,那麼他們就會自動不及格」)。

相反,機器學習模型檢查一個具有定義結果的數據集中的數據點之間的統計關係,然後應用它所學習到的關於這些關係的知識來分析和預測一個新數據集中的結果。


機器學習的原理

為了更好地理解機器學習的基礎知識,我們先來看一個例子。假設我們正在賣房子,我們想確定一個合適的掛牌價格。我們可能要做的——以及房地產經紀人實際上要做的——是看看我們所在地區已經售出的類似房屋。用機器學習的術語來說,我們看到的每一棟房子都是一個觀測值。

對於每一棟房子,我們都要考慮一些因素,比如房子的大小,有多少間卧室和浴室,離雜貨店等設施有多遠等等。在機器學習術語中,這些屬性中的每一個都稱為特徵。

一旦我們找到了一些類似的房子,我們就可以看看它們的售價,把這些價格平均起來,就能對我們自己房子的價值做出一個相當合理的預測。

用Python預測Airbnb 價格

查看類似的房子有助於我們確定自己房子的價格

在這個例子中,我們建立的「模型」是根據我們所在地區其他房屋的數據(觀察數據)進行訓練的,然後用它來預測我們房屋的價值。我們預測的價值,即價格,被稱為目標變數。

當然,這個例子並不是真正的「機器學習」,因為我們根據自己房子的特點,選擇了「觀察」房子來學習。試圖在更大的範圍內做這類事情——比如基於大型房地產數據集預測城市中任何一棟房屋的價格——對人類來說都是極其困難的。觀察和特徵越多,手工分析就越困難,也就越容易忽略數據中那些重要但不明顯的模式。

這就要用到機器學習了。一個真正的機器學習模型可以在更大的範圍內做類似於我們的小房子預測模型這樣的事情:

  1. 查看過去的房屋銷售的大量數據集(觀測值)
  2. 尋找一所房子的特點(特徵)和它的價格(目標變數)之間的模式和統計關係,包括可能對正在查看數據的人來說不明顯的模式
  3. 使用這些統計關係和模式來預測基於我們提供給它的數據的任何新房的價格。

我們將在本教程中構建的模型與我們上面所概述的類似。我們將使用Python構建一個簡單的模型來生成Airbnb的公寓租金推薦。

(本文假定你熟悉Python的pandas庫——如果你需要重溫pandas,這裡推薦我們的兩部分pandas教程博客文章或互動式Python和Pandas課程。)


預測Airbnb的租金

對於外行人來說,Airbnb是一個短期房屋和公寓租賃的互聯網市場。例如,它可以讓你在外出時將房子出租一周,或者將空餘的卧室出租給旅行者。自2008年成立以來,該公司就發展迅速,其估值已接近400億美元,目前市值超過全球任何一家連鎖酒店。

Airbnb房東面臨的一個挑戰是確定最優的夜間租金。在許多地區,潛在的租房者會看到一系列不錯的房源清單,可以根據價格、卧室數量、房間類型等標準進行篩選。由於Airbnb是一個市場,主人每晚可以收取的費用與市場的動態密切相關。以下是一個Airbnb搜索體驗的截圖:

用Python預測Airbnb 價格


Airbnb 搜索結果

假設我們想在Airbnb上出租一個房間。作為房東,如果我們試圖收取高於市場價格的租金,租戶會選擇更實惠的替代品,而我們就不會賺到錢。另一方面,如果我們把每晚的租金定得太低,我們就會失去潛在的收入。

我們怎麼才能找到中間的「最佳位置」呢?我們可以使用的一個策略是:

  • 找到一些與我們房間相似的清單,
  • 把與我們最相似的房間的標價平均一下,
  • 並將我們的標價設置為這個計算出的平均價格。

但是一遍又一遍地那樣手動操作將會非常耗時,畢竟我們是數據科學家!我們不需要手工操作,而是要構建一個機器學習模型,使用一種稱為k最近鄰(KNN)的技術來自動化這個過程。

我們先來看一下我們要處理的數據集。


我們的Airbnb數據

Airbnb沒有公布其市場上的房源數據,但一個名為Inside Airbnb的獨立組織從該網站上許多主要城市的房源樣本中提取了數據。在這篇文章中,我們將使用他們的來自於2015年10月3日的有關美國首都華盛頓特區房源價格列表的數據集。這裡是一個到該數據集的直鏈。(http://data.insideairbnb.com/united-states/dc/washington-dc/2015-10-03/data/listings.csv.gz )

數據集中的每一行都是一個特定的房源頁面,代表華盛頓特區Airbnb上可租用的房源。用機器學習的術語來說,每一行都是一個觀察。這些列描述了每個房源頁面的不同特性(用機器學習術語來說,是特徵)。

為了減少處理數據集的麻煩,我們刪除了原始數據集中的許多列,並將文件重命名為 dc_airbnb.csv。

以下是我們想要使用的一些最重要的列(特徵),因為這些都是租戶可能用來評估他們將選擇哪一個房源頁面的特點:

  • accommodates(住宿):出租房屋可容納的客人人數
  • bedrooms(卧室):包括在出租房屋內的卧室數
  • bathrooms(衛生間):包含在出租房屋內的衛生間數量
  • beds(床位):包含在出租房租中的床位數量
  • price(價格):每晚租金
  • minimum_nights:客人可入住的最短租期
  • maximum_nights:客人可入住的最長租期
  • number_of_reviews:前一位客人留下的評論數量

我們首先將清理後的數據集讀入pandas,列印它的大小並查看前幾行。(如果你不確定如何從原始數據集中刪除多餘的列,請查看一些我們的pandas和數據清理課程)。

用Python預測Airbnb 價格

用Python預測Airbnb 價格

這看起來不錯! 現在,我們來看看我們將用於機器學習模型的演算法.


K最近鄰演算法

K最近鄰(KNN)演算法的工作原理類似於我們前面概述的三步過程,該過程將我們的出租房屋與類似房源進行比較,並取平均價格。讓我們來看看它的一些細節:

首先,我們選擇要進行比較的類似房源的數量,k。

用Python預測Airbnb 價格

其次,我們需要使用一個相似性指標來計算每個房源與我們的房屋之間的相似性。

用Python預測Airbnb 價格

第三,我們使用相似性指標對每個房源進行排序,並選擇前k個房源。

用Python預測Airbnb 價格

最後,我們計算這k個類似房源的平均價格,並將其作為我們的出租價格。

用Python預測Airbnb 價格

為了簡單起見,上面的圖片的每個觀察只使用了兩個特徵(卧室數和價格)來與我們的房源進行比較,而機器學習的好處在於,我們可以通過評估每個觀察的更多特徵來進行更複雜的比較。

讓我們通過定義我們將要使用的相似性度量來開始構建我們的真實模型。然後,我們將實現k最近鄰演算法,並使用它來給出一個新房源的價格。出於本教程的目的,我們將使用一個固定的k值5,但是一旦你熟悉了這個演算法的工作流,你就可以對這個值進行試驗,看看用更低或更高的k值是否可以得到更好的結果。

Here』s the general formula for Euclidean distance: d=(q1?p1)2+(q2?p2)2+?+(qn?pn)2 where q1 to qn represent the feature values for one observation and p1 to pn represent the feature values for the other observation.


歐氏(歐幾里得)距離

當試圖預測像價格這樣的連續值時,使用的主要相似性指標是歐氏距離。歐氏距離的一般公式為:

用Python預測Airbnb 價格

其中q1到qn表示一個觀測值的特徵值,p1到pn表示另一個觀測值的特徵值。

如果你感覺腦袋要炸了,別擔心! 我們將把它分成更小的部分。我們先來看…


建立一個基本的KNN模型

讓我們從分解開始,從我們的數據集中只看一列。這裡是一個特徵的公式:

用Python預測Airbnb 價格

平方根和平方冪消掉了,公式簡化為:

用Python預測Airbnb 價格

用文字來表達就是,我們想要找到該觀測值和我們想要對我們正在使用的這個特徵進行預測的數據點之間差異的絕對值。

就我們目前的目的而言,假設我們想出租的居住空間可以容納三個人。

我們首先只使用accommodates特徵來計算數據集中第一個居住空間與我們自己的居住空間之間的距離。我們可以使用NumPy函數np.abs() 來獲得絕對值。

用Python預測Airbnb 價格

最小的可能的歐氏距離是零,這意味著我們與之比較的觀測值和我們的觀測值是一樣的,所以我們這裡得到的結果是有意義的。但是,單獨來看,如果我們不知道這個值與其他值相比結果如何,那麼這個值就沒有多大意義。讓我們計算數據集中每個觀測值的歐式距離,並使用 pd.value_counts() 來查看我們已經得到的值的範圍。

用Python預測Airbnb 價格

其中有461個房源的距離為0,因此可以容納與我們的出租房屋相同的人數。這些房源可能是一個很好的開始點。

如果我們只使用距離為0的前5個值,我們的預測將偏向於數據集的現有順序。相反,我們將隨機化觀測值的順序,然後選擇距離為0的前5行。我們將使用 DataFrame .sample() 來隨機化行。這個方法通常用於選擇DataFrame的一個隨機部分,但是我們將告訴它隨機選擇100%,這會為我們隨機打亂行。

我們還將使用 random_state 參數,它為我們提供了一個可重複的隨機順序,因此任何人都可以使用它,並得到完全相同的結果。

用Python預測Airbnb 價格

在我們取平均價格之前,你將注意到價格列有 object 類型,因為價格有美元符號和逗號(上面的示例沒有顯示逗號,因為所有的值都小於$1000)。

在計算前五個值的平均值之前,讓我們通過刪除這些字元並將其轉換為 float 類型來清理這一列。我們將使用pandas的Series.str.replace() 來刪除孤立的字元,並傳遞正則表達式 $|, ,它將匹配$ 或, 。

用Python預測Airbnb 價格

現在,我們已經做出了第一個預測——我們的KNN模型告訴我們,當我們僅使用accommodates特徵為我們的三人居出租房屋找到合適的價格時,我們應該將我們的公寓標價為88.00美元。

這是一個好的開始!問題是,我們沒有任何方法知道這個模型有多精確,這使得對它進行優化和改進是不可能的。在不評估任何機器學習模型的準確性的情況下,參照它的預測結果都不是一個好主意!


評估我們的模型

檢驗模型質量的一個簡單方法是:

  • 將數據集分成2部分:

◆ 一個訓練集:包含大多數行(75%)

◆ 一個測試集:包含剩餘的少數行(25%)

  • 使用訓練集中的行來預測測試集中行的價格值。
  • 將預測值與測試集中的實際價格值進行比較,看看預測值有多準確。

我們將採用這種方法,將我們的3723行數據集分成兩部分: train_df 和 test_df,以75%-25%的比例進行分割。

用Python預測Airbnb 價格

將數據分成訓練和測試數據集兩部分

我們還將刪除前面創建第一個模型時添加的列。

用Python預測Airbnb 價格

為了使我們在查看指標時更容易,我們將把前面創建的模型合併到一個函數中。我們不需要擔心隨機化這些行,因為它們仍然是之前隨機化的。

用Python預測Airbnb 價格

現在,我們可以通過這個函數使用 accommodates 列來預測我們測試數據集的值。

用Python預測Airbnb 價格


使用RMSE來評估我們的模型

對於許多預測任務,我們希望處罰那些離實際值較遠的預測值,而不是那些離實際值較近的預測值。

為此,我們可以取誤差值平方的均值,即均方根誤差(RMSE)。下面是RMSE的公式:

用Python預測Airbnb 價格

其中n表示測試集中的行數。這個公式第一眼看上去感覺很困難,但我們所需要做的是:

  • 取每一個預測值與實際值(error)之差,
  • 對這個值進行平方(square),
  • 取所有差值的平方的平均值(mean),並
  • 取均值的平方根(root)。

因此,從下到上的讀: root mean squared error(均方根誤差)。我們來為我們在測試集中所做的預測計算RMSE值。

用Python預測Airbnb 價格

我們的RMSE大約是213美元。關於RMSE的一個方便的事情是,由於我們進行了平方然後取平方根,因此,RMSE的單位和我們預測的值是一樣的,這使得我們很容易理解誤差的標度。

在這種情況下,這個標度是相當大的-我們距離得到一個準確的預測還差得遠。


比較不同模型

我們可以使用誤差度量來查看模型的準確性,讓我們使用不同的列創建一些預測,並查看誤差是如何變化的。

用Python預測Airbnb 價格

我們可以看到,在我們訓練的四個模型中,使用accomodates列的模型是最好的。

然而,我們得到的誤差率相對於我們數據集中房源的價格範圍來說是相當高的。帶有這種誤差率的預測並不怎麼有用!

謝天謝地,我們還能做點其他事情! 到目前為止,我們只使用一個特徵來訓練我們的模型,稱為單變數模型。為了更加準確,我們可以讓它同時評估多個特徵,這就是多變數模型。

我們將讀取這個數據集的一個已清理版本,這樣我們就可以專註於評估模型。在我們清理過的數據集中:

  • 所有列都已被轉換為數值,因為我們無法計算一個帶有非數值字元的值的歐氏距離。
  • 為了簡單起見,我們刪除了非數字列。
  • 任何帶有缺失值的房源清單都已被刪除。
  • 我們對列進行了標準化,這樣會得到更準確的結果。

如果你想閱讀更多關於機器學習的數據清理和數據準備的內容,你可以閱讀這篇優秀的博文: 《為機器學習準備和清理數據》。

讓我們看一下這個清理過的版本,它被稱為 dc_airbnb. normalized.csv,並預覽前幾行:

用Python預測Airbnb 價格

用Python預測Airbnb 價格

然後我們將隨機化這些行,並將其分成訓練和測試數據集。

用Python預測Airbnb 價格


計算多個特徵的歐氏距離

我們來回憶一下最初的歐式距離方程是什麼樣子的:

用Python預測Airbnb 價格

我們先建立一個使用 accommodates 和 bathrooms 特徵的模型。在這種情況下,我們的歐式方程應該是:

用Python預測Airbnb 價格

為了找到兩個居住空間之間的距離,我們需要計算兩個accommodates值之間的差值平方,兩個bathrooms值之間的差值平方,將它們相加,然後對結果的和取平方根。

下面是 normalized_lists 中前兩行之間的歐式距離:

用Python預測Airbnb 價格

到目前為止,我們一直在通過自己寫出方程的邏輯來自己計算歐氏距離。我們可以使用scipy.spatial中的 distance.euclidean() 函數來代替這些操作。它以兩個向量為參數,計算它們之間的歐氏距離。euclidean()函數需要:

  • 使用一個類列表對象(Python列表、NumPy數組或pandas的Series)來表示的兩個向量
  • 這兩個向量都必須是一維的,並且有相同數量的元素

讓我們使用euclidean()函數來計算一下數據集中第1行和第5行之間的歐式距離,進行實踐一下。

用Python預測Airbnb 價格


英文原文:https://www.dataquest.io/blog/machine-learning-tutorial/

譯者:好酒不上頭

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

用 Poetry 創建並發布 Python 包
使用Python加速數據分析的10個簡單技巧

TAG:Python部落 |