當前位置:
首頁 > 知識 > 房價會崩盤嗎?教你用 Keras 預測房價!

房價會崩盤嗎?教你用 Keras 預測房價!

雷鋒網 AI 研習社按:本文為雷鋒字幕組編譯的技術博客,原文 Custom Loss functions for Deep Learning: Predicting Home Values with Keras for R ,作者 Ben Weber 。

翻譯 | 宥佑 林驍 整理 | 凡江


我最近在讀「深度學習與 R」,R 對於深度學習的支持著實讓我驚艷!

書中其中一個應用例子就是用於預測波士頓的房價,這是一個有趣的問題,因為房屋的價值變化非常大。這是一個機器學習的問題,可能最適用於經典方法,如 XGBoost,因為數據集是結構化的而不是感知的。然而,這也是一個數據集,深度學習提供了一個非常有用的功能,就是編寫一個新的損失函數,有可能提高預測模型的性能。這篇文章的目的是來展示深度學習如何通過使用自定義損失函數來改善淺層學習問題。

我在處理財務數據時遇到過幾次的問題之一是,經常需要構建預測模型,其中輸出可以具有各種不同的值,且在不同的數量級上。例如,預測房價時可能會發生這種情況,其中一些住房的價值為 10 萬美元,其他房屋的價值為 1000 萬美元。如果您在這些問題(如線性回歸或隨機森林)中使用標準機器學習方法,那麼通常該模型會過擬合具有最高值的樣本,以便減少諸如平均絕對誤差等度量。然而,你可能真正想要的是用相似的權重來處理樣本,並使用錯誤度量如相對誤差來降低擬合具有最大值的樣本的重要性。

深度學習提供了一個優雅的解決方案來處理這類問題,替代了編寫自定義似然函數和優化器,您可以探索不同的內置和自定義損失函數,這些函數可以與提供的不同優化器一起使用。本文將展示如何在使用 Keras 時編寫 R 中的自定義損失函數,並展示如何使用不同的方法對不同類型的數據集有利。

下面的圖片是我將要用做文章預覽封面的,它顯示了根據波士頓房價數據集訓練的四種不同 Keras 模型的培訓歷史。每個模型使用不同的損失函數,但是在相同的性能指標上評估,即平均絕對誤差。對於原始數據集,自定義損失函數不會提高模型的性能,但基於修改後的數據集,結果更喜人。

對原始房價數據集執行 4 項損失函數。所有模型均使用 MAE 作為性能指標。


用深度學習改進淺層問題

深度學習的一個重要特徵是它可以應用於感知數據的深層問題,(如音頻和視頻)以及結構化數據的淺層問題。對於淺層學習(經典 ML)問題,你通常可以通過使用自定義損耗函數來查看淺層方法的改進,從而提供有用的信號。

然而,並非所有淺層問題都可以從深度學習中受益。我發現自定義損失函數在建立需要為不同數量級的數據創建預測的回歸模型時非常有用。例如,在一個價值可以顯著變化的地區預測房價。為了說明實踐中是如何工作的,我們將使用由 Keras 提供的波士頓房屋數據集:

數據集-Keras 文件

數據集來自 IMDB 的 25000 條電影評論,用標籤(正面或負面)對其進行標記。評論已經被處理過。

該數據集包括 20 世紀 70 年代波士頓郊區的房價。每個記錄有 13 個屬性對家庭進行描述,訓練數據集中有 404 條記錄,測試數據集中有 102 條記錄。在 R 中,可以按如下方式載入數據集: dataset_boston_housing()。價格分布直方圖顯示在下面的左邊,其中價格分布從 5 千美元到五萬美元不等。原始數據集中不同的價格區間有相似的需求,因此自定義損失函數可能對擬合該數據太大用處。右側的直方圖顯示有受益於使用自定義丟失的標籤轉換。右側的直方圖展示了經過標籤轉換之後的直方圖,將損失函數運用到這些標籤上將會獲得更好地效果。

波士頓數據集包括原始價格和轉換後的價格

對於如何將價格進行轉換,我將標籤轉換成絕對價格,將結果平方,然後除以大的因子。這產生了一個數據集,其中最高價格和最低價格之間的差異不是 10 倍而是 100 倍。我們現在有一個可以從使用自定義損失函數中獲益的預測問題。生成這些圖的 R 代碼如下所示。

Keras 中的損失函數

Keras中包含許多用於訓練深度學習模型的有用損失函數。例如: mean_absolute_error() 就適用於數值在某種程度上相等的數據集。還有一些函數可能更適合轉換後的住房數據,例如:mean_squared_logarithmic_error() 。 下面是由R為Keras提供的損失函數介面:

損失函數。R 是指 Python 當中的函數,為了真正理解這些函數是如何工作的,我們需要先了解到 Python 的損失函數代碼。我們要研究的第一個損失函數是下面定義的均方誤差。該函數計算預測值與實際值之間的差值,然後將結果平方 (使所有的值均為正),最後計算平均值。注意,該函數使用張量進行計算,而不是 Python 原語。當在 R 中定義自定義損失函數時將使用相同的方法。

我們將探討的下一個內置損失函數是根據預測值與目標值的之間自然對數的差來計算誤差。它在此處定義並在下面寫出。該函數使用 clip 操作來確保負值不會傳遞到日誌函數,並且向 clip 後的結果+1,這可確保所有對數轉換的輸入都具有非負數結果。這個函數與我們在 R 中定義的函數類似。

我們將探討的兩個自定義損失函數在下面的 R 代碼段中定義。第一個函數,mean log absolute error(MLAE),計算預測值和實際值的對數變換之間的差值,然後對計算結果進行平均。與上面的內置函數不同,這種方法不能糾正錯誤。與上述對數函數的另一個區別是,該函數將顯式比例的因子應用到數據當中,將房屋價格轉換回原始值(5,000 至 50,0000)而不是(5,50)。這是有用的,因為它減少了+1 對預測值和實際值的影響。

像 Python 函數一樣,R 的自定義損失函數需要對張量(而不是 R 原語)進行操作。為了執行這些操作,需要使用 backend() 獲取對後端的引用。在我的系統配置中,這返回了對 Tensorflow 的引用。

第二個函數計算日誌錯誤的平方,與內置函數類似。主要區別在於我使用的是激活函數 relu 而不是 clip,並且對於特定的住房數據集,我進行價格縮放操作。


評估損失函數

我們現在有四種不同的損失函數,我們要用原始數據集和經過改造的住房數據集來對四種不同的損失函數的性能進行評估。本節將介紹如何設置 Keras,載入數據,編譯模型,擬合模型和評估性能。本節的完整代碼可在 Github 上找到。

首先,我們需要建立我們的深度學習環境。這可以通過 Keras 包和 install_keras 函數完成。

安裝完成後,我們將載入數據集並應用我們的轉換來改變住房價格。最後兩項操作可以注釋掉,使用原來的房價。

接下來,我們將創建一個 Keras 模型來預測房價。我使用了「Deep Learning with R」中示例的網路結構。該網路包括兩層全連接層及其激勵函數 relu,以及一個沒有變換的輸出層。

為了編譯模型,我們需要指定優化器,損失函數和度量。我們將對所有不同的損失函數使用相同的度量和優化器。下面的代碼定義了損失函數列表,對於第一次迭代,模型使用均方誤差。

最後一步是擬合模型,然後評估性能。我使用了 100 個批次並且每個批次大小為 5,按照 20%的比例將分割出來的數據作為驗證集。在模型訓練完訓練集之後,模型的性能通過測試數據集上的平均絕對誤差來評估。

我用不同的損失函數訓練了四種不同的模型,並將這種方法應用於原始房價和轉換後的房價當中。以下顯示了所有這些不同組合的結果。


房價數據集損失函數的表現

在原始數據集上,在損失函數中應用對數變換實際上增加了模型的誤差。由於數據在一個數量級內存在一定的正態分布,這並不令人驚訝。對於變換的數據集,平方對數誤差方法優於均方誤差損失函數。這表明如果您的數據集不適合內置的損失函數,自定義損失函數可能值得探索。

下面顯示了轉換數據集上四種不同損失函數的模型訓練歷史。每個模型使用相同的錯誤度量(MAE),但是具有不同的損失函數。一個令人驚訝的結果是,對於所有的損失函數來說,應用日誌轉換的方法驗證錯誤率要高得多。

在轉換後的房價數據集上對 4 種損失函數測試各自的性能。所有模型都使用 MAE 作為性能指標。

深度學習可以成為淺層學習問題的有用工具,因為您可以定義自定義的損失函數,這些函數可能會顯著提高模型的性能。這不適用於所有問題,但如果預測問題不能很好地映射到標準損失函數,則可能會有用。

https://towardsdatascience.com/custom-loss-functions-for-deep-learning-predicting-home-values-with-keras-for-r-532c9e098d1f


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

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


請您繼續閱讀更多來自 AI研習社 的精彩文章:

ASC18 世界超算總決賽清華衛冕,「黑馬」上科大摘得亞軍及 AI 獎項
孔曉泉:自然語言處理應用和前沿技術回顧

TAG:AI研習社 |