公司从招聘到培训一名员工,每个环节都需花费不少的资源,而一个员工的离职多多少少会给公司带来损失,为了了解员工离职的原因并预测潜在的离职对象,IBM 公布了他们真实的员工信息并提出以下问题陈述:
“预测员工的流失,即员工是否会减员,考虑到员工的详细信息,即导致员工流失的原因”

本文将利用 logistic regression 来探索这一问题。

1. 前期准备

import matplotlib.pyplot as plt
import pylab as pl
import pandas as pd
import seaborn as sns
import numpy as np
from IPython.core.display import display
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report,roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler'exec(%matplotlib inline)'
sns.set()

2. 数据读取

#loading the dataset using Pandas
data = pd.read_csv('/.../logistic_regression_data.csv',sep=",")
data.head()# Output shown below

在此只显示了部分信息

3. 数据处理

填充缺省值:

# Data preprocessing
data.fillna(0, inplace=True)

观察得到, Age 这一列数据跨度太大,因此我们需要对这个特征进行分组操作:

# function to create group of ages, this helps because we have 78 different values here
def Age(dataframe):dataframe.loc[dataframe['Age'] <= 30, 'Age'] = 1dataframe.loc[(dataframe['Age'] > 30) & (dataframe['Age'] <= 40), 'Age'] = 2dataframe.loc[(dataframe['Age'] > 40) & (dataframe['Age'] <= 50), 'Age'] = 3dataframe.loc[(dataframe['Age'] > 50) & (dataframe['Age'] <= 60), 'Age'] = 4return dataframeAge(data)


在此样本数据中存在一些分类值,如 Attrition 可分为NoYes, Gender 分为FemaleMale。在机器学习任务中,对于这样的特征,通常我们需要对其进行特征数字化,本文中我们将利用LabelEncoder() 函数:

# Encode labels with value between 0 and n_classes-1.
# Digitizing texts
labelEncoder_X = LabelEncoder()
data['BusinessTravel'] = labelEncoder_X.fit_transform(data['BusinessTravel'])
data['Department'] = labelEncoder_X.fit_transform(data['Department'])
data['EducationField'] = labelEncoder_X.fit_transform(data['EducationField'])
data['Gender'] = labelEncoder_X.fit_transform(data['Gender'])
data['JobRole'] = labelEncoder_X.fit_transform(data['JobRole'])
data['MaritalStatus'] = labelEncoder_X.fit_transform(data['MaritalStatus'])
data['Over18'] = labelEncoder_X.fit_transform(data['Over18'])label_encoder_y = LabelEncoder()
data['Attrition'] = label_encoder_y.fit_transform(data['Attrition'])data

至此,我们所有的特征值都转化为了数字

4. 数据可视化分析

我选择用 heatmap 来观察多对象多特征之间的关系:

corr_cols = data[['Age', 'Attrition', 'BusinessTravel', 'Department','DistanceFromHome', 'Education', 'EducationField', 'EmployeeCount','EmployeeID','Gender', 'JobLevel','JobRole','MaritalStatus', 'MonthlyIncome', 'NumCompaniesWorked','Over18','PercentSalaryHike', 'StandardHours','StockOptionLevel', 'TotalWorkingYears','TrainingTimesLastYear', 'YearsAtCompany', 'YearsSinceLastPromotion','YearsWithCurrManager']]corr = corr_cols.corr()
plt.figure(figsize=(18, 10))
sns.heatmap(corr, annot=True,cmap="RdBu_r")


咦,为什么中间有些空没有画上去呢?仔细观察后发现,对于所有对象,特征EmployeeCount,Over18,StandardHours的值相等,因此这三个特征对我们的模型训练帮助不大,可以选择删除

data.drop(['EmployeeCount', 'StandardHours','Over18'], axis=1, inplace=True)corr_cols = data[['Age', 'Attrition', 'BusinessTravel', 'Department','DistanceFromHome', 'Education', 'EducationField', 'Gender', 'JobLevel','JobRole','MaritalStatus', 'MonthlyIncome', 'NumCompaniesWorked','PercentSalaryHike', 'StockOptionLevel', 'TotalWorkingYears','TrainingTimesLastYear', 'YearsAtCompany', 'YearsSinceLastPromotion','YearsWithCurrManager']]corr = corr_cols.corr()
plt.figure(figsize=(18, 10))
sns.heatmap(corr, annot=True,cmap="RdBu_r")

改进后的热力图如下:

接下来我们就可以开始训练模型啦

5. 逻辑回归

这里选择直接调用 sklearn 下的 LogisticRegression模型

# Split data into training and Testing set:
# Choose dependent and independent var:¶
# here dependent var is Attrition and rest of the var are independent var.
y = data['Attrition']
x = data.drop('Attrition', axis=1)X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=42)
# Standardization of a dataset
Scaler_X = StandardScaler()
X_train = Scaler_X.fit_transform(X_train)
X_test = Scaler_X.transform(X_test)lr = LogisticRegression(solver='saga')
lr_trained=lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)

让我们看看模型的准确率:

display(accuracy_score(y_test, y_pred))

0.8378684807256236

感觉效果还不错,再来看看它的 ROC 曲线吧:

# Plotting the ROC Curve
y_roc = np.array(y_test)
fpr, tpr, thresholds = roc_curve(y_roc, lr_trained.decision_function(X_test))
roc_auc = auc(fpr, tpr)
pl.clf()
pl.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
pl.plot([0, 1], [0, 1], 'k--')
pl.xlim([0.0, 1.0])
pl.ylim([0.0, 1.0])
pl.xlabel('False Positive Rate')
pl.ylabel('True Positive Rate')
pl.legend(loc="lower right")
pl.show() # Output shown below


若 ROC 曲线越靠近左上角说明分类效果越好, 与之对应的 auc 的值就越大.

6. 小结

通过性能分析可以得出,机器学习预测模型成功地对83.79%的未知(验证集)样本进行了正确有效的分类,并对不同的性能指标给出了较低的统计数据。

因此,通过这种方式,可以使用数据分析和机器学习建立员工流失预测模型。

参考资料
[1] 使用机器学习方法预测员工流失数据模型
[2] 公司人员离职情况分析及预测(工具:python)
[3] 机器学习实战(一):逻辑回归预测
[3] Seaborn5分钟入门(六)——heatmap热力图

Logistic Regression - IBM 员工离职预测相关推荐

  1. 员工离职预测(logistic)(R语言)

    员工离职预测(logistic) 出于工作需要及个人兴趣,学习数据分析及R语言是差不多2年前,第一篇更新的文章为m久前做的员工离职预测,当时做这个项目的主要是为了学习logistic算法,数据来源为D ...

  2. 数据挖掘竞赛-员工离职预测训练赛

    员工离职预测 简介 DC的一道回归预测题.是比较基础的分类问题,主要对逻辑回归算法的使用.核心思路为属性构造+逻辑回归. 过程 数据获取 报名参与比赛即可获得数据集的百度网盘地址,这个比赛时间很久,随 ...

  3. kaggle员工离职预测——SVC

    一.比赛说明 比赛地址:https://www.kaggle.com/c/bi-attrition-predict 问题描述 数据包括员工的各种统计信息,以及该员工是否已经离职,统计的信息包括工资.出 ...

  4. 天池竞赛员工离职预测训练赛

    组员:欧阳略.陶奇辉.王曙光.吴轩毅 数据来源:天池大数据竞赛员工离职预测训练赛中的数据 大致数据截图如下 根据所给数据,我组利用Pycharm编程源代码截图如下 最终,我组预测准确率为0.89,基本 ...

  5. 吃鸡排名预测挑战赛 空气质量预测 英雄联盟大师预测 手机行为识别 员工离职预测 猫十二分类体验赛

    1.吃鸡排名预测挑战赛 https://aistudio.baidu.com/aistudio/competition/detail/155/0/introduction 2.空气质量预测https: ...

  6. 机器学习-员工离职预测训练赛

    [数据来源]DC竞赛的员工离职预测训练赛 一共两个csv表格,pfm_train.csv训练(1100行,31个字段),pfm_test.csv测试集(350行,30个字段) [字段说明] Age:员 ...

  7. r语言员工离职_使用R机器学习进行员工离职预测系列(一)

    最近一直觉得,其实机器学习的门槛并不高,以R语言的角度,甚至稍微学过一点,就可以针对相关数据进行各种算法模型的建立和测试. 而真正有难度的地方一是算法优化部分,二是和对于模型评价的部分,这两个部分往往 ...

  8. 基于python的kaggle练习(二)——员工离职预测

    前沿 目前社会上呈现出一种公司招不到人,大批失业人员的矛盾现象,且大部分公司的离职率居高不下,很多入职没多久就辞职,所花费的培训招聘等资源都浪费了.为了弄清楚公司员工离职原因,通过kaggle上某一家 ...

  9. 深度学习的员工离职预测

    导言 墨西哥的员工流动率在世界上排名第八,平均每年的流失率约为17%,然而某些行业如:食品服务,则达到50%.根据Catalyst的一项研究,更换员工的成本平均约为员工年薪的50%-75%.考虑到月薪 ...

  10. 员工离职预测 逻辑回归

    import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder#中文编码为数字 import ...

最新文章

  1. 图文解说oracle视图
  2. ASP导出数据到excel
  3. pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存
  4. 三维重建PCL:点云单侧面正射投影
  5. Oracle11g远程连接配置 visual studio 2003
  6. P4351-[CERC2015]Frightful Formula【组合数学,MTT】
  7. 前端学习(2182):keep-alive及其他问题
  8. Tecplot中如何提取水线面(自由表面)并绘图
  9. 基础知识—表达式与语句-运算符
  10. Mac下搭建react及bable
  11. 结合CmakeList来更好地理解windows下的动态库和静态库
  12. VS 2005 命令行cl编译配置 Notepad++设置
  13. 模拟信号采样与AD转换
  14. 2020美亚杯个人赛头脑风暴
  15. 织梦DedeCms技术资料
  16. java 寻找峰值峰谷_Java实现 LeetCode 162 寻找峰值
  17. 【华为机试真题 JAVA】字符串子序列II-100
  18. Python轻松实现AI换脸
  19. ## 投标人出具哪种检测机构的报告才具有法律效力?
  20. 提高企业竞争力,如何开展知识管理工作?

热门文章

  1. java提升的计划书
  2. goldendict for linux,GoldenDict(for Linux)配置无道词典
  3. 你该知道的音频常见接口
  4. j1900做网站服务器,j1900可以跟云服务器
  5. python re模块(正则表达式) sub()函数详解
  6. vr手柄设置_最佳无线VR设置,最新和即将推出
  7. 为什么神经网络有偏置? 神经网络中的偏置(bias)究竟有这么用
  8. 计算机机房前端,(前端机房试题.doc
  9. JavaScript经典效果集[蓝色理想]
  10. 入职5年前端工程师针对web前端小白,作出的职业规划建议