实战 | Kaggle竞赛:华盛顿特区首都自行车租赁预测
大家好,我是木木~?
今天為大家?guī)硪黄P(guān)于Kaggle競(jìng)賽的實(shí)戰(zhàn)!話不多說,直接上代碼
01
準(zhǔn)備數(shù)據(jù)
使用數(shù)據(jù)集:
華盛頓特區(qū)首都自行車租賃數(shù)據(jù)集
背景描述:
自行車共享系統(tǒng)是租用自行車的一種方式,在這種情況下,獲得會(huì)員資格、租賃和自行車返回的過程通過遍布城市的亭址網(wǎng)絡(luò)實(shí)現(xiàn)自動(dòng)化。使用這些系統(tǒng),人們可以從一個(gè)地點(diǎn)租一輛自行車,并根據(jù)需要將它歸還到另一個(gè)地方。目前,世界各地有500多個(gè)自行車共享項(xiàng)目
數(shù)據(jù)說明:
datetime - 如:2011/1/1 19:00:00格式
season - 1 = 春天, 2 = 夏天, 3 = 秋天, 4 = 冬天
holiday - 0或者1,是否是假期
workingday - 0或者1 ,是否是工作日
weather - 1: 晴,少云,部分云,多云
2: 薄霧+云,薄霧+碎云,薄霧+少量云,薄霧
3: 輕雪,輕雨+雷暴+散云,輕雨+散云
4: 大雨+冰盤+雷雨+薄霧,雪+霧
temp - 攝氏溫度
atemp -體感溫度
humidity -相對(duì)濕度
windspeed - 風(fēng)速
casual - 已啟動(dòng)的未注冊(cè)用戶租金數(shù)目
registered - 已啟動(dòng)的注冊(cè)用戶租金數(shù)目
count - 租金總額
數(shù)據(jù)來源:
https://www.kaggle.com/c/bike-sharing-demand/data
問題描述:
提供兩年的每小時(shí)租金數(shù)據(jù),訓(xùn)練集由每月的前19天組成,而測(cè)試集是第20天到月底。預(yù)測(cè)在測(cè)試集涵蓋的每一小時(shí)內(nèi)租用的自行車總數(shù),僅使用租期之前可用的信息。
import?pylab import?calendar import?numpy?as?np import?pandas?as?pd import?seaborn?as?sn from?scipy?import?stats import?missingno?as?msno from?datetime?import?datetime import?matplotlib.pyplot?as?plt import?warnings pd.options.mode.chained_assignment?=?None warnings.filterwarnings("ignore",?category=DeprecationWarning) %matplotlib?inline #讀取數(shù)據(jù) dailyData?=?pd.read_csv('../train.csv')02
特征工程
通過describe, info, head 等函數(shù)可以看出如下問題
“season”、“holiday”、“workingday”和“weather”等欄應(yīng)該是“類別”數(shù)據(jù)類型,但目前的數(shù)據(jù)類型是“int”。讓我們以以下方式轉(zhuǎn)換數(shù)據(jù)集,以便我們可以開始使用EDA,并且數(shù)據(jù)無空值,這點(diǎn)非常棒。
- 從“datatime”欄中創(chuàng)建新列 
- 將“int”的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換成分類類型 
- 刪除datetime列,因?yàn)槲覀円呀?jīng)從其中提取了有用的特性 
03
數(shù)據(jù)分布分析
異常值分析
fig,?axes?=?plt.subplots(nrows=2,ncols=2) fig.set_size_inches(12,?10) sn.boxplot(data=dailyData,y="count",orient="v",ax=axes[0][0]) sn.boxplot(data=dailyData,y="count",x="season",orient="v",ax=axes[0][1]) sn.boxplot(data=dailyData,y="count",x="hour",orient="v",ax=axes[1][0]) sn.boxplot(data=dailyData,y="count",x="workingday",orient="v",ax=axes[1][1])axes[0][0].set(ylabel='Count',title="Box?Plot?On?Count") axes[0][1].set(xlabel='Season',?ylabel='Count',title="Box?Plot?On?Count?Across?Season") axes[1][0].set(xlabel='Hour?Of?The?Day',?ylabel='Count',title="Box?Plot?On?Count?Across?Hour?Of?The?Day") axes[1][1].set(xlabel='Working?Day',?ylabel='Count',title="Box?Plot?On?Count?Across?Working?Day") [Text(0,?0.5,?'Count'),Text(0.5,?0,?'Working?Day'),Text(0.5,?1.0,?'Box?Plot?On?Count?Across?Working?Day')]輸出
乍一看,“count”變量包含了許多異常值數(shù)據(jù)點(diǎn),這些數(shù)據(jù)點(diǎn)使分布向右傾斜(因?yàn)橛懈嗟臄?shù)據(jù)點(diǎn)超出了外部四分位數(shù)的限制),但除此之外,還可以從下面給出的簡(jiǎn)單方框圖中進(jìn)行以下推斷。
- 春季的數(shù)量相對(duì)較少,方塊中的中值下降就證明了這一點(diǎn)。 
- “一天中的每一小時(shí)”的盒式情節(jié)很有趣,上午7時(shí)至上午8時(shí)和下午5時(shí)至下午6時(shí)的中值相對(duì)較高。這可歸因于當(dāng)時(shí)的正規(guī)學(xué)校和辦公室用戶。 
- 大多數(shù)異常點(diǎn)主要來自“工作日”而不是“非工作日”。從圖4可以看到。 
移除計(jì)數(shù)列中的異常值
dailyDataWithoutOutliers?=?dailyData[np.abs(dailyData["count"]-dailyData["count"].mean())<=(3*dailyData["count"].std())]?關(guān)聯(lián)性分析
要理解因變量如何受到特征(數(shù)值)的影響,一個(gè)常見的方法是在它們之間建立一個(gè)相關(guān)矩陣。讓我們?cè)凇坝?jì)數(shù)”和“溫度”、“溫度”、“濕度”、“風(fēng)速”之間繪制一個(gè)相關(guān)圖。
- 溫度和濕度特征分別與計(jì)數(shù)呈正相關(guān)和負(fù)相關(guān),盡管兩者之間的相關(guān)性不顯著,但計(jì)數(shù)變量對(duì)“溫度”和“濕度”的依賴性較小。 
- 風(fēng)速將不是真正有用的數(shù)值特征,從它與“計(jì)數(shù)”的相關(guān)值中可以看到它。 
- 由于“temp”和“temp”之間有很強(qiáng)的相關(guān)性,所以“temp”是變量。在建模過程中,任何一個(gè)變量都必須被刪除,因?yàn)樗鼈儗⒃跀?shù)據(jù)中表現(xiàn)出多重共線性。 
- “Casual”和“Registered”也沒有被考慮在內(nèi),因?yàn)樗鼈冊(cè)谛再|(zhì)上是泄漏變量,在建模過程中需要下降。 
- 回歸圖是描述兩個(gè)特征之間關(guān)系的有效方法之一。這里我們考慮“計(jì)數(shù)”與“溫度”、“濕度”、“風(fēng)速”。 
輸出
可視化數(shù)據(jù)分布
如下圖所示,“計(jì)數(shù)”變量向右傾斜。有正態(tài)分布是可取的,因?yàn)榇蠖鄶?shù)機(jī)器學(xué)習(xí)技術(shù)都要求因變量為正態(tài)分布。一種可能的解決方案是刪除異常數(shù)據(jù)點(diǎn)后對(duì)“計(jì)數(shù)”變量進(jìn)行日志轉(zhuǎn)換。在轉(zhuǎn)換之后,數(shù)據(jù)看起來好多了,但仍然不理想地遵循正態(tài)分布。
可視化計(jì)數(shù)VS(月、季、小時(shí)、工作日、用戶類型)
- 很明顯,在夏季,人們傾向于租自行車,因?yàn)樵谀莻€(gè)季節(jié)騎自行車是非常有利的,所以六月、七月和八月對(duì)自行車的需求相對(duì)較高。 
- 在平日,更多的人傾向于在早上7點(diǎn)到早上8點(diǎn)左右和下午5點(diǎn)到下午6點(diǎn)租自行車。正如我們前面提到的,這可歸因于普通學(xué)校和辦公室的上班族。 
- 在“星期六”和“星期日”沒有出現(xiàn)上述現(xiàn)象。更多的人傾向于在上午10點(diǎn)到下午4點(diǎn)之間租自行車。 
- 繁忙時(shí)間約早上七時(shí)至上午八時(shí)及下午五時(shí)至六時(shí),純粹由注冊(cè)用戶貢獻(xiàn)。 
輸出:
04
建立模型
利用隨機(jī)森林填充0的風(fēng)速
from?sklearn.ensemble?import?RandomForestRegressordataWind0?=?data[data["windspeed"]==0] dataWindNot0?=?data[data["windspeed"]!=0] rfModel_wind?=?RandomForestRegressor() windColumns?=?["season","weather","humidity","month","temp","year","atemp"] rfModel_wind.fit(dataWindNot0[windColumns],?dataWindNot0["windspeed"])wind0Values?=?rfModel_wind.predict(X=?dataWind0[windColumns]) dataWind0["windspeed"]?=?wind0Values data?=?dataWindNot0.append(dataWind0) data.reset_index(inplace=True) data.drop('index',inplace=True,axis=1)分割訓(xùn)練和測(cè)試數(shù)據(jù)
categoricalFeatureNames?=?["season","holiday","workingday","weather","weekday","month","year","hour"] numericalFeatureNames?=?["temp","humidity","windspeed","atemp"] dropFeatures?=?['casual',"count","datetime","date","registered"] for?var?in?categoricalFeatureNames:data[var]?=?data[var].astype("category") dataTrain?=?data[pd.notnull(data['count'])].sort_values(by=["datetime"]) dataTest?=?data[~pd.notnull(data['count'])].sort_values(by=["datetime"]) datetimecol?=?dataTest["datetime"] yLabels?=?dataTrain["count"] yLablesRegistered?=?dataTrain["registered"] yLablesCasual?=?dataTrain["casual"] dataTrain??=?dataTrain.drop(dropFeatures,axis=1) dataTest??=?dataTest.drop(dropFeatures,axis=1)使用線性回歸模型
使用集成模型
from?sklearn.ensemble?import?GradientBoostingRegressor gbm?=?GradientBoostingRegressor(n_estimators=4000,alpha=0.01);?###?Test?0.41 yLabelsLog?=?np.log1p(yLabels) gbm.fit(dataTrain,yLabelsLog) preds?=?gbm.predict(X=?dataTrain) print?("RMSLE?Value?For?Gradient?Boost:?",rmsle(np.exp(yLabelsLog),np.exp(preds),False)) 0.19084027408592402結(jié)論:顯然GradientBoostingRegressor算法比LR取得更好的預(yù)測(cè)效果!
你可能還想讀的往期精彩實(shí)戰(zhàn)(點(diǎn)擊圖片跳轉(zhuǎn))
? ? ? ??? ?? ?
? ? ?? ? ? ??
長(zhǎng)按二維碼關(guān)注我們
有趣的靈魂在等你
好看你就點(diǎn)點(diǎn)我
總結(jié)
以上是生活随笔為你收集整理的实战 | Kaggle竞赛:华盛顿特区首都自行车租赁预测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        