分享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!
完成了一个“浩大完整”的数据分析,仍是颇有成就感的!