[資料分析&機器學習] 第4.2講 : Kaggle競賽-共享單車需求預測(前17%排名)

Yeh James
JamesLearningNote
Published in
7 min readOct 28, 2017

這篇文章要教大家如何利用最基礎、簡單的機器學習知識加上Random Forest(隨機森林)演算法就可以獲得Kaggle上共享單車需求預測比賽在全世界前17%排名的成績(此範例程式在撰寫當下可獲得540的排名,總參加隊伍為3251隊),這篇教學文章為了讓新手能夠快速上手,省去了許多較為複雜的統計知識,若是有一定基礎的同學可再結合Kaggle討論區文章以及下方的參考閱讀獲得前10%的成績。以正式比賽來說前10%就可以獲得一個銅牌成就,並可放在個人的履歷以及Linkedin上,對於想跨科系轉職資料科學家的人來說是一個大大加分的成就。

Kaggle 獎牌資格
範例程式分數
競賽隊伍成績

直接切入正題,開始介紹一下這個共享單車需求預測的比賽在幹嘛。首先你會下載一筆資料包含時間、季節、是否是特別假日、是否是工作日、天氣狀況、溫度、體感溫度、濕度、風速來預測每小時的腳踏車數量。這筆資料包含完整兩年(2011,2012)中1~12月的當中的1~19日歷史租借資料,用這些資料來預測20日~月底的每小時腳踏車租借數量。每個比賽都有背後的原因,大家可以想想為什麼要辦這樣的比賽?可能的原因有:透過這些預測模型,租借腳踏車的公司就可以使用動態定價(像是Uber動態價格的機制)來獲取更多的利益,或是準備更多的腳踏車以滿足臨時大量需求。

共享單車需求預測競賽資料介紹
共享單車需求預測競賽資料
共享單車需求預測競賽資料說明

首先先下載資料、並在Jupyter notebook裡面載入資料

下載共享單車需求預測競賽資料

使用Info看train, test的資料來觀察是否有空值?此時發現資料處理得很好都沒有空值!但別開心得太早!(保持對資料的警覺,有可能他們提供的資料先被一些不好的方法的填補了空值)

使用info()看Train資料型態以及是否有空值

在看資料分布的時候,我們發現最後右邊的欄位count(有點被切到)中的50百分位數為145, 75百分位數為284以及 max值為977相差非常巨大,因此可以判斷有Outlier,可以使用最簡單的超出三倍標準差概念將這些Outlier先去掉,避免對Model造成影響,去掉Outlier之後的預測分數也會明顯提升。

使用describe看Train資料分布狀況
去掉outlier

由於接下來要將時間處理成讓Random forest可以分析的格式,我們將時間拆成日期、小時、年、星期幾、月份的欄位(日期之後不會用到主要是用來算星期幾以及月份)。由於Train跟Test的資料都要做這樣的處理,因此我們先把Train, Test Data合併後一起處理。

合併train以及test data
處理時間格式

接著我們來看數值(metric)像是溫度(temp)、體感溫度(atemp)、濕度(humidity)、風速(windspeed)的資料分佈情況,使用seaborn的displot來呈現,displot是由兩種圖組成的:直方圖+核密度函數(直方圖就是國中小學的直方圖、核密度函數可參考: 什么是核密度估计?如何感性认识?) ,但這邊只是要看分佈而已,所以沒有這些知識也沒關係。在下方四張圖裡面我們可以觀察到一個非常重要的關鍵!在右下方風速的圖可以發現風速為0的值非常多,而靠近0的(大約風速6,7以內都沒有出現),中間也出現許多沒有任何值的情況,因此可以大概推論風速0是風速太小量不到或是只要是風速為空值都被資料提供方補上0!這種的0會對大部分的模型造成預估失準,因此我們要將風速為0的值重新估計。

我們先將資料分成風速為0以及風速不為0的資料,並且用風速不為0的資料來訓練random forest的模型,將訓練好的模型來預估風速為0的風速到底是多少。由下圖中可以看到我們已將風速為0的資料重新預估後去填補了空隙,這樣的做法可以明顯提升預測的準度。

最後一個小技巧是我們去觀察腳踏車出借數量(count)的資料分佈,可以發現原本的資料非常歪斜(Skew),也就是不符合常態分佈。透過取Log的方式,來讓資料分布較為接近常態分佈,這樣的技巧也可以讓預估上更準確。

可以看到取Log後的資料更接近常態分佈了。

最後將資料丟進Random forest train並且輸出結果到csv,接著上傳此csv檔就可以獲得大約17%的排名了!整段程式大約跑1~5分鐘,Random forest模型的參數這邊只做了n_estimators =1000這個非常基本的設定,random_state =42主要是隨機的方式,有點像是在洗撲克牌時洗牌的方式,透過設定一個固定的值,每個人跑這隻程式輸出的結果會跟我一模一樣。這個值可以設定任何數字,42的原因是因為Kaggle上面大家很喜歡用42這個數字,而這個數字的來源是一本在工程師圈很有名的小說-銀河便車指南。

程式碼

比賽連結

https://www.kaggle.com/c/bike-sharing-demand

感謝你閱讀完這篇文章,如果你覺得這些文章對你有幫助請在底下幫我拍個手(長按最多可以拍50下手)。

[Python資料分析&機器學習]這系列文章是我在Hahow上面所開設課程的講義,如果你是新手想著看影片一步一步學習,可以參考這門課:https://hahow.in/cr/pydataml

如果你對什麼主題的文章有興趣的話,歡迎透過這個連結告訴我:https://yehjames.typeform.com/to/XIIVQC
有任何問題也歡迎在底下留言或是來信告訴我: yehjames23@gmail.com

參考閱讀

  1. EDA & Ensemble Model (Top 10 Percentile)
  2. Bike Rentals By Time And Temperature
  3. Check adherence to Benford’s Law
  4. Random Forest Benchmark
  5. Bike Rentals By Time
  6. Data Vizualization
  7. zeros in windspeed
  8. 什么是核密度估计?如何感性认识?

--

--