編者按:Zalando研究工程師Jekaterina Kokatjuhha通過解決現(xiàn)實(shí)生活的實(shí)際問題,介紹了如何從頭開始進(jìn)行數(shù)據(jù)科學(xué)項(xiàng)目。
網(wǎng)上有許多關(guān)于數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)的教程,它們涉及的實(shí)操案例往往離不開講解理論,提供一些代碼,然后分析很干凈的數(shù)據(jù)。
但是,如果你想開始實(shí)踐數(shù)據(jù)科學(xué),最好的方法其實(shí)是選取一個(gè)真實(shí)生活問題,深入數(shù)據(jù)以尋找深刻的洞見,用額外的數(shù)據(jù)來源進(jìn)行特征工程,創(chuàng)建可獨(dú)立運(yùn)行的機(jī)器學(xué)習(xí)工作流。
這篇博客文章將講解從頭創(chuàng)建數(shù)據(jù)科學(xué)項(xiàng)目的主要步驟。它基于現(xiàn)實(shí)生活問題——柏林租金高低的主要決定因素是什么?我們將分析這一情況,并列出機(jī)器學(xué)習(xí)初學(xué)者常犯的錯(cuò)誤。
下面是我們將詳細(xì)討論的步驟:
尋找主題
自web提取數(shù)據(jù)并清洗
取得深入的洞見
基于外部API進(jìn)行特征工程
從事機(jī)器學(xué)習(xí)時(shí)常犯的錯(cuò)誤
特征重要性:找到主導(dǎo)租金高低的因素
創(chuàng)建機(jī)器學(xué)習(xí)模型
尋找主題
有許多問題都可以通過分析數(shù)據(jù)解決,不過尋找一個(gè)你感興趣并能給你提供動(dòng)力的問題總是最好的。搜尋主題時(shí),毫無疑問,你應(yīng)該重點(diǎn)關(guān)注自己的偏好和興趣。
不過,我建議你不僅關(guān)注自己的興趣,也聽聽周圍的人在談?wù)撌裁础J裁唇o他們造成了困擾?他們在抱怨什么?這是數(shù)據(jù)科學(xué)項(xiàng)目的又一個(gè)靈感來源。如果人們在抱怨,那也許意味著現(xiàn)有方案并沒有很好地解決人們的問題。因此,如果你嘗試基于數(shù)據(jù)分析來處理這一問題,你可能提供一個(gè)更好的解決方案,影響人們對這一主題的看法。
這些聽起來也許都比較抽象。所以讓我談?wù)勛约菏侨绾蜗氲椒治霭亓值淖饨鸬摹?/p>
“早知道這里的租金這么高,我報(bào)期望薪資的時(shí)候會報(bào)一個(gè)更高的價(jià)格?!边@是我從最近搬到柏林工作的人那里聽到的話。大多數(shù)剛搬到柏林的人抱怨他們沒想到柏林的生活成本這么高,也沒有關(guān)于公寓可能價(jià)格范圍的統(tǒng)計(jì)數(shù)據(jù)。如果他們事先知道這一點(diǎn),他們在工作申請過程中本可以報(bào)一個(gè)更高的價(jià),或者考慮其他選項(xiàng)。
我在網(wǎng)上搜索了一番,也查看了若干租房網(wǎng)站,也問了一些人,但都沒能找到關(guān)于當(dāng)前市場價(jià)格的合理統(tǒng)計(jì)數(shù)據(jù)或可視化。所以我萌生了自己進(jìn)行分析的想法。
我想要收集數(shù)據(jù),創(chuàng)建一個(gè)面板,這個(gè)面板會根據(jù)你選擇的條件(例如,40平方米,米特區(qū),帶陽臺、炊具齊全的廚房)顯示價(jià)格范圍。這本身就有助于人們理解柏林的房租價(jià)格。另外,通過應(yīng)用機(jī)器學(xué)習(xí),我將能識別決定房租價(jià)格的因素,并練習(xí)不同的機(jī)器學(xué)習(xí)算法。
自web提取數(shù)據(jù)并清洗
獲取數(shù)據(jù)
在對要做數(shù)據(jù)科學(xué)項(xiàng)目有一個(gè)概念之后,我們可以開始尋找數(shù)據(jù)了。網(wǎng)上有特別多很棒的數(shù)據(jù)倉庫,例如Kaggle、UCI ML、數(shù)據(jù)集搜索引擎、收錄學(xué)術(shù)論文及其數(shù)據(jù)集的網(wǎng)站。此外,你可以爬取網(wǎng)站數(shù)據(jù)。
不過,小心——舊數(shù)據(jù)到處都是。我在搜索關(guān)于柏林房租的信息的時(shí)候,找到了許多可視化結(jié)果,但它們或者比較陳舊,或者沒有指明年份。
有些統(tǒng)計(jì)甚至注明只統(tǒng)計(jì)了不帶家具的50平方米的兩室公寓的租金。如果我想要一個(gè)帶裝修好了的廚房的較小的公寓呢?
由于我只找到了舊數(shù)據(jù),所以我決定爬取租房網(wǎng)站的信息。關(guān)于爬取網(wǎng)站信息,我專門寫了一篇博客,討論其細(xì)節(jié)、缺陷、設(shè)計(jì)模式:https://hackernoon.com/web-scraping-tutorial-with-python-tips-and-tricks-db070e70e071
要點(diǎn)是:
在爬取之前,檢查下是否有公共API可用。
文明爬?。〔灰谝幻雰?nèi)發(fā)送數(shù)百個(gè)請求使網(wǎng)站過載。
在提取信息的過程中及時(shí)保存數(shù)據(jù)。
數(shù)據(jù)清洗
一旦開始獲取數(shù)據(jù),非常重要的一點(diǎn)是及早查看數(shù)據(jù),以便盡早找出可能存在的問題。例如,爬取程序可能漏掉了一些重要的字段,保存程序至文件時(shí),如果使用逗號作為分隔符,而原數(shù)據(jù)中也包含逗號,如果沒有正確處理,最終文件的格式會出現(xiàn)錯(cuò)亂。
在爬取租房信息的時(shí)候,我的爬取程序內(nèi)置了一些小小的檢查措施,查驗(yàn)所有特征的缺失值數(shù)目。站長可能會更改網(wǎng)站的HTML結(jié)構(gòu),導(dǎo)致爬取程序無法獲取任何數(shù)據(jù)。
確??紤]了網(wǎng)站爬取的所有技術(shù)方面的問題之后,我本以為數(shù)據(jù)基本上是理想的。然而,我最終花了大約一周清洗所有數(shù)據(jù),因?yàn)閿?shù)據(jù)當(dāng)中包含一些隱蔽的重復(fù)條目。
理想和現(xiàn)實(shí)
出現(xiàn)重復(fù)條目的原因有:
多次展示的同一間公寓
中介輸入時(shí)輸錯(cuò)了信息,比如租金或樓層。之后他們有時(shí)會更正信息,有時(shí)會重新發(fā)布一條包含正確信息的新廣告。
同一間公寓的價(jià)格在一個(gè)月后會變動(dòng)(漲價(jià)或降價(jià))。
盡管第一種情形很容易識別(通過ID),第二種情形非常復(fù)雜。原因在于中介可能略微修改描述,改動(dòng)錯(cuò)誤的價(jià)格,并作為新廣告發(fā)布,因此ID也會是新的。
我設(shè)計(jì)了許多規(guī)則來識別這種情況。一旦識別出這些公寓其實(shí)是重復(fù)條目,我會根據(jù)日期對這些條目進(jìn)行排序,選擇最新發(fā)布的條目。
此外,有些中介會在一個(gè)月后調(diào)整同一間公寓的房租。我聽說如果無人問津,那么會降價(jià),相反則會漲價(jià)。
取得深入的洞見
一切就緒之后,我們可以開始分析數(shù)據(jù)了。我知道數(shù)據(jù)科學(xué)家喜歡seaborn和ggplot2,還有其他許多靜態(tài)可視化工具。
然而,可交互面板有助于你本人和其他利益相關(guān)人找出有用的洞見。這方面有許多非常棒的易用工具,例如Tableau和Microstrategy。
我花了不到30分鐘就創(chuàng)建了一個(gè)交互式面板,可以根據(jù)選擇的條件顯示價(jià)格范圍。
這樣一個(gè)相當(dāng)簡單的面板已經(jīng)可以為剛來柏林的人提供不少關(guān)于房租的洞見,如果租房網(wǎng)站能提供這樣一個(gè)工具,應(yīng)該也會吸引不少用戶。
我們從數(shù)據(jù)可視化中已經(jīng)能看到,從租金分布上來說,2.5房公寓的租金總體上反而低于2房公寓。原因在于大多數(shù)2.5房公寓不在市中心。
基于外部API進(jìn)行特征工程
可視化有助于識別重要屬性,或“特征”,這些特征可以為機(jī)器學(xué)習(xí)算法所用。如果用到的特征包含很少信息,任何算法都不能給出良好的預(yù)測。如果特征很給力,即使非常簡單的算法也能得到相當(dāng)不錯(cuò)的結(jié)果。
在房租項(xiàng)目中,價(jià)格是一個(gè)連續(xù)變量,所以通常而言這是一個(gè)回歸問題。我從提取的信息中收集了特征,以預(yù)測租金。
然而,這里有一個(gè)特征比較麻煩——地址。總共有6千6百間公寓,位于4千4百個(gè)不同粒度的地址。我們可以按郵政編碼劃分地址,然后將其轉(zhuǎn)換為獨(dú)熱編碼,不過這會損失特定位置的精確信息。
不同粒度的地址:詳細(xì)地址;只有街名,門牌號隱藏;只有郵政編碼
當(dāng)你得到一個(gè)新地址的時(shí)候,你會做什么?
你要么搜一下它在哪里,要么搜下如何去哪里。
通過使用外部的API,我們可以根據(jù)公寓地址計(jì)算:
到柏林腓特烈大街站(中央車站)坐火車要多久?
到柏林市中心站的汽車行車距離
到最近地鐵站步行要多久?
公寓方圓一公里內(nèi)的地鐵站數(shù)量
這四個(gè)特征顯著提升了模型的表現(xiàn)。
從事機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)項(xiàng)目時(shí)常犯的錯(cuò)誤
爬取或獲取數(shù)據(jù)之后,在應(yīng)用機(jī)器學(xué)習(xí)模型之前還有許多步驟需要完成。
我們需要可視化每個(gè)變量,看看它們的分布,找到離群值,并理解為何存在這些離群值。
如何處理具體特征中的缺失值?
將類別變量轉(zhuǎn)換成數(shù)值的最佳方式是什么?
有許多類似這樣的問題,但我會詳細(xì)解釋大多數(shù)初學(xué)者容易犯錯(cuò)的那些問題。
1. 可視化
首先,你應(yīng)該可視化連續(xù)特征的分布,以大概了解是否有許多離散值,變量的分布是什么樣的,以及這些是否有意義。
有許多可視化分布的方式,例如,箱形圖、直方圖、累積分布函數(shù)、提琴形圖。然而,你應(yīng)該選擇能夠提供最多關(guān)于數(shù)據(jù)的信息的圖形。
基于圖形,最值得注意的問題是:你看到你想要查看的東西了嗎?回答這個(gè)問題有助于你找到關(guān)于數(shù)據(jù)的洞見或bug。
我經(jīng)常從Python的seaborn圖片庫中汲取該使用哪種圖形的靈感。另一個(gè)很好的靈感來源是Kaggle網(wǎng)站上的kernel。
就租金而言,我繪制了每個(gè)連續(xù)特征的直方圖,期望可以在大多數(shù)特征上看到長尾。
箱形圖有助于查看每個(gè)特征的離群值。事實(shí)上,大部分離群值要么是大于200平方米的工坊,要么是租金極低的學(xué)生宿舍。
2. 是否需要根據(jù)整個(gè)數(shù)據(jù)集填充缺失值?
由于多種原因,有時(shí)候會有缺失值。如果我們排除所有包含至少一個(gè)缺失值的觀測,我們最終會得到一個(gè)縮水很多的數(shù)據(jù)集。
有許多填充缺失值的方式,比如使用均值,中位數(shù)。應(yīng)該怎么做完全取決于你,但需確保只根據(jù)訓(xùn)練數(shù)據(jù)計(jì)算填充值,以防數(shù)據(jù)泄露。
租金數(shù)據(jù)同時(shí)提取了關(guān)于公寓的描述。如果公寓品質(zhì)、狀況、類型缺失,且描述包含相關(guān)信息,我會根據(jù)描述填充這些缺失值。
3. 如何轉(zhuǎn)換類別變量?
取決于具體實(shí)現(xiàn),某些算法無法直接處理類別數(shù)據(jù),需要以某種方式將其轉(zhuǎn)換為數(shù)值。
有許多轉(zhuǎn)換類別變量至數(shù)值特征的方式,例如標(biāo)簽編碼、獨(dú)熱編碼、bin編碼和哈希編碼。然而,大多數(shù)人在應(yīng)該使用獨(dú)熱編碼的時(shí)候會誤用標(biāo)簽編碼。
例如,假定租金數(shù)據(jù)中公寓類型列具有下列值:[底樓, 閣樓, 復(fù)式, 閣樓, 閣樓, 底樓]。標(biāo)簽編碼將其轉(zhuǎn)為[3, 2, 1, 2, 2, 1],這就引入了順序,即底樓 > 閣樓 > 復(fù)式。在決策樹及其變體之類的一些算法上,這種特征編碼方式?jīng)]什么問題,但應(yīng)用回歸算法和SVM也許就會出問題。
在租金數(shù)據(jù)集中,狀況編碼為:
新:1
翻新:2
需要翻新:3
品質(zhì)則編碼為:
奢侈:1
優(yōu)于平常:2
平常:3
簡單:4
未知:5
4. 我需要標(biāo)準(zhǔn)化變量嗎?
標(biāo)準(zhǔn)化將所有連續(xù)變量縮放至同一尺度,也就是說,假設(shè)一個(gè)變量的取值范圍是一千到一百萬,另一個(gè)變量的取值范圍是0.1到1,標(biāo)準(zhǔn)化之后這兩個(gè)變量的取值范圍會一樣。
L1或L2正則化是緩解過擬合的常用方式,可用于多種回歸算法。然而,在應(yīng)用L1或L2之前先標(biāo)準(zhǔn)化特征很重要。因?yàn)長1或L2會懲罰較大的系數(shù),如果沒有標(biāo)準(zhǔn)化,單位較小的系數(shù)會受到更多懲罰。
另外,如果算法使用梯度下降,那么標(biāo)準(zhǔn)化特征后梯度下降能夠更快收斂。
5. 我需要對目標(biāo)變量取對數(shù)嗎?
我花了一段時(shí)間才明白這個(gè)問題沒有統(tǒng)一的答案。
它取決于很多因素:
你想要的是百分比誤差還是絕對誤差
你用的是什么算法
殘差圖和測度的變化告訴了你什么
在回歸問題中,首先關(guān)注殘差圖和測度。有時(shí)候,目標(biāo)變量的對數(shù)導(dǎo)向一個(gè)更好的模型,并且模型的結(jié)果仍然容易理解。然而,還有其他值得關(guān)注的變換,比如取平方根。
Stack Overflow上有很多關(guān)于這個(gè)問題的回答,我覺得EdM的回答解釋得很好:https://stats.stackexchange.com/a/320213
我在租金數(shù)據(jù)上,對價(jià)格取了對數(shù),這樣殘差圖看起來要好一點(diǎn)。
左:取對數(shù);右:未轉(zhuǎn)換數(shù)據(jù)
6. 更多重要事項(xiàng)
有些算法,比如回歸算法,當(dāng)系數(shù)變得非常不穩(wěn)定時(shí),會陷入數(shù)據(jù)的共線性問題。更多數(shù)學(xué)方面的講解可以參考:http://www.stat.cmu.edu/~larry/=stat401/lecture-17.pdf 取決于核的選取,SVM也許會也許不會受此困擾。
基于決策樹的算法不會碰到多重共線性問題,因?yàn)樗鼈兛梢栽诓煌瑯渲薪粨Q特征而不影響表現(xiàn)。然而,特征重要性的解讀會變得更困難,因?yàn)橄嚓P(guān)變量可能顯得不那么重要。
機(jī)器學(xué)習(xí)
監(jiān)督機(jī)器學(xué)習(xí)有許多算法可供選擇,我打算探索三種不同的算法,比較下它們的表現(xiàn)和速度。這三種算法是梯度提升(XGBoost和LightGMB)、隨機(jī)森林(scikit-learn的實(shí)現(xiàn))、3層神經(jīng)網(wǎng)絡(luò)(基于TensorFlow框架)。由于我對目標(biāo)變量取了對數(shù),因此我選擇了RMSLE作為優(yōu)化過程的測度。
XGBoost和LightGBM的表現(xiàn)相當(dāng),隨機(jī)森林略差,而神經(jīng)網(wǎng)絡(luò)的表現(xiàn)是最差的。
算法在測試集上的表現(xiàn)(RMSLE)
基于決策樹的算法在解讀特征上非常方便,它們可以生成特征重要性評分。
特征重要性:找到?jīng)Q定租金的因素
使用基于決策樹的模型擬合數(shù)據(jù)后,我們可以查看哪些特征在價(jià)格預(yù)測中起的作用最大。
特征重要性提供了一個(gè)評分,這個(gè)評分指示了在構(gòu)建模型中的決策樹時(shí),每個(gè)特征的信息量有多大。計(jì)算這種評分的一種方式是算下一種特征在所有樹中多少次用于分割數(shù)據(jù)。當(dāng)然,也可以用不同的方法計(jì)算評分。
特征重要性可以揭示其他關(guān)于決定價(jià)格的主要因素的洞見。
就租金預(yù)測而言,總面積是最重要的決定價(jià)格的因素,這并不令人意外。有意思的是,一些利用外部API構(gòu)建的特征同樣屬于最重要的特征。
然而,Scott Lundberg在Interpretable Machine Learning with XGBoost(基于XGBoost的可解釋的機(jī)器學(xué)習(xí))中指出,不同的選項(xiàng)(測度)可能得出不一致的特征重要性。Scott Lundberg在NIPS 2017上提出了一種新的兼具精確性和一致性的計(jì)算特征重要性的方法,并提供了這一方法的開源Python實(shí)現(xiàn)SHAP。
基于SHAP得到的特征重要性分析如下:
x軸位置表示特征對模型預(yù)測的影響,顏色表示特征值的大小
上圖包含大量信息:(聲明:數(shù)據(jù)采集自2018年初,之后的情況可能有變動(dòng))
離市中心越近(到柏林腓特烈大街站坐火車花費(fèi)的時(shí)間和到柏林市中心站的汽車行車距離),預(yù)測租金越高
總面積是最強(qiáng)的決定因素
如果公寓主要求你有低收入證明(德國的WBS),預(yù)測價(jià)格會比較低
下面這些區(qū)域的租金較高:Mitte、 Prenzlauer Berg、Wilmersdorf、Charlottenburg、Zehlendorf and Friedrichshain
下面這些區(qū)域的租金較低:Spandau、 Tempelhof、Wedding、 Reinickendorf
顯然,狀況較好(特征值較低意味著較好)、品質(zhì)較好(特征值較低意味著較好),家具齊全,內(nèi)置廚房,有電梯的公寓租金是最貴的。
比較有意思的是下面兩個(gè)特征的影響:
到最近地鐵站步行時(shí)間
方圓一公里內(nèi)的地鐵站數(shù)量
到最近地鐵站步行時(shí)間
看起來,對某些公寓而言,較高的特征值意味著價(jià)格較高。原因在于,這些公寓位于柏林外富裕的住宅區(qū)。
我們也能看到,靠近地鐵站既拉高租金又降低租金。原因可能是靠近地鐵站的公寓出行更方便,但噪音比較大。我們可以進(jìn)一步探索這一點(diǎn),比如考慮到最近的公交站的步行時(shí)間。
方圓一公里內(nèi)的地鐵站數(shù)量這一特征同理。
集成平均
在探索了不同的模型并比較其表現(xiàn)后,我們可以組合每個(gè)模型的結(jié)果,創(chuàng)建一個(gè)集成模型!
Bagging是利用多種算法的預(yù)測計(jì)算最終的聚合預(yù)測的機(jī)器學(xué)習(xí)集成模型。它的設(shè)計(jì)有助于防止過擬合并降低算法的方差。
集成模型的優(yōu)勢;圖片來源:burakhimmetoglu.com
由于我已經(jīng)具備了上述算法的預(yù)測,我嘗試了這些算法的各種組合方式,基于在驗(yàn)證集上的RMSLE得出了7個(gè)最佳模型。
然后在測試集上計(jì)算這7個(gè)模型的RMSLE。
相比之下,集成三種基于決策樹的模型表現(xiàn)最佳。
我們也可以構(gòu)建一個(gè)加權(quán)集成模型,給表現(xiàn)更好的單個(gè)模型更多的權(quán)重。背后的依據(jù)是,僅當(dāng)其他模型在另一種替代預(yù)測上取得一致時(shí),才能壓過最佳模型一頭。
在現(xiàn)實(shí)中,如果不進(jìn)行嘗試,我們永遠(yuǎn)不會知道平均集成會比單個(gè)模型的效果更好。
堆疊模型
平均或加權(quán)集成并不是組合不同模型預(yù)測的唯一方法。我們還能以不同方式堆疊模型!
堆疊模型背后的思路是創(chuàng)建若干基礎(chǔ)模型,然后創(chuàng)建一個(gè)元模型,元模型根據(jù)基礎(chǔ)模型的結(jié)果生成最終預(yù)測。然而,如何訓(xùn)練元模型并不是顯而易見的,否則元模型很容易偏向最佳的基礎(chǔ)模型。burakhimmetoglu寫的Stacking models for improved predictions(堆疊模型以改進(jìn)預(yù)測)很好地解釋了如何正確地做到這一點(diǎn)。
在我們的租金預(yù)測中,堆疊模型完全沒有提升RMSLE——甚至結(jié)果更差了??赡艿脑蛴泻芏唷苍S我的代碼寫錯(cuò)了;),或者堆疊引入了過多噪聲。
如果你對更多關(guān)于集成模型和堆疊模型的內(nèi)容感興趣,Triskelion的文章Kaggle Ensemble Guide(Kaggle集成指南)講解了許多不同種類的集成方法,并比較了它們的表現(xiàn),也討論了堆疊模型是如何成為Kaggle競賽的王者。
總結(jié)
留心周圍人談話的內(nèi)容;他們抱怨的東西可能給你提供啟發(fā)。
提供可交互的面板讓人們找到自己的洞見。
不要讓自己局限于常見的特征工程方法,比如將兩個(gè)變量相乘。嘗試尋找其他數(shù)據(jù)來源或解釋。
嘗試集成模型和堆疊模型,因?yàn)檫@些方法可能可以提升表現(xiàn)。
最后,別忘了提供數(shù)據(jù)的日期!
-
可視化
+關(guān)注
關(guān)注
1文章
1194瀏覽量
20952 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8420瀏覽量
132687 -
數(shù)據(jù)科學(xué)
+關(guān)注
關(guān)注
0文章
165瀏覽量
10064
原文標(biāo)題:以房租分析為例:如何從頭創(chuàng)建數(shù)據(jù)科學(xué)項(xiàng)目
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論