Kaggle自行車預(yù)測練習(xí)-基礎(chǔ)篇

知識要點:
lubridate包拆解時間 | POSIXlt
利用決策樹分類渴肉,利用隨機森林預(yù)測
利用對數(shù)進行fit茎活,和exp函數(shù)還原

訓(xùn)練集來自Kaggle華盛頓自行車共享計劃中的自行車租賃數(shù)據(jù)哲鸳,分析共享自行車與天氣牵囤、時間等關(guān)系飒房。數(shù)據(jù)集共11個變量雾鬼,10000多行數(shù)據(jù)膀藐。
https://www.kaggle.com/c/bike-sharing-demand

首先看一下官方給出的數(shù)據(jù)屠阻,一共兩個表格,都是2011-2012年的數(shù)據(jù)额各,區(qū)別是Test文件是每個月的日期都是全的国觉,但是沒有注冊用戶和隨意用戶。而Train文件是每個月只有1-20天虾啦,但有兩類用戶的數(shù)量麻诀。
求解:補全Train文件里21-30號的用戶數(shù)量。評價標(biāo)準(zhǔn)是預(yù)測與真實數(shù)量的比較傲醉。


1.png

首先加載文件和包

library(lubridate)
library(randomForest)

library(readr)
setwd("E:")
data<-read_csv("train.csv")
head(data)

這里我就遇到坑了蝇闭,用r語言缺省的read.csv死活讀不出來正確的文件格式,換成xlsx更慘硬毕,所有時間都變成43045這樣的怪?jǐn)?shù)字呻引。本來之前試過as.Date可以正確轉(zhuǎn)換,但這次因為有時分秒昭殉,就只能用時間戳苞七,但結(jié)果也不行。
最后是下載了"readr"包挪丢,用read_csv語句蹂风,順利解讀。
因為test比train日期完整乾蓬,但缺少用戶數(shù)惠啄,所以要把train和test合并。

test$registered=0
test$casual=0
test$count=0
data<-rbind(train,test)

摘取時間:可以用時間戳,這里的時間比較簡單撵渡,就是小時數(shù)融柬,所以也可以直接截字符串。

data$hour1<-substr(data$datetime,12,13)
table(data$hour1)

統(tǒng)計一下每個小時的使用總數(shù)趋距,是這樣(為什么介么整齊):


6-hour1.png

接下來是運用箱線圖粒氧,看一下使用者和時間,周幾這些的關(guān)系节腐。為什么用箱線圖而不用hist直方圖外盯,因為箱線圖有離散點表達,下面也因此運用對數(shù)求fit
從圖中可以看出翼雀,在時間方面饱苟,注冊用戶和非注冊用戶的使用時間有很大不同。


5-hour-regestered.png
5-hour-casual.png
4-boxplot-day.png

接下來用相關(guān)系數(shù)cor檢驗用戶狼渊,溫度箱熬,體感溫度,濕度狈邑,風(fēng)速的關(guān)系城须。

相關(guān)系數(shù):變量之間的線性關(guān)聯(lián)度量,檢驗不同數(shù)據(jù)的相關(guān)程度官地。
取值范圍[-1酿傍,1],越接近0越不相關(guān)驱入。

從運算結(jié)果可以看出赤炒,使用人群與風(fēng)速呈負(fù)相關(guān),比溫度影響還大亏较。

cor.png

接下來就是將時間等因素用決策樹分類莺褒,然后用隨機森林來預(yù)測。隨機森林和決策樹的算法雪情。聽起來很高大上遵岩,其實現(xiàn)在也很常用了,所以一定要學(xué)會巡通。

決策樹模型是 一種簡單易用的非參數(shù)分類器尘执。它不需要對數(shù)據(jù)有任何的先驗假設(shè),計算速度較快宴凉,結(jié)果容易解釋誊锭,而且穩(wěn)健性強,不怕噪聲數(shù)據(jù)和缺失數(shù)據(jù)弥锄。
決策樹模型的基本計 算步驟如下:先從n個自變量中挑選一個丧靡,尋找最佳分割點蟆沫,將數(shù)據(jù)劃分為兩組。針對分組后數(shù)據(jù)温治,將上述步驟重復(fù)下去饭庞,直到滿足某種條件。
在決策樹建模中需要解決的重要問題有三個:
如何選擇自變量
如何選擇分割點
確定停止劃分的條件

做出注冊用戶和小時的決策樹熬荆,

train$hour1<-as.integer(train$hour1)
d<-rpart(registered~hour1,data=train)
rpart.plot(d)
3-raprt-hour1.png

然后就是根據(jù)決策樹的結(jié)果手動分類舟山,所以還滿占代碼的...

train$hour1<-as.integer(train$hour1)
data$dp_reg=0
data$dp_reg[data$hour1<7.5]=1
data$dp_reg[data$hour1>=22]=2
data$dp_reg[data$hour1>=9.5 & data$hour1<18]=3
data$dp_reg[data$hour1>=7.5 & data$hour1<8.5]=4
data$dp_reg[data$hour1>=8.5 & data$hour1<9.5]=5
data$dp_reg[data$hour1>=20 & data$hour1<22]=6
data$dp_reg[data$hour1>=18 & data$hour1<20]=7

同理,做出 (小時 | 溫度) X (注冊 | 隨意用戶) 等決策樹卤恳,繼續(xù)手動分類....

3-raprt-temp.png

年份月份捏顺,周末假日等手動分類

data$year_part=0
data$month<-month(data$datatime)
data$year_part[data$year=='2011']=1
data$year_part[data$year=='2011' & data$month>3]=2
data$year_part[data$year=='2011' & data$month>6]=3
data$year_part[data$year=='2011' & data$month>9]=4
data$day_type=""
data$day_type[data$holiday==0 & data$workingday==0]="weekend"
data$day_type[data$holiday==1]="holiday"
data$day_type[data$holiday==0 & data$workingday==1]="working day"
data$weekend=0
data$weekend[data$day=="Sunday"|data$day=="Saturday"]=1

接下來用隨機森林語句預(yù)測

在機器學(xué)習(xí)中,隨機森林是一個包含多個決策樹的分類器纬黎, 并且其輸出的類別是由個別樹輸出的類別的眾數(shù)而定。
隨機森林中的子樹的每一個分裂過程并未用到所有的待選特征劫窒,而是從所有的待選特征中隨機選取一定的特征本今,再在其中選取最優(yōu)的特征。這樣決策樹都能夠彼此不同主巍,提升系統(tǒng)的多樣性冠息,從而提升分類性能。

ntree指定隨機森林所包含的決策樹數(shù)目孕索,默認(rèn)為500逛艰,通常在性能允許的情況下越大越好;
mtry指定節(jié)點中用于二叉樹的變量個數(shù)搞旭,默認(rèn)情況下數(shù)據(jù)集變量個數(shù)的二次方根(分類模型)或三分之一(預(yù)測模型)散怖。一般是需要進行人為的逐次挑選,確定最佳的m值—摘自datacruiser筆記肄渗。這里我主要學(xué)習(xí)镇眷,所以雖然有10000多數(shù)據(jù)集,但也只定了500翎嫡。就這500我的小電腦也跑了半天欠动。

#train<-data[as.integer(day(data$datetime))>20,]
train<-data

set.seed(421)
train$logreg<-log(train$registered+1)
train$logcas<-log(train$casual+1)

#fit1<-randomForest(logreg~hour1+workingday+day+holiday+day_type+
                   temp_reg+humidity+atemp+windspeed+season+weather
                   +dp_reg+weekend+year+year_part,
                   train,importance=TRUE,ntree=250)

fit1<-randomForest(logreg~hour1+workingday+holiday+temp_reg+atemp+humidity
                    +windspeed+season+weather+weekend+year+year_part
                    +dp_reg,train,importance=TRUE,ntree=500)

pred1<-predict(fit1,train)
train$logreg<-pred1

set.seed(421)
fit2<-randomForest(logcas~hour1+workingday+holiday+temp_cas+atemp+humidity
                   +windspeed+season+weather+weekend+year+year_part
                   +dp_cas,train,importance=TRUE,ntree=500)

pred2<-predict(fit2,train)
train$logcas<-pred2

這里不知道怎么回事,我的day和day_part加進去就報錯惑申,只有刪掉這兩個變量計算具伍,還要研究修補。
然后用exp函數(shù)還原

train$registered<-exp(train$logreg)-1
train$casual<-exp(train$logcas)-1
train$count<-test$casual+train$registered

最后把20日后的日期截出來圈驼,寫入新的csv文件上傳人芽。

train2<-train[as.integer(day(data$datetime))>=20,]
submit_final<-data.frame(datetime=train2$datetime,count=train2$count)
write.csv(submit_final,"submit_final.csv",row.names=F)

大功告成!
github的代碼在此

原來的示例是煉數(shù)成金網(wǎng)站的kaggle課程第二節(jié)碗脊,基本按照視頻的思路啦逆。因為課程沒有源代碼顾画,所以要自己修補運行完整内斯。總算把這個功課做完了害碾。下面要修正的有:

好好理解三個知識點(lubridate包/POSIXlt,log線性赦拘,決策樹和隨機森林)慌随;
用WOE和IV代替cor函數(shù)分析相關(guān)關(guān)系;
用其他圖形展現(xiàn)的手段分析
隨機樹變量重新測試

完成了一個“浩大完整”的數(shù)據(jù)分析躺同,還是很有成就感的阁猜!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹋艺,隨后出現(xiàn)的幾起案子剃袍,更是在濱河造成了極大的恐慌,老刑警劉巖捎谨,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件民效,死亡現(xiàn)場離奇詭異,居然都是意外死亡涛救,警方通過查閱死者的電腦和手機畏邢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检吆,“玉大人舒萎,你說我怎么就攤上這事〔渑妫” “怎么了臂寝?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摊灭。 經(jīng)常有香客問我交煞,道長,這世上最難降的妖魔是什么斟或? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任素征,我火速辦了婚禮,結(jié)果婚禮上萝挤,老公的妹妹穿的比我還像新娘御毅。我一直安慰自己,他們只是感情好怜珍,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布端蛆。 她就那樣靜靜地躺著,像睡著了一般酥泛。 火紅的嫁衣襯著肌膚如雪今豆。 梳的紋絲不亂的頭發(fā)上嫌拣,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音呆躲,去河邊找鬼异逐。 笑死,一個胖子當(dāng)著我的面吹牛插掂,可吹牛的內(nèi)容都是我干的灰瞻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辅甥,長吁一口氣:“原來是場噩夢啊……” “哼酝润!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起璃弄,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤要销,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后夏块,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕉陋,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年拨扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茁肠。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡患民,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垦梆,到底是詐尸還是另有隱情匹颤,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布托猩,位于F島的核電站印蓖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏京腥。R本人自食惡果不足惜赦肃,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望公浪。 院中可真熱鬧他宛,春花似錦、人聲如沸欠气。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽预柒。三九已至队塘,卻和暖如春袁梗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憔古。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工遮怜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人投放。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓奈泪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灸芳。 傳聞我的和親對象是個殘疾皇子涝桅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容