[資料分析&機器學習] : Kaggle競賽 - 共享單車需求預測
[資料分析&機器學習] : Kaggle競賽 - 共享單車需求預測
News from: YJ.
這篇文章要教大家如何利用最基礎、簡單的機器學習知識加上Random Forest(隨機森林)演算法就可以獲得Kaggle上共享單車需求預測比賽在全世界前17%排名的成績(此範例程式在撰寫當下可獲得540的排名,總參加隊伍為3251隊),這篇教學文章為了讓新手能夠快速上手,省去了許多較為複雜的統計知識,若是有一定基礎的同學可再結合Kaggle討論區文章以及下方的參考閱讀獲得前10%的成績。以正式比賽來說前10%就可以獲得一個銅牌成就,並可放在個人的履歷以及Linkedin上,對於想跨科系轉職資料科學家的人來說是一個大大加分的成就。
直接切入正題,開始介紹一下這個共享單車需求預測的比賽在幹嘛。首先你會下載一筆資料包含時間、季節、是否是特別假日、是否是工作日、天氣狀況、溫度、體感溫度、濕度、風速來預測每小時的腳踏車數量。這筆資料包含完整兩年(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這個數字,而這個數字的來源是一本在工程師圈很有名的小說-銀河便車指南。
News from: YJ.
這篇文章要教大家如何利用最基礎、簡單的機器學習知識加上Random Forest(隨機森林)演算法就可以獲得Kaggle上共享單車需求預測比賽在全世界前17%排名的成績(此範例程式在撰寫當下可獲得540的排名,總參加隊伍為3251隊),這篇教學文章為了讓新手能夠快速上手,省去了許多較為複雜的統計知識,若是有一定基礎的同學可再結合Kaggle討論區文章以及下方的參考閱讀獲得前10%的成績。以正式比賽來說前10%就可以獲得一個銅牌成就,並可放在個人的履歷以及Linkedin上,對於想跨科系轉職資料科學家的人來說是一個大大加分的成就。
直接切入正題,開始介紹一下這個共享單車需求預測的比賽在幹嘛。首先你會下載一筆資料包含時間、季節、是否是特別假日、是否是工作日、天氣狀況、溫度、體感溫度、濕度、風速來預測每小時的腳踏車數量。這筆資料包含完整兩年(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這個數字,而這個數字的來源是一本在工程師圈很有名的小說-銀河便車指南。
留言
張貼留言