R语言-向量机-员工离职预测训练赛

来源:互联网 发布:如何恢复ipad数据 编辑:程序博客网 时间:2024/05/17 09:21

题目:员工离职预测训练赛
网址:http://www.pkbigdata.com/common/cmpt/员工离职预测训练赛_竞赛信息.html
要求:
数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的对应记录。
数据分为训练数据和测试数据,分别保存在pfm_train.csv和pfm_test.csv两个文件中。
其中训练数据主要包括1100条记录,31个字段。
测试数据主要包括350条记录,30个字段,跟训练数据的不同是测试数据并不包括员工是否已经离职的记录,学员需要通过由训练数据所建立的模型以及所给的测试数据,得出测试数据相应的员工是否已经离职的预测。
数据:https://pan.baidu.com/s/1qXZOS8W  密码:bxgm

代码:

#######################  训练  #############################data <- read.csv("E:/.../pfm_train.csv", sep=",", header=TRUE)colnames(data)[1]<-c("Age")     #首列列名乱码data[,2] <- as.factor(as.vector(data)[,2])library(e1071)#########线性支持向量机#########传递给函数svm()的关键参数是kernel、cost和gamma。Kernel指的是支持向量机的类型,它可能是线性SVM、多项式SVM、径向SVM或Sigmoid SVM。Cost是违反约束时的成本函数,gamma是除线性SVM外其余所有SVM都使用的一个参数。还有一个类型参数,用于指定该模型是用于回归、分类还是异常检测。但是这个参数不需要显式地设置,因为支持向量机会基于响应变量的类别自动检测这个参数,响应变量的类别可能是一个因子或一个连续变量。所以对于分类问题,一定要把你的响应变量作为一个因子。# linear SVMsvmfit <- svm(Attrition~.,data=data[,-c(8,18,23)], kernel = "linear", cost = 10, scale = FALSE) # linear svm, scaling turned OFFprint(svmfit)head(cbind(data$Attrition, predict(svmfit)),20)table (data$Attrition, predict(svmfit))  # tabulatemean(data$Attrition != predict(svmfit)) # 13.18% misclassification error#########径向支持向量机#########径向基函数作为一个受欢迎的内核函数,可以通过设置内核参数作为“radial”来使用。当使用一个带有“radial”的内核时,结果中的超平面就不需要是一个线性的了。通常定义一个弯曲的区域来界定类别之间的分隔,这也往往导致相同的训练数据,更高的准确度。# radial SVMsvmfit <- svm(Attrition~.,data=data[,-c(8,18,23)], kernel = "radial", cost = 10, scale = FALSE) # radial svm, scaling turned OFFprint(svmfit)head(cbind(data$Attrition, predict(svmfit,data)),20)table (data$Attrition, predict(svmfit,data))  # tabulatemean(data$Attrition != predict(svmfit,data)) # 0% misclassification error#########寻找最优参数#########你可以使用tune.svm()函数,来寻找svm()函数的最优参数### Tuning# Prepare training and test datatuned <- tune.svm(Attrition ~., data = data[,-c(8,18,23)], gamma = 10^(-6:-1), cost = 10^(1:3)) # tunesummary (tuned) # to select best gamma and cost#- best parameters:# gamma cost# 0.001  100#- best performance: 0.1238636 #- Detailed performance results:#   gamma cost     error dispersion#1  1e-06   10 0.1625000 0.03032670#2  1e-05   10 0.1625000 0.03032670#3  1e-04   10 0.1625000 0.03032670#4  1e-03   10 0.1625000 0.03032670#5  1e-02   10 0.1261364 0.02538161#6  1e-01   10 0.1477273 0.03258457#结果证明,当cost为100,gamma为0.001时产生最小的错误率。利用这些参数训练径向支持向量机。svmfit <- svm (Attrition~.,data=data[,-c(8,18,23)], kernel = "radial", cost = 100, gamma=0.001, scale = FALSE) # radial svm, scaling turned OFFprint(svmfit)head(cbind(data$Attrition, predict(svmfit,data)),20)table (data$Attrition, predict(svmfit,data))  # tabulatemean(data$Attrition != predict(svmfit,data)) # 0% misclassification error#结论:优化后的向量机分类成功率能达到100%#######################  预测  #############################data1 <- read.csv("E:/.../员工离职预测训练赛/数据/pfm_test.csv", sep=",", header=TRUE)colnames(data1)[1]<-c("Age")     #首列列名乱码result <- predict(svmfit,data1 ,interval = "prediction", level = 0.95)table(result)result  0   1 314  36 file.path <- paste("E:/.../员工离职预测训练赛/out_svm.csv",sep="")write.table(result,file.path, col.names=T,row.names = F, quote = F, sep=",")
实际比赛提交得分为0.79,成绩相当糟糕。