分享git
知識要點:
lubridate包拆解時間 | POSIXlt
利用決策樹分類,利用隨機森林預測
利用對數進行fit,和exp函數還原github
訓練集來自Kaggle華盛頓自行車共享計劃中的自行車租賃數據,分析共享自行車與天氣、時間等關係。數據集共11個變量,10000多行數據。
https://www.kaggle.com/c/bike-sharing-demand算法
首先看一下官方給出的數據,一共兩個表格,都是2011-2012年的數據,區別是Test文件是每月的日期都是全的,可是沒有註冊用戶和隨意用戶。而Train文件是每月只有1-20天,但有兩類用戶的數量。
求解:補全Train文件裏21-30號的用戶數量。評價標準是預測與真實數量的比較。shell
首先加載文件和包bash
library(lubridate) library(randomForest) library(readr) setwd("E:") data<-read_csv("train.csv") head(data)
這裏我就遇到坑了,用r語言缺省的read.csv死活讀不出來正確的文件格式,換成xlsx更慘,全部時間都變成43045這樣的怪數字。原本以前試過as.Date能夠正確轉換,但此次由於有時分秒,就只能用時間戳,但結果也不行。
最後是下載了"readr"包,用read_csv語句,順利解讀。
由於test比train日期完整,但缺乏用戶數,因此要把train和test合併。dom
test$registered=0 test$casual=0 test$count=0 data<-rbind(train,test)
摘取時間:能夠用時間戳,這裏的時間比較簡單,就是小時數,因此也能夠直接截字符串。機器學習
data$hour1<-substr(data$datetime,12,13) table(data$hour1)
統計一下每一個小時的使用總數,是這樣(爲何介麼整齊):函數
接下來是運用箱線圖,看一下使用者和時間,周幾這些的關係。爲何用箱線圖而不用hist直方圖,由於箱線圖有離散點表達,下面也所以運用對數求fit
從圖中能夠看出,在時間方面,註冊用戶和非註冊用戶的使用時間有很大不一樣。性能
接下來用相關係數cor檢驗用戶,溫度,體感溫度,溼度,風速的關係。學習
相關係數:變量之間的線性關聯度量,檢驗不一樣數據的相關程度。
取值範圍[-1,1],越接近0越不相關。
從運算結果能夠看出,使用人羣與風速呈負相關,比溫度影響還大。
接下來就是將時間等因素用決策樹分類,而後用隨機森林來預測。隨機森林和決策樹的算法。聽起來很高大上,其實如今也很經常使用了,因此必定要學會。
決策樹模型是 一種簡單易用的非參數分類器。它不須要對數據有任何的先驗假設,計算速度較快,結果容易解釋,並且穩健性強,不怕噪聲數據和缺失數據。
決策樹模型的基本計 算步驟以下:先從n個自變量中挑選一個,尋找最佳分割點,將數據劃分爲兩組。針對分組後數據,將上述步驟重複下去,直到知足某種條件。
在決策樹建模中須要解決的重要問題有三個:
如何選擇自變量
如何選擇分割點
肯定中止劃分的條件
作出註冊用戶和小時的決策樹,
train$hour1<-as.integer(train$hour1) d<-rpart(registered~hour1,data=train) rpart.plot(d)
而後就是根據決策樹的結果手動分類,因此還滿佔代碼的...
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<18]=4 data$dp_reg[data$hour1>=8.5 & data$hour1<18]=5 data$dp_reg[data$hour1>=20 & data$hour1<20]=6 data$dp_reg[data$hour1>=18 & data$hour1<20]=7
同理,作出 (小時 | 溫度) X (註冊 | 隨意用戶) 等決策樹,繼續手動分類....
年份月份,週末假日等手動分類
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
接下來用隨機森林語句預測
在機器學習中,隨機森林是一個包含多個決策樹的分類器, 而且其輸出的類別是由個別樹輸出的類別的衆數而定。
隨機森林中的子樹的每個分裂過程並未用到全部的待選特徵,而是從全部的待選特徵中隨機選取必定的特徵,再在其中選取最優的特徵。這樣決策樹都可以彼此不一樣,提高系統的多樣性,從而提高分類性能。
ntree指定隨機森林所包含的決策樹數目,默認爲500,一般在性能容許的狀況下越大越好;
mtry指定節點中用於二叉樹的變量個數,默認狀況下數據集變量個數的二次方根(分類模型)或三分之一(預測模型)。通常是須要進行人爲的逐次挑選,肯定最佳的m值—摘自datacruiser筆記。這裏我主要學習,因此雖然有10000多數據集,但也只定了500。就這500個人小電腦也跑了半天。
train<-data
set.seed(1234) train$logreg<-log(train$registered+1) test$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) pred1<-predict(fit1,train) train$logreg<-pred1
這裏不知道怎麼回事,個人day和day_part加進去就報錯,只有刪掉這兩個變量計算,還要研究修補。
而後用exp函數還原
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=test$datetime,count=test$count) write.csv(submit_final,"submit_final.csv",row.names=F)
大功告成!
github代碼加羣
原來的示例是煉數成金網站的kaggle課程第二節,基本按照視頻的思路。由於課程沒有源代碼,因此要本身修補運行完整。歷時兩三天總算把這個功課作完了。下面要修正的有:
好好理解三個知識點(lubridate包/POSIXlt,log線性,決策樹和隨機森林);
用WOE和IV代替cor函數分析相關關係;
用其餘圖形展示的手段分析
隨機樹變量從新測試學習過程當中遇到什麼問題或者想獲取學習資源的話,歡迎加入學習交流羣
626062078,咱們一塊兒學Python!
完成了一個「浩大完整」的數據分析,仍是頗有成就感的!