基于线性回归的员工离职率预测
本次旨在与自己对于特征选择提取及机器学习进行一个简单的总结,更可以加深自己对于机器学习的步骤和原理的理解。
首先对于数据来说有两个文件,train.csv 测试集 和test.csv 训练集
import pandas as pdtrain=pd.read_csv('./train.csv',index_col=0)
test=pd.read_csv('./test.csv',index_col=0)
首先第一步,查看一下数据质量,简单对数据进行一下数据探索
print(train.shape) #简单看一下训练个测试集的行数和字段数量
print(test.shape) (1176, 35)
(294, 34)
再看一下数据的缺失值情况,对于线性回归来说,如果有缺失值需要进行补全或者删除,否则无法进行建模
print(train.isnull().sum()) #没有缺失值
print(test.isnull().sum() ) #没有缺失值Age 0
Attrition 0
BusinessTravel 0
DailyRate 0
Department 0
DistanceFromHome 0
Education 0
EducationField 0
EmployeeCount 0
EmployeeNumber 0
EnvironmentSatisfaction 0
Gender 0
HourlyRate 0
JobInvolvement 0
JobLevel 0
JobRole 0
JobSatisfaction 0
MaritalStatus 0
MonthlyIncome 0
MonthlyRate 0
NumCompaniesWorked 0
Over18 0
OverTime 0
PercentSalaryHike 0
PerformanceRating 0
RelationshipSatisfaction 0
StandardHours 0
StockOptionLevel 0
TotalWorkingYears 0
TrainingTimesLastYear 0
WorkLifeBalance 0
YearsAtCompany 0
YearsInCurrentRole 0
YearsSinceLastPromotion 0
YearsWithCurrManager 0
dtype: int64
Age 0
BusinessTravel 0
DailyRate 0
Department 0
DistanceFromHome 0
Education 0
EducationField 0
EmployeeCount 0
EmployeeNumber 0
EnvironmentSatisfaction 0
Gender 0
HourlyRate 0
JobInvolvement 0
JobLevel 0
JobRole 0
JobSatisfaction 0
MaritalStatus 0
MonthlyIncome 0
MonthlyRate 0
NumCompaniesWorked 0
Over18 0
OverTime 0
PercentSalaryHike 0
PerformanceRating 0
RelationshipSatisfaction 0
StandardHours 0
StockOptionLevel 0
TotalWorkingYears 0
TrainingTimesLastYear 0
WorkLifeBalance 0
YearsAtCompany 0
YearsInCurrentRole 0
YearsSinceLastPromotion 0
YearsWithCurrManager 0
dtype: int64
对数据进行详细描述性探索,主要为了特征选择所准备
#描述性统计
print(train.describe())Age DailyRate DistanceFromHome Education EmployeeCount \
count 1176.000000 1176.000000 1176.000000 1176.000000 1176.0
mean 36.805272 802.033163 9.159864 2.918367 1.0
std 9.065549 405.946729 8.137224 1.009809 0.0
min 18.000000 104.000000 1.000000 1.000000 1.0
25% 30.000000 463.500000 2.000000 2.000000 1.0
50% 36.000000 805.500000 7.000000 3.000000 1.0
75% 42.250000 1162.000000 14.000000 4.000000 1.0
max 60.000000 1499.000000 29.000000 5.000000 1.0 EmployeeNumber EnvironmentSatisfaction HourlyRate JobInvolvement \
count 1176.000000 1176.000000 1176.000000 1176.000000
mean 1026.960034 2.750850 65.130102 2.724490
std 594.763609 1.096221 20.294326 0.715027
min 1.000000 1.000000 30.000000 1.000000
25% 498.750000 2.000000 48.000000 2.000000
50% 1031.000000 3.000000 65.000000 3.000000
75% 1555.250000 4.000000 82.250000 3.000000
max 2068.000000 4.000000 100.000000 4.000000 JobLevel JobSatisfaction MonthlyIncome MonthlyRate \
count 1176.000000 1176.000000 1176.000000 1176.000000
mean 2.055272 2.732993 6458.690476 14247.159864
std 1.106040 1.102477 4724.845883 7133.767499
min 1.000000 1.000000 1009.000000 2094.000000
25% 1.000000 2.000000 2858.750000 7912.750000
50% 2.000000 3.000000 4850.500000 14225.500000
75% 3.000000 4.000000 8380.250000 20372.500000
max 5.000000 4.000000 19999.000000 26999.000000 NumCompaniesWorked PercentSalaryHike PerformanceRating \
count 1176.000000 1176.000000 1176.000000
mean 2.703231 15.152211 3.150510
std 2.521301 3.652543 0.357723
min 0.000000 11.000000 3.000000
25% 1.000000 12.000000 3.000000
50% 2.000000 14.000000 3.000000
75% 4.000000 18.000000 3.000000
max 9.000000 25.000000 4.000000 RelationshipSatisfaction StandardHours StockOptionLevel \
count 1176.000000 1176.0 1176.000000
mean 2.714286 80.0 0.805272
std 1.080583 0.0 0.865611
min 1.000000 80.0 0.000000
25% 2.000000 80.0 0.000000
50% 3.000000 80.0 1.000000
75% 4.000000 80.0 1.000000
max 4.000000 80.0 3.000000 TotalWorkingYears TrainingTimesLastYear WorkLifeBalance \
count 1176.000000 1176.000000 1176.000000
mean 11.161565 2.767007 2.764456
std 7.747576 1.250756 0.713251
min 0.000000 0.000000 1.000000
25% 6.000000 2.000000 2.000000
50% 10.000000 3.000000 3.000000
75% 15.000000 3.000000 3.000000
max 40.000000 6.000000 4.000000 YearsAtCompany YearsInCurrentRole YearsSinceLastPromotion \
count 1176.000000 1176.00000 1176.000000
mean 6.982143 4.19898 2.160714
std 6.094338 3.63124 3.208052
min 0.000000 0.00000 0.000000
25% 3.000000 2.00000 0.000000
50% 5.000000 3.00000 1.000000
75% 9.000000 7.00000 2.250000
max 40.000000 18.00000 15.000000 YearsWithCurrManager
count 1176.000000
mean 4.098639
std 3.564190
min 0.000000
25% 2.000000
50% 3.000000
75% 7.000000
max 17.000000
其中最重要的std参数,也就是方差,对于一些方差为0的字段,代表数值相同,并不具有建模意义
#先根据方差来看,先去掉方差为0的列,即上一步std = 0,因为方差为0代表数据完全一致,没有利用性,而且还会导致模型训练时间长,可以去掉
#Age的最小值是18,因此列Over18可删;另外员工工号列也可删除,因为在业务逻辑上,员工编号和离职没有必然联系,作为祖国新时代青年,这里不提玄学
train = train.drop(['EmployeeNumber', 'StandardHours','EmployeeCount','YearsInCurrentRole','YearsSinceLastPromotion','EmployeeNumber','Over18'], axis=1)
test = test.drop(['EmployeeNumber', 'StandardHours','EmployeeCount','YearsInCurrentRole','YearsSinceLastPromotion','EmployeeNumber','Over18'], axis=1)
根据方差进行完特征选择,我们还要查看特征之间的相关性,对于相关性特别强的特征,也就是pearson系数>0.8的,我们要保留一个就好
#查看变量相关性
import matplotlib.pyplot as plt
import seaborn as sns
corr = train.corr() # pandas直接调用corr就能计算特征之间的相关系数
sns.heatmap(corr,xticklabels=corr.columns.values, yticklabels=corr.columns.values)
plt.show()
我们看图可得,JobLevel、MothlyIncome、TotalWorkingYears;PercentSalaryHike、PerformanceRating相关性很强,所以我们这里去掉JobLevel、TotalWorkingYears、PerformanceRating特征
#经过查看pearson系数图,如果系数>0.8,说明2个变量有明显线性关系,只保留一个,所以我们这里去掉JobLevel、TotalWorkingYears、PerformanceRating特征
train.drop(['JobLevel','TotalWorkingYears','PerformanceRating'],axis=1,inplace=True)
test.drop(['JobLevel','TotalWorkingYears','PerformanceRating'],axis=1,inplace=True)
到这里,我们的特征提取阶段已经完毕,接下来因为有些特征为非数值类型,而非数值类型是不能够参与运算的,所以我们要将非数值类型特征值通过LabelEncoder转换成数值类型参与计算
from sklearn.preprocessing import LabelEncoder
attr=['Age','BusinessTravel','Department','Education','EducationField','Gender','JobRole','MaritalStatus','OverTime']
lbe_list=[]
for feature in attr:lbe=LabelEncoder()train[feature]=lbe.fit_transform(train[feature])test[feature]=lbe.transform(test[feature])lbe_list.append(lbe)
# 处理Attrition字段
train['Attrition']=train['Attrition'].map(lambda x:1 if x=='Yes' else 0)
转换完成之后,个人很推荐将处理完毕的特征导出来文件,看一下自己有没有考虑不到位的情况,看一下特征处理的情况,感觉是个好习惯。
#将处理过的特征导出查看效果
train.to_csv('train_label_encoder.csv')
最后就是我们的建模训练阶段,这里我们采用线性回归LR模型
#建模 这里使用线性回归
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train.drop('Attrition',axis=1), train['Attrition'], test_size=0.2, random_state=42)
这里也是本人感觉不是十分完美的情况,一开始我是使用默认的构造函数进行训练,但是报错,居然未收敛,所以我又设置了迭代次数,迭代终止误差范围,虽通过增加迭代次数最终通过了收敛,但是预测效果个人感觉不是很好,希望老师能够给出一点建议,哪里是我考虑不周的地方。谢谢大佬!
lr = LogisticRegression(max_iter=10000, verbose=True, random_state=33,tol=1e-4)
lr.fit(X_train,y_train)
print('lr train score:{:.3f}'.format(lr.score(X_train,y_train)))
print('lr test score:{:.3f}'.format(lr.score(X_test,y_test))) [Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.
lr train score:0.869
lr test score:0.818
[Parallel(n_jobs=1)]: Done 1 out of 1 | elapsed: 0.7s finished
最终为了可解释性,我们选出前5个系数最高的5个特征,查看一下影响离职率最高的因素
#这里查看系数最大的前5个变量,可得影响离职率的最大因素是:加班、婚姻状况、出差、职位及所属部门
import numpy as np
df_coef = pd.DataFrame(index=X_train.columns,data=np.transpose(logreg.coef_))
df_coef['abs'] = df_coef.iloc[:,0].abs()
df_coef = df_coef.sort_values(by='abs', ascending=False)
print(df_coef.head())0 abs
OverTime 1.087580 1.087580
MaritalStatus 0.615751 0.615751
JobInvolvement -0.390932 0.390932
Department 0.338802 0.338802
Gender 0.311672 0.311672
基于线性回归的员工离职率预测相关推荐
- 员工离职率预测,练手赛
文章目录 1.数据探索 1.1 各特征总量及百分比 1.2 heatmap 2.特征选择&处理 2.1 特征分类 2.2 连续特征选择 2.3 分类特征选择 2.4 异常值处理 2.5 连续特 ...
- Logisitc Regression 预测员工离职率
Logistic Regression 基础 Logistic Regression 沿用了 Linear Regression 的思路和想法,通过使用线性关系拟合得到真实的函数关系.同样的,如果模型 ...
- 团队管理(3)---有效降低企业员工离职率
有效降低企业员工离职率 招人难!居高不下的员工离职率,更使企业招聘难上加难!近年来,楚柳香小编很多HR朋友都在抱怨公司员工离职率过高的问题.过高的员工流失率,使许多企业都处在招聘--流失--再招聘-- ...
- 为什么现在90后员工离职率那么高?
近几年职场上普遍存在一个奇怪的现象,90后的员工离职率特别高,95后就更不用说了,几乎可以用"一言不合就离职"来形容.那究竟是为什么现在90后的员工离职率那么高呢? 回想我们父母那 ...
- 博士员工离职率21.8%,任正非反思:华为这么大,英雄为何无用武之地?
** 2019程序员转型学什么? https://edu.csdn.net/topic/ai30?utm_source=csdn_bw ** 导读:这份文件中的数据显示,近公司博士类员工近5年累计平均 ...
- 华为给博士毕业生开出天价年薪!为何博士级员工离职率依旧高达21.8%
昨日(7月23日),网络盛传一张华为总裁办电子邮件的截图.截图显示,华为已制定2019届顶尖学生年薪制方案:8位2019届应届博士生年薪89.6万起,其中最高的达到了201万. 华为:从全世界招募天才 ...
- 【Kesci】【正式赛】2019中国高校计算机大赛——大数据挑战赛(基于FastText的新闻点击率预测qauc=0.558)
比赛连接 https://www.kesci.com/home/competition/5cc51043f71088002c5b8840 正式赛题--文本点击率预估(5月26日开赛) 搜索中一个重要的 ...
- 如何利用大数据分析技术预测员工离职?
为什么我们要对员工离职进行预测,因为它会帮助公司减少员工离职成本的消耗. 本文为美国肯尼索州立大学刘丽媛(Lilian)在HR成长部落2019年6月23日的线下活动分享文字实录,希望对大家在数据分析在 ...
- 远程办公中的IT女性:工作量增加3倍,离职率却下降近50%
提到IT行业,大家脑海中浮现的肯定是男性扎堆的场面.但有一个国家,从事IT行业的女性却不在少数,这个国家就是印度. 在印度,IT/ITES(信息技术支持服务)部门雇佣了近500万人,其中四分之一是女性 ...
- 秒辞的95后vs不敢辞的中年人,数据分析告诉你员工离职的真正原因!
[编者按]失业潮随经济寒冬席卷而至,与战战兢兢的中年人害怕失去工作不同,#95后秒辞#居然上了微博热搜成了热门话题.据<中国青年报>援引研究报告报道,受调查的95后年轻人平均7个月就会辞职 ...
最新文章
- Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法...
- js如何运行python代码_python中执行javascript代码
- 缓存穿透与击穿问题解决方案
- Linux中find常见用法示例
- 定时器工作原理及初值快速计算
- 计算机硬件系统的运行速度,电脑运行速度不给力 需要更换哪些硬件?
- 如何让SAP Spartacus ng build生成的JavaScript资源附带上store ID
- python程序怎么给别人运行_如何使Python脚本作为服务运行?
- php 公钥格式转换,如何把OpenSSH公钥转换成OpenSSL格式
- python获取月份字符串_python - python从字符串获取日期 - 堆栈内存溢出
- Ant适用的省市区联动数据
- 基础软件照搬开源不可取,自力更生才是正途
- 面试,这些问题一定要问清楚!
- 神、上帝以及老天爷(递推公式)
- kubernetes组件_Service_普通Service和无头Service
- 白话数字签名(3)—Web程序中的数字签名
- 计算机毕业设计ssm基于客户时间窗变化的物流配送管理系统设计ro75j系统+程序+源码+lw+远程部署
- ubuntu下ftp的设置及登录
- ros打开笔记本摄像头,单目标定
- web前端新手面试指南:自我介绍
热门文章
- Ubuntu中如何安装安装QQ
- STM32CubeMX创建F429/L475 HAL库工程并移植UCOSIII (二)(文末附源码)
- 章文嵩-构建云计算平台的实践
- 第三届“传智杯”全国大学生IT技能大赛(初赛B组)题解
- Python | 基于basemap绘图的路径示意图
- 基于word2vec的QA demo
- [02-27][08奥斯卡四项大奖][老无所依][DVD中英双字][已测][17:21]
- Finclip小程序宿主环境与微信小程序宿主环境
- 谷歌play商店_不断关闭时如何修复Google Play商店
- php7.4 ffi,PHP7.4 全新扩展方式 FFI 详解