1. 程式人生 > >R語言-決策樹-員工離職預測訓練賽

R語言-決策樹-員工離職預測訓練賽

題目:員工離職預測訓練賽
網址:http://www.pkbigdata.com/common/cmpt/員工離職預測訓練賽_競賽資訊.html
要求:
資料主要包括影響員工離職的各種因素(工資、出差、工作環境滿意度、工作投入度、是否加班、是否升職、工資提升比例等)以及員工是否已經離職的對應記錄。
資料分為訓練資料和測試資料,分別儲存在pfm_train.csv和pfm_test.csv兩個檔案中。
其中訓練資料主要包括1100條記錄,31個欄位。
測試資料主要包括350條記錄,30個欄位,跟訓練資料的不同是測試資料並不包括員工是否已經離職的記錄,學員需要通過由訓練資料所建立的模型以及所給的測試資料,得出測試資料相應的員工是否已經離職的預測。
資料:https://pan.baidu.com/s/1qXZOS8W  密碼:bxgm

程式碼:

#######################  訓練  #############################
library(RWeka)  
library(party)
data <- read.csv("E:/.../員工離職預測訓練賽/資料/pfm_train.csv", sep=",", header=TRUE)
colnames(data)[1]<-c("Age")     #首列列名亂碼

#決策樹方案一:
data[,2] <- as.factor(as.vector(data)[,2])
m1<-J48(Attrition~.,data=data[,-c(8,18,23)])
plot(m1)

#決策樹方案二:
m2 <- rpart(Attrition~.,data=data[,-c(8,18,23)])
#決策樹方案三(對於二的優化):
m3<-prune(m2,cp=0.0278)

#決策樹方案四:
library(DMwR)
set.seed(1234) 
m4 <- rpartXse(Attrition~.,data=data[,-c(8,18,23)])

#訓練集擬合結果比較
test1 <- predict(m1,data[,-c(8,18,23)] ,interval = "prediction", level = 0.95 )
table(data$Attrition,test1)

test2 <- predict(m2,data[,-c(8,18,23)] ,interval = "prediction", level = 0.95 )
test2<-cbind(test2,1)
for (i in 1:nrow(test2))  { if(test2[i,1]>test2[i,2]) test2[i,3]<-0 else test2[i,3]<-1}
table(data$Attrition,test2[,3])

test3 <- predict(m3,data[,-c(8,18,23)] ,interval = "prediction", level = 0.95 )
test3<-cbind(test3,1)
for (i in 1:nrow(test3))  { if(test3[i,1]>test3[i,2]) test3[i,3]<-0 else test3[i,3]<-1}
table(data$Attrition,test3[,3])

test4 <- predict(m4,data[,-c(8,18,23)] ,interval = "prediction", level = 0.95 )
test4<-cbind(test4,1)
for (i in 1:nrow(test4))  { if(test4[i,1]>test4[i,2]) test4[i,3]<-0 else test4[i,3]<-1}
table(data$Attrition,test4[,3])

#   test1         test2         test3          test4
#      0   1          0   1         0   1          0   1
#  0 916   6      0 904  18     0 908  14      0 908  14
#  1  79  99      1 109  69     1 140  38      1 140  38
#結論:第一種擬合度太高,後面的錯誤率太高


#######################  預測  #############################
data1 <- read.csv("E:/.../員工離職預測訓練賽/資料/pfm_test.csv", sep=",", header=TRUE)
colnames(data1)[1]<-c("Age")     #首列列名亂碼

result <- predict(m1,data1 ,interval = "prediction", level = 0.95)
table(result)
file.path <- paste("E:/.../員工離職預測訓練賽/out_tree1.csv",sep="")
write.table(result,file.path, col.names=T,row.names = F, quote = F, sep=",")

實際比賽提交得分為0.86,成績較差,排名在30左右。