首頁  >  文章  >  後端開發  >  Python中大數據處理詳解

Python中大數據處理詳解

零下一度
零下一度原創
2017-06-27 10:37:394843瀏覽

分享

知識要點:
lubridate包拆解時間| POSIXlt
利用決策樹分類,利用隨機森林預測
#利用對數進行fit,和exp函數還原

訓練集來自Kaggle華盛頓自行車共享計畫中的自行車租賃數據,分析共享自行車與天氣、時間等關係。資料集共11個變量,10000多行資料。

首先看一下官方給出的數據,一共兩個表格,都是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=0
data<-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==&#39;2011&#39;]=1data$year_part[data$year==&#39;2011&#39; & data$month>3]=2data$year_part[data$year==&#39;2011&#39; & data$month>6]=3data$year_part[data$year==&#39;2011&#39; & 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)-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!

完成了一个“浩大完整”的数据分析,还是很有成就感的!

以上是Python中大數據處理詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn