旗下產業: A產業/ A實習/ A計劃
全國統一咨詢熱線:010-5367 2995
首頁 > 熱門文章 > 大數據分析 > 用Python搭建機器學習模型預測房租價格
用Python搭建機器學習模型預測房租價格
時間:2020-06-17來源:www.shunkai11.site點擊量:作者:Sissi
時間:2020-06-17點擊量:作者:Sissi



  毫無疑問,機器學習是當前大數據分析中最熱門的話題。這也是一些最令人興奮的技術領域的基本概念,例如自動駕駛汽車和預測分析。百度上的機器學習搜索在2019年4月創歷史新高,自此以來興趣一直沒有下降。
 

  但是實際上學習機器學習可能很困難。您要么使用行為類似于“黑匣子”的預構建包,要么在其中傳遞數據,另一端則產生魔力,或者您必須處理高級數學和線性代數。每種方法都使學習機器學習充滿挑戰和威脅。
 

  用Python搭建機器學習模型預測房租價格旨在向您介紹機器學習的基本概念。在繼續學習時,您將從頭開始構建第一個模型以進行預測,同時準確地了解模型的工作原理。
 

  (用Python搭建機器學習模型預測房租價格基于我們的機器學習基礎知識課程,它是我們的大數據分析學習路徑的一部分。該課程涉及更多細節,使您可以交互地編寫代碼,以便邊做邊學。對掌握機器學習非常感興趣,我們建議您選擇該課程以及我們的大數據分析家課程中的其他機器學習課程。)
 

  什么是機器學習?
 

  簡而言之,機器學習是構建系統(稱為模型)的實踐,可以使用數據對其進行訓練,以找到可用于對新數據進行預測的模式。
 

  與許多其他編程不同,機器學習模型不是基于規則的系統,在該系統中,使用一系列“如果/那么”語句來確定結果(例如,“如果學生錯過了超過50%的課程,則自動使他們失敗) ')。
 

  取而代之的是,機器學習模型檢查具有定義結果的數據集中數據點之間的統計關系,然后將所學到的關于這些關系的知識應用于分析和預測新數據集的結果。
 

  機器學習的工作原理
 

  為了更好地理解機器學習的基礎,我們來看一個示例。假設我們要出售房屋,并且想確定合適的掛牌價格。我們可能會做的事情,以及房地產經紀人實際上會做的事情,就是看一看我們地區已經出售的可比房屋。用機器學習的術語來說,我們看的每座房子都稱為觀察。
 

  對于每座房屋,我們將考慮以下因素,例如房屋的大小,房屋的臥室和浴室的數量,距雜貨店等便利設施的距離等。在機器學習術語中,每個屬性都稱為特點。
 

  一旦找到了許多類似的房屋,我們便可以查看它們的售價,對這些價格進行平均,然后得出關于我們房屋價值的相當合理的預測。
 

  在此示例中,我們建立的“模型”是根據我們所在地區其他房屋的數據(觀測值)進行訓練的,然后用于對房屋價值進行預測。我們預測的值,即價格,被稱為目標變量。
 

  當然,這個例子并不是真正的“機器學習”,因為我們根據自己房屋的特點挑選了“觀測”房屋進行研究。試圖大規模地進行這種事情(例如,基于龐大的房地產數據集預測城市中任何房屋的價格)對人類來說將是非常困難的。觀察和特征越多,用手進行這樣的分析就越困難,并且越容易錯過數據中的重要但非顯而易見的模式。
 

  這就是機器學習是在一個真正的機器學習模型可以做的非常相似于我們的小房子預測模型的東西很多規模較大的:
 

  1)檢查過去房屋銷售的大數據集(觀察)

  2)查找房屋的特征(特征)與其價格(目標變量)之間的模式和統計關系,包括查看數據的人可能看不到的模式

  3)使用這些統計關系和模式來預測任何新房的價格,我們以此為基礎提供數據。
 

  我們將在用Python搭建機器學習模型預測房租價格中構建的模型與上面概述的模型相似。我們將使用Python構建一個簡單的模型,以提出租房平臺公寓的租金價格建議。
 

  (本文假定您熟悉Python的pandas庫-如果您需要學習pandas,我們建議您將pandas教程分為兩部分,或者將Python和Pandas互動式學習。)
 

  預測租房平臺的租金價格
 

  對于沒有經驗的人,租房平臺是一個短期房屋和公寓出租的互聯網市場。例如,它使您可以在外出時將房屋出租一周,或將備用臥室出租給旅行者。該公司本身已從2008年成立時迅速成長為估值接近400億美元的公司,目前的市值超過全球任何一家連鎖酒店。
 

  租房平臺房東面臨的挑戰之一是確定最佳的每晚租金價格。在許多地區,潛在的租戶都會看到很多房源,并且可以按價格,臥室數量,房間類型等條件進行過濾。由于租房平臺是一個市場,房東每晚收取的費用與市場的動態密切相關。這是租房平臺上搜索體驗的屏幕截圖:
 

  租房平臺搜索結果
 

  假設我們想在租房平臺上租一個房間。作為房東,如果我們試圖以高于市場價格的價格收費,那么租房者將選擇更多負擔得起的替代品,而我們不會賺錢。另一方面,如果我們將每晚租金設置得太低,我們將錯過潛在的收入。
 

  我們如何才能達到中間的“最佳位置”?我們可以使用的一種策略是:
 

  1)找到一些與我們相似的列表,

  2)平均與我們最相似的商品的標價,

  3)并將我們的掛牌價設為此計算出的平均價格。
 

  但是,一遍又一遍地手動執行操作將非常耗時,而且我們是大數據分析家!我們將使用稱為k-nearest neighbors的技術來構建機器學習模型,以自動執行此過程,而不是手動進行操作。
 

  我們將從查看將要使用的數據集開始。
 

  我們的租房平臺數據
 

  租房平臺不會在其市場上發布任何列表上的數據,而是一個名為Inside 租房平臺的獨立組織從網站上許多主要城市的列表樣本中提取數據。在本文中,我們將使用2015年10月3日以來在美國首都華盛頓特區上市的數據集。這是該數據集的直接鏈接。
 

  數據集中的每一行都是一個特定的清單,可供在華盛頓特區的租房平臺上租用。用機器學習的術語來說,每一行都是一個觀察。這些列描述了每個列表的不同特征(以機器學習術語為特征)。
 

  為了減少使用數據集的麻煩,我們刪除了原始數據集中的許多列,并將文件重命名為dc_租房平臺.csv。
 

  這是我們將要使用的一些更重要的列(功能),因為這些都是租房者可以用來評估他們將選擇哪個清單的特征:
 

  1)accommodates:租金可容納的客人人數

  2)bedrooms:租金中包含的臥室數量

  3)bathrooms:租金中包含的浴室數量

  4)beds:租金中包含的床位數

  5)price:每晚租金

  6)minimum_nights:客人可以租用的最少住宿天數

  7)maximum_nights:客人可以租用的最大住宿天數

  8)number_of_reviews:先前訪客留下的評論數
 

  我們將從將清理后的數據集讀入pandas開始,打印其大小并查看前幾行。(如果您不確定如何自己從原始數據集中刪除多余的列,請查看我們的一些pandas和數據清理課程)。

大數據分析python
大數據分析python
 

  這看起來不錯!現在,讓我們繼續我們將用于機器學習模型的算法。
 

  K近鄰算法
 

  K最近鄰(KNN)算法的工作方式與我們之前概述的三步過程類似,可以將我們的列表與類似列表進行比較,并取平均價格。讓我們更詳細地看一下:
 

  首先,我們選擇k要比較的相似列表的數量。

大數據分析python
 

  其次,我們需要使用相似度指標來計算每個列表與我們的相似度。

大數據分析python
 

  第三,我們使用相似性指標對每個列表進行排名,然后選擇第一個k列表。

大數據分析python
 

  最后,我們計算k相似商品的平均價格,并將其用作我們的標價。

大數據分析python
 

  盡管為簡單起見,上面的圖像每個觀察僅使用兩個功能(臥室和價格)與我們的清單進行比較,但機器學習的好處在于,通過為每個觀察評估更多的功能,我們可以進行更復雜的比較。
 

  讓我們開始通過定義我們將要使用的相似性度量來構建真實模型。然后,我們將實現k最近鄰居算法,并使用該算法為新列表建議價格。出于用Python搭建機器學習模型預測房租價格的目的,我們將使用的固定k值5,但是一旦您熟悉算法的工作流程,就可以嘗試使用該值來查看使用較低或較高的k值可獲得更好的結果。
 

  歐氏距離
 

  嘗試預測價格等連續值時,使用的主要相似性度量是歐幾里德距離。這是歐幾里得距離的一般公式:

大數據分析python
 

  哪里 q1個 至 qñ 代表一個觀測值的特征值 p1個 至 pñ 代表其他觀察的特征值。
 

  如果您的頭部剛剛爆炸,請放心!我們將把它分解成小塊。我們將從...開始
 

  建立基本的KNN模型

大數據分析python
 

  讓我們首先分解一下內容,然后僅查看數據集中的一列。這是僅一個功能的公式:
 

  用語言表達,我們想要找到觀測值與我們要為所使用功能預測的數據點之間的差的絕對值。
 

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

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


大數據分析python
 

  歐幾里得距離的最小可能值為零,這意味著我們正在比較的觀測值與我們的觀測值相同,因此我們在這里得到的結果是有意義的。但是,孤立地講,該值的意義并不大,除非我們知道它與其他值的比較方式。讓我們為數據集中的每個觀測值計算歐幾里得距離,并查看使用的值范圍pd.value_counts()。

大數據分析python
 

  有461條距離為的列表,0因此可容納與我們列表相同的人數。這些列表可能是一個不錯的起點。
 

  如果僅使用距離為的前五個值0,則我們的預測將偏向于數據集的現有排序。相反,我們將隨機化觀測值的順序,然后選擇距離為的前五行0。我們將用于DataFrame.sample()隨機化行。此方法通常用于選擇DataFrame的隨機部分,但是我們將告訴它隨機選擇100%,這將為我們隨機地洗排行。
 

  我們還將使用random_state僅給我們可重現的隨機順序的參數,以便任何人都可以遵循并獲得完全相同的結果。

大數據分析python
 

  在我們取平均價格之前,您會注意到我們的價格列具有object類型,這是因為價格具有美元符號和逗號(我們上面的示例未顯示逗號,因為所有值都較小超過$ 1000)。
 

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

大數據分析python
 

  現在,我們已經做出了第一個預測-我們的KNN模型告訴我們,當我們僅使用該accommodates功能時,為三人房列表找到合適的價格,我們應該以$ 88.00的價格列出我們的公寓。
 

  這是一個好的開始!問題是,我們沒有任何方法可以知道此模型的準確性,因此無法進行優化和改進。遵循任何機器學習模型的預測而不評估其準確性不是一個好主意!
 

  評估我們的模型
 

  測試模型質量的一種簡單方法是:
 

  a)將數據集分為2個分區:

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

    2)甲測試集:包含行的其余少數(25%)

  b)使用訓練集中的行來預測price測試集中的行的值

  c)將預測值與price測試集中的實際值進行比較,以查看預測值的準確性。
 

  我們要按照這個方法和3,723行我們的數據集分為兩個部分:train_df和test_df在75%-25%分割。

大數據分析python
 

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

大數據分析python
 

  為了使我們自己更輕松地查看指標,我們會將之前制作的模型合并為一個函數。我們不必擔心對行進行隨機化,因為它們仍是較早前隨機化的。

大數據分析python
 

  現在,我們可以使用此函數使用該accommodates列來預測測試數據集的值。

大數據分析python
 

  使用RMSE評估我們的模型
 

  對于許多預測任務,我們希望對遠離實際值的預測值的懲罰要遠大于接近實際值的預測值。
 

  為此,我們可以取平方誤差值的平均值,稱為均方根誤差(RMSE)。下面是RMSE下式:,其中表示的數量測試集中的行。起初,這個公式可能看起來很讓人不知所措,但我們要做的只是:

大數據分析python
 

  a)取每個預測值與實際值(或誤差)之差,

  b)平方這個差(平方),

  c)取所有平方差的平均值(均值),然后

  d)取均值的平方根(根)。
 

  因此,從下往上讀?。壕礁`差。讓我們為測試集上的預測計算RMSE值。

大數據分析python
 

  RMSE約為213美元。關于RMSE的一件方便的事是,因為我們先平方然后取平方根,所以RMSE的單位與我們預測的值相同,這使我們易于理解錯誤的范圍。
 

  在這種情況下,規模很大-我們離準確的預測還差得遠。
 

  比較不同型號
 

  有了一個誤差指標,我們可以用來查看模型的準確性,讓我們使用不同的列創建一些預測,并研究誤差的變化情況。

大數據分析python
 

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

  但是,相對于數據集中列表的價格范圍,我們得到的錯誤率非常高。這類錯誤率的預測不會很有幫助。
 

  值得慶幸的是,我們可以做些什么!到目前為止,我們僅使用一種功能(稱為單變量模型)來訓練模型。為了獲得更高的準確性,我們可以讓它同時評估多個特征,這被稱為多元模型。
 

  我們將閱讀此數據集的完整版本,以便我們可以專注于評估模型。在我們清理的數據集中:
 

  a)由于我們無法計算具有非數字字符的值的歐幾里得距離,因此所有列均已轉換為數字值。

  b)為簡單起見,非數字列已被刪除。

  c)缺少值的所有列表均已刪除。

  d)我們對列進行了歸一化,這將為我們提供更準確的結果。
 

  如果您想了解有關數據清理和為機器學習準備數據的更多信息,可以閱讀出色的文章為機器學習準備和清理數據。
 

  讓我們閱讀這個干凈的版本,稱為dc_租房平臺.normalized.csv,并預覽前幾行:

大數據分析python
 

  我們將從建立使用accommodates和bathrooms功能的模型開始。對于這種情況,我們的歐幾里得方程應為:

大數據分析python
 

  為了找到兩個生活空間之間的距離,我們需要計算兩個accommodates值之間的平方差,兩個bathrooms值之間的平方差,將它們相加,然后取所得總和的平方根。
 

  這是前兩行之間的歐式距離normalized_listings:

大數據分析python
 

  到目前為止,我們已經通過自己編寫方程的邏輯來自己計算歐幾里得距離。我們可以改用from中的distance.euclidean()函數scipy.spatial,該函數將兩個向量作為參數并計算它們之間的歐式距離。該euclidean()函數期望:
 

  1)這兩個向量都將使用類似列表的對象(Python列表,NumPy數組或pandas系列)來表示

  2)兩個向量都必須是一維的并且具有相同數量的元素
 

  讓我們使用該euclidean()函數來計算要練習的數據集中第一行和第五行之間的歐幾里得距離。

大數據分析python
 

  創建多元KNN模型
 

  我們可以擴展先前的功能以使用兩個功能以及整個數據集。而不是distance.euclidean(),我們將使用distance.cdist(),因為它允許我們一次傳遞多行。
 

  (該cdist()方法可以使用多種方法來計算距離,但默認為歐幾里得。)

大數據分析python
 

  您可以看到,使用兩項功能(而不只是)時,我們的RMSE從212提高到122 accommodates。盡管它仍然不如我們希望的那樣準確,但這是一個巨大的改進。
 

  scikit-learn簡介
 

  我們一直在從頭開始編寫函數來訓練我們的k近鄰模型。這有助于了解機制的工作原理,但是現在我們了解了基礎知識,便可以使用Python的scikit-learn庫更快,更高效地工作。
 

  Scikit-learn是Python中最受歡迎的機器學習庫。它具有適用于所有主要機器學習算法的內置功能以及簡單,統一的工作流程。這兩個屬性使大數據分析家在新數據集上訓練和測試不同的模型時,工作效率令人難以置信。
 

  scikit-learn工作流程包括四個主要步驟:
 

  a)實例化您要使用的特定機器學習模型。

  b)使模型適合訓練數據。

  c)使用模型進行預測。

  d)評估預測的準確性。
 

  scikit-learn中的每個模型都是作為單獨的類實現的,第一步是識別我們要為其創建實例的類。
 

  任何可以幫助我們預測數值的模型(例如模型中的上市價格)都稱為回歸模型。機器學習模型的另一個主要類別稱為分類。當我們嘗試從一組固定的標簽(例如血型或性別)中預測標簽時,將使用分類模型。
 

  在我們的例子中,我們想使用KNeighborsRegressor類。這個詞回歸從類名KNeighborsRegressor是指回歸模型類,我們剛才討論的,而“KNeighbors”來自k-最近鄰模型中,我們正在構建。
 

  Scikit-learn使用類似于Matplotlib的面向對象的樣式。我們需要在調用其他構造函數之前實例化一個空模型。

大數據分析python
 

  如果參考文檔,默認情況下我們會注意到:
 

  1)n_neighbors:鄰居數,設置為 5

  2)algorithm:用于計算最近的鄰居,設置為 auto

  3)p:設置為2,對應于歐幾里得距離
 

  讓我們將algorithm參數設置為,brute并將n_neighbors值保留為5,這與我們構建的手動實現相匹配。

大數據分析python
 

  擬合模型并做出預測
 

  現在,我們可以使用fit方法使模型適合數據。對于所有模型,該fit方法均采用兩個必需參數:
 

  1)類似于矩陣的對象,其中包含我們要從訓練集中使用的要素列。

  2)包含正確目標值的類似列表的對象。
 

  “類矩陣對象”意味著該方法非常靈活,可以接受pandas DataFrame或NumPy 2D數組。這意味著我們可以從DataFrame中選擇要使用的列,并將其用作該fit方法的第一個參數。
 

  對于第二個參數,請回想一下,以下所有都是可接受的類似列表的對象:
 

  1)一個NumPy數組

    b)Python列表

    c)pandas系列對象(例如列)
 

  讓我們從DataFrame中選擇目標列,并將其用作方法的第二個參數fit:

大數據分析python
 

  fit()調用該方法時,scikit-learn將在KNearestNeighbors實例(knn)中存儲我們指定的訓練數據。如果我們嘗試將包含缺失值或非數字值的數據傳遞到fit方法中,則scikit-learn將返回錯誤。那是該庫的妙處之一–它包含許多類似的功能,以防止我們犯錯誤。
 

  現在,我們已經指定了要用于預測的訓練數據,我們可以使用預測方法對測試集進行預測。該predict方法只有一個必需的參數:
 

  類似于矩陣的對象,其中包含我們要進行預測的數據集中的特征列
 

  我們在培訓和測試期間使用的功能列數需要匹配或scikit-learn會返回錯誤。

大數據分析python
 

  該predict()方法返回一個NumPy數組,其中包含price測試集的預測值。
 

  現在,我們擁有練習整個scikit-learn工作流程所需的一切:

大數據分析python
 

  當然,僅僅因為我們使用scikit-learn而不是手動編寫函數,并不意味著我們可以跳過評估步驟,以了解模型預測的實際準確性!
 

  使用Scikit-Learn計算MSE
 

  到目前為止,我們一直使用NumPy和SciPy函數來協助我們手動計算RMSE值?;蛘?,我們可以改用sklearn.metrics.mean_squared_error function()。
 

  該mean_squared_error()函數接受兩個輸入:
 

  1)類似于列表的對象,代表測試集中的真實值。

  2)第二個類似列表的對象,代表由模型生成的預測值。

大數據分析python
 

  從語法的角度來看,這不僅簡單得多,而且由于scikit-learn已針對速度進行了大幅優化,因此運行模型所需的時間更少。
 

  請注意,我們的RMSE與手動實現的算法略有不同-這可能是由于隨機差異以及我們的“手動” KNN算法與scikit-learn版本之間在實現上的細微差異。
 

  請注意,對scikit-learn庫本身的更改也會在一定程度上影響這些值。如果您按照用Python搭建機器學習模型預測房租價格進行操作,但結果略有不同,則可能是因為您使用的是scikit-learn的較新版本。
 

  使用更多功能
 

  scikit-learn最好的事情之一是它使我們可以更快地進行迭代。讓我們通過創建一個使用四個特征而不是兩個特征的模型來進行嘗試,看看是否可以改善我們的結果。

大數據分析python
 

  在這種情況下,我們的錯誤略有下降。但是,添加功能時可能并不總是這樣做。這是要意識到的重要事項:添加更多功能并不一定會產生更準確的模型。
 

  這是因為添加不是目標變量的準確預測指標的功能會在模型中添加“噪聲”。
 

  摘要
 

  讓我們看看我們學到了什么:
 

  我們了解了什么是機器學習,并通過了一個非?;镜氖謩?ldquo;模型”來預測房屋的銷售價格。
 

  我們了解了k最近鄰居算法,并從頭開始在Python中建立了一個單變量模型(僅一個功能),并用其進行了預測。
 

  我們了解到,RMSE可用于計算模型的誤差,然后可用于迭代和嘗試改善我們的預測。
 

  然后,我們從頭開始創建了一個多變量(多個功能)模型,并將其用于更好的預測。
 

  最后,我們了解了scikit-learn庫,并使用KNeighborsRegressor該類進行了預測。
 

  下一步
 

  如果您想了解更多信息,那么用Python搭建機器學習模型預測房租價格基于我們的AAA教育機器學習基礎課程,這是我們的大數據分析學習路徑的一部分。用Python搭建機器學習模型預測房租價格將詳細介紹并改進本文中構建的模型,同時使您可以繼續進行,在瀏覽器中編寫代碼,并通過我們的答案檢查系統對代碼進行每一步檢查,以確保您正確執行所有操作。
 

  如果您想自己繼續研究此模型,可以采取以下幾項措施來提高準確性:
 

  a)嘗試用不同的值代替k。

  b)返回原始數據集,并將我們刪除的一些列轉換為數字(我們的“機器學習的準備和清潔數據”一文將在這里為您提供幫助),并嘗試添加不同的功能組合。

  c)嘗試一些功能工程,在其中您可以基于現有數據創建新列:我們的Kaggle入門:房價競爭一文提供了一個簡單的示例。

 

?2007-2019/北京漫動者教育科技有限公司版權所有
備案號:京ICP備12034770號

?2007-2019/ www.shunkai11.site 北京漫動者教育科技有限公司 備案號:京ICP備12034770號 監督電話:010-62568622 郵箱:bjaaa@aaaedu.cc

亚洲 欧洲 日产 国