python sns绘制回归线_Python数分实战:员工流失情况预测

7ca840280264de95234ade46c71448d4.png

在很久之前,我有写一个Excel数据分析的实战项目,不晓得大家还记不记得,感兴趣的童鞋可以回看:

A九姑娘:Excel数分实战:员工流失率分析​zhuanlan.zhihu.com
fc551e260602c22b4945d736a9dc0101.png

本次的项目数据依旧是这个,但是我们这次不再是对流失率分析,此次是利用Python知识对某公司的员工流失进行预测。

本次实战涉及Python的数据可视化、和数据建模及模型评估

干货内容

  • 数据可视化:运用matplotlib和seaborn,绘制柱状图、直方图、箱线图、折线图、饼图,以及运用子图;
  • 数据建模及模型评估:数据清洗、特征选择、特征处理、特征降维(PCA降维)、建模(分类:KNN、朴素贝叶斯、随机森林、Adaboost;回归:线性回归、岭回归、Lasso、逻辑回归)、以及各个模型的评估(准确率、召回率、F值)

感兴趣的童鞋可以接着看咯~


目录

  • 提出问题
  • 数据理解
  • 数据清洗
  • 数据可视化
  • 特征选择
  • 特征处理
  • 特征降维
  • 构建模型、模型评估

导入数据,我们先看一下整体情况:

df 

1143819f68822dc0513948f6a4e005d9.png

这里,我们先导入了很多库,有数据分析的numpy、pandas;数据可视化的matplotlib和seaborn;以及数据预处理(归一化、标准化、数值化、正规化、LDA降维)需要的包,接下来会一一介绍。

提出问题

根据公司离职员工特征,预测流失情况。

数据理解

前次的项目A九姑娘:Excel数分实战:员工流失率分析中我们已经对数据集进行理解,本次不再赘述。

数据清洗

本次抽样为全抽,不再进行选择子集;不涉及列重命名;不涉及数据类型转换;不涉及数据排序。

本次只涉及缺失值处理和异常值处理:

df 

7c41ba8e2d301a7c7dadc8049a3cf830.png

数据可视化

  • 我们需要看一下员工不同阶薪酬的人数分布情况:
plt

3e31f5aee8ba0977b6b6078891010308.png

这里,我们使用的柱状图

plt.bar就是使用matplotlib绘制直方图;那其他图我们按照这个思路就可以进行绘制了,以下列式不同图例如何绘制:

47a19dfadd31ed87929c3d46f4c3da68.png

代码中的plt.title、 plt.xlabel、plt.ylabel、plt.xticks等是图表绘制中的基本元素,见下:

plt

接下来,我们又运用了seaborn,设置了主题为‘darkgrid’,字体和颜色主题。其实我们也可以利用seaborn绘制直方图:

sns

我们来看一下,seaborn的效果:

sns

6a50beac72a5f220f54d2adccee3d6f3.png

seaborn的绘制效果更为美观。

  • 不同薪酬段各个部门人数的分布情况:
sns

9f68ce73b4d2746032b50d0192014535.png
  • 比较平均满意度、最后一次满意度和月平均工时的分布情况:

如果我们要把这三个图例一同比较,我们可以使用子图

f 

cbf1b5546d1b3f59dce1cf69765a8e5c.png

图太小了,看不清,我们运用figsize调整一下图的大小:

f 

2e9ff22dfc14ade14f81b343b1ce9839.png
  • 异常值分析的过程中,我们可以使用箱线图,观测数据整体的分布情况:
sns

ca0fdc6248cee1bfea64114259ba38a4.png

在sns.boxplot的参数中,saturation表示上边界,默认0.75(四分位数),whis表示k默认1.5;我们调整k在看一下:

sns

907260e25dc5ea2055c2c85852d36efb.png

看到出来,异常值变了。

  • 随着司龄变化,离职人数的变化情况,我们使用折线图
sub_df 

b3be4e385d2e4025d0119f0fb792d8a8.png

ff3229cad6b4757e44299d77cf4be02c.png

我们发现:工作时间5年的时候离职率最高,五年左右离职率比较高;随着时间越来越久,离职率就比较低,时间短离职率也不高;

  • 使用饼图观测各个部门的人数结构:
df

4d63a111bbe9a8c2952f28624085eba0.png

我们想要把销售部门sales着重突出:

explodes 

ee798faa92d8d5ca656be63106bc3a6d.png

以上,我们使用了柱状图、直方图、饼图、折线图、箱型图对数据集进行了简单的理解;不再赘述,如果感兴趣,可以看文章开头推荐的另一篇,有对数据进行理解。

接下来,也是本文重点。

特征选择

我们在数据清理结束后,得到标注‘left’:

label 

接下来,对数据集进行相关性分析:

df

4383d3d52632bd5b08de9772bd3ba136.png

可以用热力图来更加直观的观察:

sns

0cb70c44b980c4f56a36ef0f7eb2f526.png

以上是皮尔逊相关系数,蓝色正相关,红色负相关。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,然后进行归一化处理。

我们看一下结果:

f39b704d87179db291c9e04b1108090e.png

特征降维

常用特征降维方式,有主成分分析PCA降维、LDA降维、奇异值分解SVD。此处我们使用用PCA降维,因为LDA降维后是1维。

features 

95070fd0ca66ed06b7bc8c652b03d185.png

构建模型及评估

我们对数据集进行拆分,训练集60%,测试集20%,验证集20%:

from 

7ff6ef5e8b390b4dedbe046a0fc4c6f8.png

接下来就是建模了。

1)分类-KNN

先以KNN为例:

先说一下KNN的算法思想:一个数据集都会有他的标注,如果说找到了一个点,有K个邻居中一种标注大于另外一种标注,那我们就说这个点更倾向于与多数点是一致的,这个K可以由我们来定:

那 这个点到他邻居的距离是什么?我们可以理解,把属性转化为数值后,每个属性都是一个维度,每个对象,都是一个空间中的坐标;对象和对象之间就会有距离。有以下几种:

  • 欧式距离:理解为两个点的直线距离
  • 曼哈顿距离:理解为各个维度的长度相加
  • 闵可夫斯基距离:闵可夫斯基有一个参数p,可以取任一志,p取1时候,就是欧氏距离,p取2时候,就是曼哈顿距离;p可以无穷大。

接下来,直接上代码:

from 

9140fc1220c7d56153222646ccb54038.png

我们衡量指标使用的准确率ACC、召回率REC和F值。

看一看到,验证集验证结果的准确率0.96、召回率0.91、F值0.92;

我们调整K,看一下如果只要3个邻居的话,结果又如何:

922298838830ea48442b02c93c00b8d0.png

看的出来,n_neighbore=3时,泛化能力更好;

根据验证集进行对预测值验证后,我们还想根据测试集、训练集同样进行验证,我们可以建立一个函数来完成,进而比较:

knn_clf 

03a910cebb1eb694cbd43b998fe513ef.png

0为训练集;1为验证集;2为测试集。

整体来看,泛化能力还是不错的;但是,对于测试集略还是略低于训练集;存在微小的过拟合现象。

如果我们在特征预处理的时候,对数据进行的是归一化,并不是这次的标准化,我们也可以去实验一下看一下结果;同样,可以对department和salary进行one-hot编码,多次尝试;寻找最合适的模型,大家可以自己练习一下。

2)分类-朴素贝叶斯

基本算法思想

  • 假设特征间是相互独立的;
  • 各种特征在X条件下的概率也是已知的;
  • 条件X的分布概率也是已知的;
  • 给定特征,判断是X的哪个值。

常用的朴素贝叶斯算法有:高斯贝叶斯和伯努利朴素贝叶斯:

  • 朴素贝叶斯用到的特征必须是离散的;如果这些离散值都是二值(0,1),使用伯努利贝叶斯会更好;如果值是连续的,在伯努利朴素贝叶斯下,也会把 他们二值化;
  • 高斯贝叶斯,是假设特征都是高斯分布的;二者都对特征有比较严格的要求;同时,他们在离散属性的情况下会有更好的表现;连续属性不一定会非常好
from 

我们先导入数据库包~

接下来,为了方便,我们先建立一个model,存放我们的各个模型,然后统一运行比较:

models 

f318dfc1be0d0bf8f9341b56d6934273.png

然后呢,我们把按照刚才的for循环思路,稍作修改:

for 

运行,我们看一下结果:

d46d90dc4af25179e8811ae2038cd84b.png

90bf185fc60923ffd9d9fa28f7b545e6.png

看的出来,朴素贝叶斯在此次的特征大部分非离散的情况下,泛化结果较差。

3)分类-决策树

决策树,是模仿人类做决策的过程,一步步的做出决策。

from 

我们按照刚才的思路,在models中增加决策树:

models

运行for循环,看一下结果,我们这里只看决策树部分的吧:

407f0497d9cb0411b6add019c0cb3548.png

很明显,决策树的泛化效果更佳。

4)分类-支持向量机SVM

算法思想:扩维,把一组特征变为线性可分;所以,可以先在低维空间进行计算,利用核函数扩维。

from 

我们可以用参数C来控制SVM的精度,C越大,SVM准确率越高。这里我们先试试C = 1:

54263c031490551346907eeb122d2f68.png

我们可以尝试把C调整到10000:

5e87134b60487cf813b5d721c7d6baae.png

看得到,泛化效果有了明显提升。

5)分类-随机森林

随机森林是一种集成方法。

集成方法是什么?

同一个问题,我们可以用不同的分类器来判别,针对某一条数据不同的分类器结果会有不同,如果充分考虑分类器判对或者盘错的可能,就很有可能发现进一步提升分类质量的方法;机器学习问题中,将很多机器学习算法组合在一起,得到可能会比单一算法的结果更好的性能结果;这样的思路就是集成学习的方法。

集成方法分为袋装法和提升法:

  • 袋装法:对训练集用不同的模型判断后,对不同模型投票(均值),比如随机森林;
  • 提升法:模型串联起来,加权叠加,比如Adaboost;

随机森林,有N个决策树,但是我们需要注意树的个数,过多容易造成过拟合。

from 

我们运行for循环,看一下结果:

a54610084cfae80314d38b867f610a62.png

训练家的准确率达到0.996,召回率达到0.986,F值同样也是0.99;相对验证集和测试集基本差不多。整体来看,泛化能力较好。

6)分类-Adaboost

from 

运行for循环,看一下结果:

0b3043d9464281092556b210866ebd94.png

7)回归-线性回归

在上文,我们可以知道,last_evaluation number_project average_monthly_hours 相关性比较大,我们对这三列进行分析:

from 

我们看一运行结果:

20a899e977bad910ed2200d6e5e00b07.png

8)回归-岭回归

from 

5774765331aac2e59e379f6127003e37.png

9)回归-Lasso

from 

bb83b884b15b25dc40963033c1e6af53.png

我们可以通过控制岭回归和Lasso回归的参数来控制拟合效果。

10)回归-逻辑回归

我们在之前的文章Python数分:回归分析中对逻辑回归和线性回归,进行详细的介绍,感兴趣的童鞋可以回看哈~本次就直接上代码了:

from 

运行for循环:

745ea239e97232aa34d3512eebb000b6.png

泛化效果较差。


以上,我们构建10种模型,并对各个模型果进行评估。此次分享先到这里~

感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go var 一个整数_Go语言学习基础-值、变量、常量

Hello world第一个程序是打印经典的“hello world”信息。保存为hello-world.go文件,在命令行中使用go run命令运行程序。若要构建为二进制文件,则使用go build来实现,然后直接执行二进制文件。结果:$ go run hello-world.gohello…

怎么取消自动格式化_iPhone自动扣费怎么取消?App Store、微信、支付宝关闭自动扣费教程...

经常有网友反馈,自己的手机每月会被不知不觉的被扣钱,但又不知道如何关闭,烦恼不已。其实,现在很多视频、音乐、购物等APP都有会员充值功能,其中不少还包含“自动续费”功能,一旦开启会员,今后就…

c# selenium chrome 文件下载_Selenium 框架原理以及环境安装

Selenium 框架原理图片来自转载 蓝色的图Selenium Language Binding就是我们平时使用的编码语言,包括java、python、C#等。可以看到这些语言并没有直接与Browser Drivers进行通信,而是通过了JSON WireProtocol,这就是webdriver协议 &#xff…

怎么打包图片_怎么将许多张照片打包发到邮箱?

怎么将许多张照片打包发到邮箱?所谓的打包,就是需要你把大量照片文件变成一个压缩文件,类似于放到一个文件夹内,也可以理解为把多张纸质照片装订成一个相册,而在装订过程中需要相应工具才能完成。使用压缩包发送文件&a…

dram sram利用 利用_使用量子力学技术的新型超低功耗存储器或将取代DRAM和Flash...

雷锋网按:业界普遍认为未来从数据中将能挖掘出最大的价值,但要挖掘数据的价值除了需要很强的计算能力之外,数据的存储也非常关键。目前,新型存储器也是领先的企业非常关注的一个方向,兰开斯特大学(Lancaster Universit…

mac地址转换_mac电脑格式转化工具

软件下载【软件名称】:Permute【系统支持】:MAC电脑【位数支持】:32位/64位软件下载地址:链接:https://pan.baidu.com/s/1OAEpnvmkQgqd9MMq3Rucow提取码:tgt7注:阿狸提供用户下载的所有内容均来…

电脑怎么打出冒号符号_Mac小技巧:教你如何在Mac电脑打出command?、option?等特殊符号...

很多Mac新用户不知道该如何打出command⌘、option⌥等特殊符号,而网上好多关于打出Mac特殊符号的教程已经过期,或者繁琐看不懂。今天为大家分享一份简单,一看就懂的Mac电脑怎么打出command⌘、option⌥等特殊符号教程。1.我们打开系统偏好设置…

arraylist下标从几开始_漫画:为什么计算机从 0 开始计数,而不是从 1 开始?

作者 | 漫话编程来源 | 漫话编程当我们想要写一个循环体&#xff0c;期望执行10次的时候&#xff0c;我们会使用以下方式&#xff1a;for (int i0; i<10; i){}可以看到&#xff0c;为了保证循环10次&#xff0c;我们定义了一个整数变量从0开始。还有&#xff0c;当我们定义数…

python 爬虫代码_Python 你见过三行代码的爬虫吗

Python 使用Lassie库&#xff0c;仅编写三行代码就能爬取静态页面上的图片和视频。Python实战教程每次讲爬虫的时候都会从“发送请求” 开始讲&#xff0c;讲到解析页面的时候可能大部分读者都会卡住&#xff0c;因为这部分确实需要一点XPATH或者CSS选择器的前置知识。那么有没…

接口传值后不起作用_聊一聊 API 接口测试

知其然亦知其所以然&#xff0c;接口测试没有那么复杂&#xff0c;但也没有那么简单。本文作者&#xff1a;张敏&#xff0c;软件测试工程师&#xff0c;就职于一家容器平台解决方案公司&#xff0c;负责 DevOps 产品的测试。什么是 APIAPI(Application Programming Interface)…

服务器无法在发送 http 标头之后设置内容类型。_python socket编程预知内容

socket&#xff1a;运用IP地址协议端口 标识一个进程我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程&#xff0c; 在本地进程通讯中我们可以使用PID来唯一标示一个进程&#xff0c;但PID只在本地唯一&#xff0c;网络中的两个进程PID冲突几率很大 …

自定义键盘组件_一文读懂!iOS系统组件的设计规范全解

一说到组件&#xff0c;大部分初级设计师和中级设计师的脑海里只会蹦出弹窗、Toast及操作列表等具体的概念&#xff0c;没有一套属于自己的组件分类体系&#xff0c;这样对于视觉设计、交互设计或产品设计的系统学习来说都是不利的。iOS14概念设计iOS官方设计指南在介绍组件时是…

anaconda安装python视频_怎么安装anaconda?

安装 Anaconda步骤&#xff1a; 1、双击下载好的 Anaconda2-5.2.0-Windows-x86_64.exe文件&#xff0c;出现如下界面&#xff0c;点击 Next 即可。2、点击 I Agree &#xff08;我同意&#xff09;3、Install for: Just me还是All Users&#xff0c;假如你的电脑有好几个 Users…

office365 自定义_IT外包观察,足不出户,Office365打造教学新体验?

Office365无疑是当今最高效的集文档处理、联机协同、移动办公、快捷沟通、商业智能为一体的云端生产力服务。但office365仅仅只应用于移动办公吗&#xff1f;有没有可能实现移动办学呢&#xff1f;仅仅是商业智能吗&#xff1f;会不会也能做到教学智能&#xff1f;上海蓝盟连续…

python连接数据库mysql错误1045、手动登录可以_登录mysql错误1045解决方法

在命令提示符中登陆mysql时&#xff0c;提示1045报错解决方案&#xff1a; 安装好mysql&#xff0c;在cmd中输入mysql -uroot -p回车&#xff0c;输入密码后&#xff0c;出现1045错误&#xff0c;错误提示如下&#xff1a; ERROR 1045(28000): Access denied for user rootloca…

host 端口_如何让多端口网站用一个nginx进行反向代理实际场景分析

前段时间公司要整合服务器资源&#xff0c;刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合&#xff0c;断断续续一个月迁移完成大概优化掉了1/3的机器&#xff0c;完成之后遇到了一些问题&#xff0c;比如曾今零零散散部署在生产上一些可视化UI&#xff1a;apollo&…

sqldeveloper导出数据字典_如何全面建设B端产品中的数据迁移方案

加关注&#xff0c;带你看世界在新系统替换老系统或者系统升级的项目中&#xff0c;难免会存在数据迁移的工作&#xff0c;并且随着业务系统和数据结构的复杂性&#xff0c;数据迁移的难度越大。这亦要求在项目实施的前期&#xff0c;根据客户的需求尽可能全面地考虑到各个方面…

声明对象_静态变量(使用同一个类声明的对象可以共享一个值)

要在属于同一种类的对象之间共享数据值&#xff0c;可以使用static。namespace demo3{ class point //定义点 { public int x; public int y; } class line { static public point origin new point(); public point ending ne…

centos6配置mysql远程访问_MariaDB 数据库配置 Navicat 程序远程访问权限

如果MySQL数据库采用的是 MariaDB 引擎&#xff0c;与普通的数据库配置有点不同 MariaDB 与普通的MySQL数据库的一个不同在于它的配置文件不止一个&#xff0c;它将不同的数据放入到不同的配置文件中&#xff0c;之前的/etc/mysql/my.cnf内容如下&#xff1a;从文件中的注释上来…

java读取mysql配置文件_Linux运维:MySQL读写分离解决方案

一次性付费进群&#xff0c;长期免费索取教程&#xff0c;没有付费教程。进微信群回复公众号&#xff1a;微信群&#xff1b;QQ群&#xff1a;460500587教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍 微信公众号&#xff1a;计算机与网络安全ID&#xff1a;Computer-net…