在很久之前,我有写一个Excel数据分析的实战项目,不晓得大家还记不记得,感兴趣的童鞋可以回看:
A九姑娘:Excel数分实战:员工流失率分析zhuanlan.zhihu.com本次的项目数据依旧是这个,但是我们这次不再是对流失率分析,此次是利用Python知识对某公司的员工流失进行预测。
本次实战涉及Python的数据可视化、和数据建模及模型评估。
干货内容:
- 数据可视化:运用matplotlib和seaborn,绘制柱状图、直方图、箱线图、折线图、饼图,以及运用子图;
- 数据建模及模型评估:数据清洗、特征选择、特征处理、特征降维(PCA降维)、建模(分类:KNN、朴素贝叶斯、随机森林、Adaboost;回归:线性回归、岭回归、Lasso、逻辑回归)、以及各个模型的评估(准确率、召回率、F值)
感兴趣的童鞋可以接着看咯~
目录
- 提出问题
- 数据理解
- 数据清洗
- 数据可视化
- 特征选择
- 特征处理
- 特征降维
- 构建模型、模型评估
导入数据,我们先看一下整体情况:
df
这里,我们先导入了很多库,有数据分析的numpy、pandas;数据可视化的matplotlib和seaborn;以及数据预处理(归一化、标准化、数值化、正规化、LDA降维)需要的包,接下来会一一介绍。
提出问题
根据公司离职员工特征,预测流失情况。
数据理解
前次的项目A九姑娘:Excel数分实战:员工流失率分析中我们已经对数据集进行理解,本次不再赘述。
数据清洗
本次抽样为全抽,不再进行选择子集;不涉及列重命名;不涉及数据类型转换;不涉及数据排序。
本次只涉及缺失值处理和异常值处理:
df
数据可视化
- 我们需要看一下员工不同阶薪酬的人数分布情况:
plt
这里,我们使用的柱状图。
plt.bar就是使用matplotlib绘制直方图;那其他图我们按照这个思路就可以进行绘制了,以下列式不同图例如何绘制:
代码中的plt.title、 plt.xlabel、plt.ylabel、plt.xticks等是图表绘制中的基本元素,见下:
plt
接下来,我们又运用了seaborn,设置了主题为‘darkgrid’,字体和颜色主题。其实我们也可以利用seaborn绘制直方图:
sns
我们来看一下,seaborn的效果:
sns
seaborn的绘制效果更为美观。
- 不同薪酬段各个部门人数的分布情况:
sns
- 比较平均满意度、最后一次满意度和月平均工时的分布情况:
如果我们要把这三个图例一同比较,我们可以使用子图:
f
图太小了,看不清,我们运用figsize调整一下图的大小:
f
- 异常值分析的过程中,我们可以使用箱线图,观测数据整体的分布情况:
sns
在sns.boxplot的参数中,saturation表示上边界,默认0.75(四分位数),whis表示k默认1.5;我们调整k在看一下:
sns
看到出来,异常值变了。
- 随着司龄变化,离职人数的变化情况,我们使用折线图:
sub_df
我们发现:工作时间5年的时候离职率最高,五年左右离职率比较高;随着时间越来越久,离职率就比较低,时间短离职率也不高;
- 使用饼图观测各个部门的人数结构:
df
我们想要把销售部门sales着重突出:
explodes
以上,我们使用了柱状图、直方图、饼图、折线图、箱型图对数据集进行了简单的理解;不再赘述,如果感兴趣,可以看文章开头推荐的另一篇,有对数据进行理解。
接下来,也是本文重点。
特征选择
我们在数据清理结束后,得到标注‘left’:
label
接下来,对数据集进行相关性分析:
df
可以用热力图来更加直观的观察:
sns
以上是皮尔逊相关系数,蓝色正相关,红色负相关。last_evaluation不属于特征值,又因它和number_project和 average_monthly_hours正相关,此三个不属于特征值可去掉;因为特征不多,项目中我们可以暂时保留。
我们先去除我们的标注left:
df
注意:axis = 1,表示列;axis = 0 表示行。
特征处理
特征变换的方法有:对指化(对数化、指数化)、离散化(等频分箱、等距分箱)、归一化、标准化、数值化、正规化。
我们对特征进行以下处理:
satisfacation_level 介于[0,1],可以不处理;或者 ,可采用MinMaxScaler归一化强行拉伸;或者标准化StandardScaler均值为0,方差为1
last_evaluation同上
number_project不大于10,也可同上
time_spend_company 与 number_project相似,同上
Work_accident promotion_last_5years 同上
sl
此处注意:
sl为True
我们对数值类特征此处均使用标准化。
department 和salary 都是离散值,需要数值化,考虑Label Encoder和OneHot Encoder(标签化、和独热编码)
dpt
此处注意:
department
此处我们均使用了标签化LabelEncoding,然后进行归一化处理。
我们看一下结果:
特征降维
常用特征降维方式,有主成分分析PCA降维、LDA降维、奇异值分解SVD。此处我们使用用PCA降维,因为LDA降维后是1维。
features
构建模型及评估
我们对数据集进行拆分,训练集60%,测试集20%,验证集20%:
from
接下来就是建模了。
1)分类-KNN
先以KNN为例:
先说一下KNN的算法思想:一个数据集都会有他的标注,如果说找到了一个点,有K个邻居中一种标注大于另外一种标注,那我们就说这个点更倾向于与多数点是一致的,这个K可以由我们来定:
那 这个点到他邻居的距离是什么?我们可以理解,把属性转化为数值后,每个属性都是一个维度,每个对象,都是一个空间中的坐标;对象和对象之间就会有距离。有以下几种:
- 欧式距离:理解为两个点的直线距离
- 曼哈顿距离:理解为各个维度的长度相加
- 闵可夫斯基距离:闵可夫斯基有一个参数p,可以取任一志,p取1时候,就是欧氏距离,p取2时候,就是曼哈顿距离;p可以无穷大。
接下来,直接上代码:
from
我们衡量指标使用的准确率ACC、召回率REC和F值。
看一看到,验证集验证结果的准确率0.96、召回率0.91、F值0.92;
我们调整K,看一下如果只要3个邻居的话,结果又如何:
看的出来,n_neighbore=3时,泛化能力更好;
根据验证集进行对预测值验证后,我们还想根据测试集、训练集同样进行验证,我们可以建立一个函数来完成,进而比较:
knn_clf
0为训练集;1为验证集;2为测试集。
整体来看,泛化能力还是不错的;但是,对于测试集略还是略低于训练集;存在微小的过拟合现象。
如果我们在特征预处理的时候,对数据进行的是归一化,并不是这次的标准化,我们也可以去实验一下看一下结果;同样,可以对department和salary进行one-hot编码,多次尝试;寻找最合适的模型,大家可以自己练习一下。
2)分类-朴素贝叶斯
基本算法思想:
- 假设特征间是相互独立的;
- 各种特征在X条件下的概率也是已知的;
- 条件X的分布概率也是已知的;
- 给定特征,判断是X的哪个值。
常用的朴素贝叶斯算法有:高斯贝叶斯和伯努利朴素贝叶斯:
- 朴素贝叶斯用到的特征必须是离散的;如果这些离散值都是二值(0,1),使用伯努利贝叶斯会更好;如果值是连续的,在伯努利朴素贝叶斯下,也会把 他们二值化;
- 高斯贝叶斯,是假设特征都是高斯分布的;二者都对特征有比较严格的要求;同时,他们在离散属性的情况下会有更好的表现;连续属性不一定会非常好
from
我们先导入数据库包~
接下来,为了方便,我们先建立一个model,存放我们的各个模型,然后统一运行比较:
models
然后呢,我们把按照刚才的for循环思路,稍作修改:
for
运行,我们看一下结果:
看的出来,朴素贝叶斯在此次的特征大部分非离散的情况下,泛化结果较差。
3)分类-决策树
决策树,是模仿人类做决策的过程,一步步的做出决策。
from
我们按照刚才的思路,在models中增加决策树:
models
运行for循环,看一下结果,我们这里只看决策树部分的吧:
很明显,决策树的泛化效果更佳。
4)分类-支持向量机SVM
算法思想:扩维,把一组特征变为线性可分;所以,可以先在低维空间进行计算,利用核函数扩维。
from
我们可以用参数C来控制SVM的精度,C越大,SVM准确率越高。这里我们先试试C = 1:
我们可以尝试把C调整到10000:
看得到,泛化效果有了明显提升。
5)分类-随机森林
随机森林是一种集成方法。
集成方法是什么?
同一个问题,我们可以用不同的分类器来判别,针对某一条数据不同的分类器结果会有不同,如果充分考虑分类器判对或者盘错的可能,就很有可能发现进一步提升分类质量的方法;机器学习问题中,将很多机器学习算法组合在一起,得到可能会比单一算法的结果更好的性能结果;这样的思路就是集成学习的方法。
集成方法分为袋装法和提升法:
- 袋装法:对训练集用不同的模型判断后,对不同模型投票(均值),比如随机森林;
- 提升法:模型串联起来,加权叠加,比如Adaboost;
随机森林,有N个决策树,但是我们需要注意树的个数,过多容易造成过拟合。
from
我们运行for循环,看一下结果:
训练家的准确率达到0.996,召回率达到0.986,F值同样也是0.99;相对验证集和测试集基本差不多。整体来看,泛化能力较好。
6)分类-Adaboost
from
运行for循环,看一下结果:
7)回归-线性回归
在上文,我们可以知道,last_evaluation number_project average_monthly_hours 相关性比较大,我们对这三列进行分析:
from
我们看一运行结果:
8)回归-岭回归
from
9)回归-Lasso
from
我们可以通过控制岭回归和Lasso回归的参数来控制拟合效果。
10)回归-逻辑回归
我们在之前的文章Python数分:回归分析中对逻辑回归和线性回归,进行详细的介绍,感兴趣的童鞋可以回看哈~本次就直接上代码了:
from
运行for循环:
泛化效果较差。
以上,我们构建10种模型,并对各个模型果进行评估。此次分享先到这里~
感谢观看。