標籤:檢驗 ... 註冊 12c bst 數字 python boxplot 參數
分享
知識要點:
lubridate包拆解時間 | POSIXlt
利用決策樹分類,利用隨機森林預測
利用對數進行fit,和exp函數還原
訓練集來自Kaggle華盛頓單車共用計劃中的單車租賃資料,分析共用單車與天氣、時間等關係。資料集共11個變數,10000多行資料。
https://www.kaggle.com/c/bike-sharing-demand
首先看一下官方給出的資料,一共兩個表格,都是2011-2012年的資料,區別是Test檔案是每個月的日期都是全的,但是沒有註冊使用者和隨意使用者。而Train檔案是每個月只有1-20天,但有兩類使用者的數量。
求解:補全Train檔案裡21-30號的使用者數量。評價標準是預測與真實數量的比較。
1.png
首先負載檔案和包
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合并。
test$registered=0test$casual=0test$count=0data<-rbind(train,test)
摘取時間:可以用時間戳記,這裡的時間比較簡單,就是小時數,所以也可以直接截字串。
data$hour1<-substr(data$datetime,12,13)table(data$hour1)
統計一下每個小時的使用總數,是這樣(為什麼介麼整齊):
6-hour1.png
接下來是運用盒狀圖,看一下使用者和時間,周幾這些的關係。為什麼用盒狀圖而不用hist長條圖,因為盒狀圖有離散點表達,下面也因此運用對數求fit
可以看出,在時間方面,註冊使用者和非註冊使用者的使用時間有很大不同。
5-hour-regestered.png
5-hour-casual.png
4-boxplot-day.png
接下來用相關係數cor檢驗使用者,溫度,體感溫度,濕度,風速的關係。
相關係數:變數之間的線性關聯度量,檢驗不同資料的相關程度。
取值範圍[-1,1],越接近0越不相關。
從運算結果可以看出,使用人群與風速呈負相關,比溫度影響還大。
cor.png
接下來就是將時間等因素用決策樹分類,然後用隨機森林來預測。隨機森林和決策樹的演算法。聽起來很高大上,其實現在也很常用了,所以一定要學會。
決策樹模型是 一種簡單易用的非參數分類器。它不需要對資料有任何的先驗假設,計算速度較快,結果容易解釋,而且穩健性強,不怕雜訊資料和缺失資料。
決策樹模型的基本計 算步驟如下:先從n個自變數中挑選一個,尋找最佳分割點,將資料劃分為兩組。針對分組後資料,將上述步驟重複下去,直到滿足某種條件。
在決策樹建模中需要解決的重要問題有三個:
如何選擇自變數
如何選擇分割點
確定停止劃分的條件
做出註冊使用者和小時的決策樹,
train$hour1<-as.integer(train$hour1)d<-rpart(registered~hour1,data=train)rpart.plot(d)
3-raprt-hour1.png
然後就是根據決策樹的結果手動分類,所以還滿占代碼的...
train$hour1<-as.integer(train$hour1)data$dp_reg=0data$dp_reg[data$hour1<7.5]=1data$dp_reg[data$hour1>=22]=2data$dp_reg[data$hour1>=9.5 & data$hour1<18]=3data$dp_reg[data$hour1>=7.5 & data$hour1<18]=4data$dp_reg[data$hour1>=8.5 & data$hour1<18]=5data$dp_reg[data$hour1>=20 & data$hour1<20]=6data$dp_reg[data$hour1>=18 & data$hour1<20]=7
同理,做出 (小時 | 溫度) X (註冊 | 隨意使用者) 等決策樹,繼續手動分類....
3-raprt-temp.png
年份月份,周末假日等手動分類
data$year_part=0data$month<-month(data$datatime)data$year_part[data$year==‘2011‘]=1data$year_part[data$year==‘2011‘ & data$month>3]=2data$year_part[data$year==‘2011‘ & data$month>6]=3data$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=0data$weekend[data$day=="Sunday"|data$day=="Saturday"]=1
接下來用隨機森林語句預測
在機器學習中,隨機森林是一個包含多個決策樹的分類器, 並且其輸出的類別是由個別樹輸出的類別的眾數而定。
隨機森林中的子樹的每一個分裂過程並未用到所有的待選特徵,而是從所有的待選特徵中隨機選取一定的特徵,再在其中選取最優的特徵。這樣決策樹都能夠彼此不同,提升系統的多樣性,從而提升分類效能。
ntree指定隨機森林所包含的決策樹數目,預設為500,通常在效能允許的情況下越大越好;
mtry指定節點中用於二叉樹的變數個數,預設情況下資料集變數個數的二次方根(分類模型)或三分之一(預測模型)。一般是需要進行人為的逐次挑選,確定最佳的m值—摘自datacruiser筆記。這裡我主要學習,所以雖然有10000多資料集,但也只定了500。就這500我的小電腦也跑了半天。
train<-dataset.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)-1train$casual<-exp(train$logcas)-1train$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!
完成了一個“浩大完整”的資料分析,還是很有成就感的!
Python大資料處理案例