【火爐煉AI】機器學習007-用隨機森林構建共享單車需求預測模型

煉丹老頑童發表於2018-08-06

【火爐煉AI】機器學習007-用隨機森林構建共享單車需求預測模型

(本文所使用的Python庫和版本號: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

共享單車是最近幾年才發展起來的一種便民交通工具,基本上是我等屌絲上班,下班,相親,泡妞必備神器。本專案擬使用隨機森林迴歸器構建共享單車需求預測模型,從而檢視各種不同的條件下,共享單車的需求量。


1. 準備資料集

本次使用的資料集來源於加利福尼亞大學歐文分校(UCI)大學的公開資料集:https://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset,關於本次資料集的各種資訊可以參考該網站,同時也可以直接從該網站下載和使用資料集。本次共享單車資料集包含有兩個檔案,一個是按天來統計的共享單車使用量資料,另一個是按照小時數來統計的使用量。

說句題外話,這個共享單車資料集是在2011年至2012年間收集的,此處的共享單車是採用固定樁形式的單車,類似於中國的永安行,並不是我們目前所看到的滿大街的小黃車,小藍車,摩拜之類。

下載後,將資料集解壓到D:\PyProjects\DataSet\SharingBikes中。本資料集總共有17389個樣本,每個樣本有16列,其中,前兩列是樣本序號和日期,可以不用考慮,最後三列資料是不同型別的輸出結果,最後一列是第十四列和第十五列的和,因此本模型中不考慮第十四列和第十五列。

【火爐煉AI】機器學習007-用隨機森林構建共享單車需求預測模型

本資料集16列對應的資訊分別為:

【火爐煉AI】機器學習007-用隨機森林構建共享單車需求預測模型

如下為分析資料集的主要程式碼,此處我沒有深入研究資料集各個特徵列之間的關係。

# 首先分析資料集
dataset_path='D:\PyProjects\DataSet\SharingBikes/day.csv' # 首先只分析day 資料
# 首先載入資料集
raw_df=pd.read_csv(dataset_path,index_col=0)
# print(raw_df.shape)  # (731, 15)
# print(raw_df.head()) # 檢視是否正確載入
# print(raw_df.columns)
# 刪除不需要的列,第1列,第12,13列
df=raw_df.drop(['dteday','casual','registered'],axis=1)
# print(df.shape) # (731, 12)
# print(df.head()) # 檢視沒有問題
print(df.info()) # 沒有缺失值 第一列為object,需要進行轉換
# print(df.columns)

# 分隔資料集
dataset=df.as_matrix() # 將pandas轉為np.ndarray

# 將整個資料集分隔成train set和test set
from sklearn.model_selection import train_test_split
train_set,test_set=train_test_split(dataset,test_size=0.1,random_state=37)
# print(train_set.shape) # (657, 12)
# print(test_set.shape) # (74, 12)
# print(dataset[:3])
複製程式碼

-------------------------------------輸---------出--------------------------------

<class 'pandas.core.frame.DataFrame'> Int64Index: 731 entries, 1 to 731 Data columns (total 12 columns): season 731 non-null int64 yr 731 non-null int64 mnth 731 non-null int64 holiday 731 non-null int64 weekday 731 non-null int64 workingday 731 non-null int64 weathersit 731 non-null int64 temp 731 non-null float64 atemp 731 non-null float64 hum 731 non-null float64 windspeed 731 non-null float64 cnt 731 non-null int64 dtypes: float64(4), int64(8) memory usage: 74.2 KB None

--------------------------------------------完-------------------------------------

########################小**********結###############################

1,從列印的結果可以看出,這個資料集中沒有缺失值,且每一列的資料特徵都是一致的,故而不需要再額外做這些處理。

2,資料集中season, yr等有7列是int64型別,代表這些資料需要重新轉換為獨熱編碼格式,比如對於season中,1=春,2=夏,3=秋,4=冬,需要改成獨熱編碼形成的稀疏矩陣。

#################################################################


2. 構建隨機森林迴歸模型

在第一次嘗試時,我沒有對原始資料進行任何的特徵分析,也沒有對資料集進行修改,直接使用隨機森林迴歸模型進行擬合,看看結果怎麼樣。

# 其次,構建隨機森林迴歸器模型
from sklearn.ensemble import RandomForestRegressor 
rf_regressor=RandomForestRegressor()
# rf_regressor=RandomForestRegressor(n_estimators=1000,max_depth=10,min_samples_split=0.5)

rf_regressor.fit(train_set[:,:-1],train_set[:,-1]) # 訓練模型

# 使用測試集來評價該回歸模型
predict_test_y=rf_regressor.predict(test_set[:,:-1])

import sklearn.metrics as metrics
print('隨機森林迴歸模型的評測結果----->>>')
print('均方誤差MSE:{}'.format(
    round(metrics.mean_squared_error(predict_test_y,test_set[:,-1]),2)))
print('解釋方差分:{}'.format(
    round(metrics.explained_variance_score(predict_test_y,test_set[:,-1]),2)))
print('R平方得分:{}'.format(
    round(metrics.r2_score(predict_test_y,test_set[:,-1]),2)))
複製程式碼

-------------------------------------輸---------出--------------------------------

隨機森林迴歸模型的評測結果----->>> 均方誤差MSE:291769.31 解釋方差分:0.92 R平方得分:0.92

--------------------------------------------完-------------------------------------

然後採用(【火爐煉AI】機器學習006-用決策樹迴歸器構建房價評估模型)的方式繪製相對重要性直方圖,結果如下:

【火爐煉AI】機器學習007-用隨機森林構建共享單車需求預測模型

########################小**********結###############################

1,在沒有對資料集進行任何處理的情況下,採用預設的隨機森林迴歸器得到的模型在測試集上的MSE非常大,解釋方差分和R2都是0.93,表明模擬的還可以。

2,從相對重要性圖中可以看出,溫度對共享單車的使用影響最大,這個可以理解,比如冬天太冷,夏天太熱時,騎小黃車的人就顯著減少。但圖中顯示年份(yr)是第二個重要因素,這個估計是因為年份只有2011和2012兩年所致,要想得到更加可信的結果,還需要更多年份的資料。

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章