决策树算法:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/23/2605208.html
实例应用:
某网站在不同的城市(city)不同的类目(category)卖一款产品,不同的城市和类目价格是不同的,现需要甄别出哪些城市的哪些类目产品的价格需要做调整,需要涨价,降价,或不调整?
方法:
决策树
衡量指标:
变量名称 | 变量类型 | 说明 |
City | 分类型 | 城市 |
Category | 分类型 | 类目 |
Price | 连续型 | 价格 |
order5_num | 连续型 | 普通产品订单量 |
Order28_num | 连续型 | 中端产品订单量 |
Orde33_num | 连续型 | 高端产品订单量 |
ji_ratio | 连续型 | (中高端产品订单量)/普通 |
total_order | 连续型 | 总订单量 |
ratio_gezi14 | 连续型 | 前n天至前1天订单和/前2n天至前n+1天 注:n=14,28,42; |
ratio_gezi28 | 连续型 | |
ratio_gezi42 | 连续型 | |
avg_order_month | 连续型 | 去年月均订单量 |
gap_month | 连续型 | 总订单量-去年月均订单量 |
avg_order_year | 连续型 | 去年年均订单量 |
gap_year | 连续型 | 总订单量-去年年均订单量 |
User_num | 连续型 | 付费用户数 |
Adjust_2015 | 分类型 | 近一个月来是否调价:是1/否0 |
Adjust_2014 | 分类型 | 去年同期未来一个月是否调价:是1/否0 |
New_category | 分类型 | 是否为新类目:是1/否0 |
ratio_gezi14_2014 | 连续型 | 去年同期前n天至前1天订单和/前2n天至前n+1天 注:n=14,28,42; |
ratio_gezi28_2014 | 连续型 | |
ratio_gezi42_2014 | 连续型 | |
Max_order_2014 | 分类型 | 去年同期未来一个月是否达到order顶峰:是1/否0 |
Click/ad-2014 | 连续型 | 去年购买付费产品获得点击量 |
Click/ad-2015 | 连续型 | 今年购买付费产品获得点击量 |
Contact/ad-2014 | 连续型 | 去年购买付费产品获得contact量 |
Contact/ad-2014 | 连续型 | 今年购买付费产品获得contact量 |
建立决策树模型:涨/降价两个模型
setwd("C:\\Users\\msy\\Documents\\work\\tiaojia-test")
modeldata<-read.csv("model-tiaojia-data.csv",stringsAsFactors=FALSE)
setwd(paste("C:\\Users\\msy\\Documents\\work\\tiaojia-test\\",Sys.Date(),sep=""))
testdata0<-read.csv("testdata.csv",stringsAsFactors=FALSE)
yitiao<-read.csv("yitiao.csv",stringsAsFactors=FALSE)
head(testdata0)
head(yitiao)
testdata0[is.na(testdata0)]<-0
testdata=testdata0
#######creat tree model for asc##############
modelasc<-modeldata
str(modelasc)
table(modelasc$mark)
modelasc$ascmark[modelasc$mark==1]<-"1"
modelasc$ascmark[modelasc$mark<1]<-"0"
#data$cash_ratio14<-as.numeric(data$ratio_gezi14)
#data$cash_ratio28<-as.numeric(data$ratio_gezi14)
table(modelasc$ascmark)
modelasc$mark=NULL
modelasc$cc=NULL
str(modelasc)
library(rpart)
library(rpart.plot)
asctree<-rpart(ascmark~asc_tiaojia+price+order5_num+order28_num+order33_num+ji_ratio+total_order+ratio_gezi14+ratio_gezi28+ratio_gezi42,modelasc)
#modeltree<-rpart(ascmark~yitiao+price+total_order+ji_ratio,data)
prp(asctree)
###accuraty#####
#####tiaojia-asc###########
testdata=testdata0
asc_yitiao<-subset(yitiao,mark==1)
testdata$asc_tiaojia<-asc_yitiao[match(testdata$cc,asc_yitiao$cc),5]
testdata$date<-asc_yitiao[match(testdata$cc,asc_yitiao$cc),4]
head(testdata)
str(testdata)
testdata[is.na(testdata)]<-0
predicttree<-predict(asctree,testdata,type="class")
testdata$pred<-predicttree
table(testdata$pred)
filename3<-paste(Sys.Date(),"asc_pred.csv",sep="-")
write.csv(testdata,filename3,row.names = FALSE)
testdata_mark<-subset(testdata,pred==1)
filename3<-paste(Sys.Date(),"asc_gezi.csv",sep="-")
str(testdata_mark)
#testdata_mark$cc=NULL
write.csv(testdata_mark,filename3,row.names = FALSE)
#######creat tree model for desc##############
modeldesc<-modeldata
str(modeldesc)
table(modeldesc$mark)
modeldesc$descmark[modeldesc$mark==-1]<-"1"
modeldesc$descmark[modeldesc$mark>-1]<-"0"
#data$cash_ratio14<-as.numeric(data$ratio_gezi14)
#data$cash_ratio28<-as.numeric(data$ratio_gezi14)
table(modeldesc$descmark)
modeldesc$mark=NULL
modeldesc$cc=NULL
str(modeldesc)
library(rpart)
library(rpart.plot)
desctree<-rpart(descmark~desc_tiaojia+price+order5_num+order28_num+order33_num+ji_ratio+total_order+ratio_gezi14+ratio_gezi28+ratio_gezi42,modeldesc)
#modeltree<-rpart(ascmark~yitiao+price+total_order+ji_ratio,data)
prp(desctree)
###accuraty#####
#####tiaojia-desc###########
testdata=testdata0
desc_yitiao<-subset(yitiao,mark==-1)
testdata$desc_tiaojia<-desc_yitiao[match(testdata$cc,desc_yitiao$cc),5]
testdata$date<-desc_yitiao[match(testdata$cc,desc_yitiao$cc),4]
head(testdata)
str(testdata)
testdata[is.na(testdata)]<-0
predicttree<-predict(desctree,testdata,type="class")
testdata$pred<-predicttree
table(testdata$pred)
filename4<-paste(Sys.Date(),"desc_pred.csv",sep="-")
write.csv(testdata,filename4,row.names = FALSE)
testdata_mark<-subset(testdata,pred==1)
filename4<-paste(Sys.Date(),"desc_gezi.csv",sep="-")
str(testdata_mark)
testdata_mark<-testdata_mark[order(-testdata_mark[,3]),]
head(testdata_mark)
write.csv(testdata_mark,filename4,row.names = FALSE)