关于人工智能入门的几个模型运用(基于员工离职预测有较详细的数据分析)

本文回顾了作者在大学期间的人工智能课程中,针对员工离职预测问题进行的实操,包括数据预处理、特征工程、模型选择(如逻辑回归、朴素贝叶斯等)和超参数调优。通过分析不同维度数据,发现婚姻状况、年龄、收入等因素对离职影响显著,并展示了集成学习方法如Stacking的优化效果。
摘要由CSDN通过智能技术生成

序言:

在上大学时的人工智能课程设计用到了许多入门的模型,因为后来又需要再看自己当时做过的东西,所以这里总结一下使用过的模型和处理数据时的工程心得。

题目:

题目为非常经典的对员工离职的预测问题,在课程中讲述的基本都为理论知识。这边辅以实操可以更加深刻的理解知识,老师的课后题目分为分类题目和回归题目。本文选择的员工离职的分类问题。数据量不是很大大概1000多个员工,32个维度以此来建立特征工程(类似的问题也可以以此分析)。我们需要从已知的离职与留职的数据中训练出我们想要的模型。我们进行分析的问题属于分类问题,即我们可以通过对已知数据进行模型训练,在后续我们通过另外一些的数据来预测这些人会不会离职,来进行我们自己的选择(例如是否应该提升他之类的一系列问题),预测出来的结果应为离散值(即为预测是否可以离职,0为留职,1为离职)。

数据预处理:

拿到一定的数据首先需要进行数据的处理,首先应先将CSV文件读入,便于后面进行数据分析以及模型建立。由于ID这一标签对于是否离职是没有关系的所以这里先将ID这一列进行删除。

 然后使用info()函数,先对整体进行观察。

 进行初步判断,发现并没有缺失值,所以这边就没有进行缺失值的处理。虽然没有数据的缺失,但是数据却可能存在一些重复值或者一些没有作用的值。在这里,本人并没有使用已有的包来对重复值进行判断,因为维度较少所以直接用describe()函数来对每一个维度进行观察,可以显示出每一个维度的3/4,1/4以及中位数和平均数来看看有没有都是一样的值。

 从中可以看出有效工作时间这一维度都是一样的数据所以将其删除,然后发现在是否年龄超过18的那一维度即(over18)那一维度的所有数据都是超过年龄(当然除非数据报错要不也不会招童工)可以用相关性检测是否数据都相同,这里因为维度较少所以就直接用比较简单的方法去观察。

因为没有数据的缺失项,对于数据的预处理就先停留在这里,后面的米热编码在模型建立时在进行描述,接下来来看一下数据分析。

数据分析 :

首先先看一下留职和离职的数量:

说明在公司里大部分的人都是留职的比较多。接下来将对自己觉得可能会影响留职和离职的原因进行,画图进行展示,像年龄,收入,出差程度,以及婚姻情况,性别进行展示。分成对离散型数据以及连续型数据,以及单因素和多因素的绘图。以下是对离散型数据的绘图:

结婚后离职情况变少,说明婚姻稳定对是否离职或者留职也是起到非常大的作用的。 

从留职和离职来看男性离职的比例占比小一点。 

下面是连续数据的分析: 

绿色表示离职,红色表示留职,说明在30岁之前离职多于留职,在40岁之后留职多余离职这是合理的。

工资较低的离职多于留职,在高薪资阶段普遍没有离职的情况发生。 

接下来进行双因素分析:

月收入与出差程度的双因素分析,从这看情况也是合理的,经常出差工资又低离职也是正常的。 

工作年限与出差程度的比较,可以看出经常出差年份又低的就会离职,而对于已经工作过一定年龄之后虽然出差频繁但是还是会留职。(说明大部分数据还是符合常理)。 

数据分析大致处理完之后,由于在员工离职这一些数据里,有几列字符型变量,所以在这里我的处理方式是,对于一些有程度的数据(即有高低之分的数据)又或者是只有两个变量的数据直接进行编码赋值为0或1,对于一些没有程度可比较的数据我们应该使用独热编码,因为没有比较的数据直接使用0,1,2,3类似的数据编码的话就间接导致了差异的产生。所以这里我们使用了独热编码。

在对编码结束后,这样我们的数据就全是数值型数据了,我们绘制相关性热力图来进行观察:

其实我们并没有必要看所有的行数,只需要观看跟label那一列就可以了。这里我们将关于label的相关性那一列从高到低排序观看:

再者由于维数本来就不多所以就不进行特征选择了因为本来数据维度就较少。在建立模型时,就把这些维度当作特征工程进行处理训练。

模型建立:

这里在进行算法模型的选择时本人把模型分为:逻辑回归、朴素贝叶斯、决策树、支持向量机、神经网络。以及通过多个集成学习对这五个模型进行训练的而成的新的模型stacking。和对于单个模型的集成学习即随机森林,以及随机极限数和AdaBoost、GradientBoosting等方法进行了多种方法的模型训练。以及在对于随机森林和随机极限数和adaBoost和GradientBoosting模型进行网格调参确定最优的学习率以及最优的深度。以及用了5折交叉验证的方法对于逻辑回归的惩罚函数进行确定以及确定最终的权值C,即对于惩罚权重的确定都进行了训练。

注意:这里对于训练集和测试集进行划分时使用如下的函数: 

并没有固定训练集和测试集这样是看不出调参的进步,如果是全部重新划分的话不能说之后测试的比之前好这是不对的。所以在这里我进行了改进,把训练集和测试集确定了下来,在这里 random_stat=1设置为网上常用的参数。然后每次重新训练本次训练集就可以看出是否提高。记住不能用测试集进行训练不然正确率肯定会提高。而对于验证集的划分本人直接用GridSearchCV自带的交叉验证自带的划分验证集。

逻辑回归、朴素贝叶斯、决策树、支持向量机、神经网络模型训练时先暂时使用了默认参数。

对每个模型进行默认参数的配置并且在后面会进行网格调参,并且每次训练都会保存当前的模型。

(保存模型)

(提取模型) 

训练完模型之后统一放入模型列表后进行统一的处理。 

进行多种指标以及ROC曲线的绘制,并且稍后会把数据进行统一的参数展示。在之为了使得模型的准确率提高,所以我使用了两种集成学习方式,一种为单模型集成学习,一种为多种模型集成为一个模型的stacking用法。在stacking模型中第一层为五个模型训练后的结果作为第二层的训练集,在进行第二层训练时选择的函数为逻辑回归函数,通过最后的验证可以看出stacking函数一般为最优的正确率:

(这里使用的是mlxtend包里的函数,并没有使用sklearn里的函数)

第一次实验的内容为:

调整random_stat=42随机数后:

绘制表格的函数: 

并绘制出ROC曲线:

实验证明在进行多种优秀模型的集成学习之后生成后的模型也会较为优秀。稍后会进行单模型的集成学习以及网格调参的配合使用:这里运用了随机森林,极限随机数,决策树,adaboost,GradientBoost等单模型集成学习集合GridSearchCV网格优化搜索最佳参数。

此为待评测的超参数组合即一共要进行多种组合进行测评,而搜索的方法和划分的验证集已经通过GridSearchCV函数被划分好了。

通过该模型可以进行一系列模型的超参数搜索这里首先进行的是对于单模型的机器学习超参数搜索。(进行随机数修改后)

说明在上述函数中最优的超参数为多少,进行多次训练会有不同的参数,因为每次验证集的划分都不相同,如果想划分更多的超参数数据只需要把待搜索的参数加入列表即可。接下进行对刚开始的五个模型中svm和mlp进行网格优化:

该图片的正确率为对验证集的正确率,当我们得出最优参数之后将其反带回之前的模型,并进行参数修改。

得到了和之前不一样的结果:

证明对于svm模型来说当修改了惩罚项系数之后,模型训练的更好了。

模型性能分析: 

对于刚开始没有进行任何调参,random_stat=1,进行模型的训练:

可以看出此时没有任何调参对于随机数也并没有修改,此时修改random_stat=42(网上查找资料大多数这样划分)进行划分后:

同样对于单模型的机器学习刚开始:

对于调整后:

因为调整后的效果还不错所以就保留了这个参数来进行超参数调参,用网格调参法进行调整(在第三模块模型的选择里进行了细说,一下直接放结果:

这里是对于五个模型的超参数调整之后的结果,说明在进行超参数调整后结果还不错。在这里在补充一个修改,添加了老师在答辩时给的归一化建议利用sklearn自带的MinMaxScaler()函数进行归一化,将dataframe数据读成np.array(进步空间不大),在进行模型的训练即可。

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值