R語言-決策樹-員工離職預測訓練賽
阿新 • • 發佈:2019-01-04
題目:員工離職預測訓練賽
網址: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左右。