gpfalade/employee-attrition-prediction
GitHub: gpfalade/employee-attrition-prediction
这是一个使用机器学习预测尼日利亚金融机构员工流失的项目,旨在帮助HR团队识别高风险员工并优化留任策略。
Stars: 0 | Forks: 0
# 预测尼日利亚金融机构员工流失率
### 采用先进机器学习技术




## 项目概述
本项目旨在运用先进的机器学习技术,预测尼日利亚一家金融机构的员工流失率。这是本人在东伦敦大学完成的数据科学硕士论文研究的重构项目。
员工流失是当今尼日利亚银行面临的主要运营干扰和财务成本挑战之一。将招聘、入职、知识转移和生产力损失等因素考虑在内,替换一名员工的成本可能达到其年薪的50%至200%。对于在多个部门和地点管理数千名员工的大型金融机构而言,未加管理的流失风险会演变为战略风险。
本研究旨在探讨机器学习模型是否能在员工提交辞呈之前,以足够的精度识别出高风险离职员工,从而使人力资源和管理层团队能够主动采取干预措施。
## 论文参考信息
**标题:** 采用先进机器学习技术预测金融机构员工流失率
**院校:** 东伦敦大学 - 数据科学硕士
**成绩:** 优秀
**年份:** 2025年
## 数据集
本项目使用的数据集是一个合成的人力资源记录集,涵盖尼日利亚一家金融机构2015年1月至2024年12月期间的数据。
| 属性 | 详情 |
|---|---|
| 总记录数 | 5,000 |
| 特征数 | 36 |
| 目标变量 | 流失 (是 / 否) |
| 流失率 | ~26% |
| 时间范围 | 2015 – 2024 |
| 雇佣类型 | 正式员工和合同制员工 |
| 部门 | 37个尼日利亚银行部门 |
**该数据集是通过程序生成的**,生成脚本位于本仓库的 `generate_hr_data.py` 文件中。它反映了尼日利亚银行业真实的特征,包括:
- 员工籍贯的尼日利亚州分布
- 按职位等级划分的奈拉薪资范围
- 尼日利亚银行部门结构
- 符合尼日利亚银行业惯例的等级体系
- 2022年后的远程工作模式
- 反映尼日利亚劳动力市场现实情况的流失驱动因素
数据集存放于 `/data` 文件夹。
## 研究目标
- 识别尼日利亚一家金融机构中员工流失的关键驱动因素
- 构建并比较多个机器学习分类模型
- 使用适当的重采样技术处理类别不平衡问题
- 使用行业标准分类指标评估模型
- 从模型输出中提炼可操作的人力资源战略见解
## 研究方法
### 1. 探索性数据分析
- 流失分布分析 - 计数和比例图表
- 按职位等级、部门组别和薪资区间细分的流失率
- 按流失状态划分的月收入分布
- 满意度评分比较(工作满意度、工作生活平衡、上级关系、环境满意度)在流失群体中的分布
- 按流失结果划分的敬业度评分分布
- 所有数值特征与流失目标变量的相关性热力图
### 2. 特征工程
- **地缘政治区域映射:** 将尼日利亚37个州合并为6个地缘政治区域(西南、东南、南南、西北、东北、中北),以降低维度并提高模型可解释性。
- **部门组别映射:** 将37个银行部门合并为6个职能组别(企业银行、财务与资金运营、运营、数字与技术、风险与合规、支持职能)。
### 3. 数据预处理
- 移除信息泄露和无预测能力的列:EmployeeID, HireDate, ExitDate, EmploymentStatus, Reason_for_Leaving, SalaryBand
- 二元编码:Gender, EmploymentType, BonusReceived, RemoteWorkOption
- 序数编码:OvertimeFrequency (从不=0 到 总是=4), BusinessTravel (不出差=0 到 频繁=2)
- 标签编码:MaritalStatus, EducationField, GeopoliticalZone, DepartmentGroup
- 目标编码:Attrition (是=1, 否=0)
- 特征缩放:对所有特征应用 StandardScaler
### 4. 训练集-测试集划分
- 采用80/20分层划分,以保持训练集和测试集中流失类别比例一致
- 测试集:1,000个样本 - 完全保留用于最终评估
- 训练集:4,000个样本 - 用于所有模型的拟合和调优
### 5. 类别不平衡处理
采用了两种互补策略并进行比较:
**策略A - SMOTE (合成少数类过采样技术)**
仅应用于训练集,为少数类(流失类)生成合成样本,产生平衡的50/50训练分布,同时保持测试集的完整性。
**策略B - 类别加权模型**
应用与类别频率成反比的类别权重,使模型对流失样本的误分类施加更重的惩罚。这种方法避免了生成合成数据,同时解决了不平衡问题。
### 6. 基线模型训练
在SMOTE重采样后的数据上训练了三个分类模型作为性能基线:
| 模型 | 用途 |
|---|---|
| 逻辑回归 | 可解释的线性基线 |
| 随机森林 | 集成树模型 |
| 梯度提升 | 序列集成比较 |
### 7. 阈值优化
将默认分类阈值 (0.50) 与多个备选阈值 (0.20 到 0.60) 进行评估,以确定流失类别的最佳精度-召回率权衡。
对于人力资源流失应用,优先考虑召回率 - 正确识别可能离职的员工比最小化误报更有价值。阈值选择基于在阈值范围内最大化流失类别的F1分数。
### 8. 分层K折交叉验证
对所有候选模型应用5折分层交叉验证,以评估泛化性能并检测过拟合。
鉴于类别不平衡的背景,PR-AUC (精度-召回率曲线下面积) 被用作主要的交叉验证指标。
### 9. 特征信号验证
进行了标签打乱测试,以确认模型学习的是真实模式而非噪声:
- 真实标签交叉验证 PR-AUC: **0.4865 ± 0.033**
- 打乱标签交叉验证 PR-AUC: **0.2456 ± 0.007**
显著的差距证实模型响应的是数据中的真实信号,而非随机波动。
### 10. 互信息特征选择
计算所有特征的互信息得分,以对预测相关性进行排序。按信息增益排序的前几个特征:
| 排名 | 特征 | 互信息得分 |
|---|---|---|
| 1 | EngagementScore | 0.0687 |
| 2 | WorkLifeBalance | 0.0348 |
| 3 | JobSatisfaction | 0.0340 |
| 4 | ManagerRelationship | 0.0267 |
| 5 | LastSalaryIncreasePct | 0.0199 |
### 11. 共线性剪枝
对所有特征进行Pearson相关性分析。一个特征因高共线性(相关性 > 0.95)被移除,最终产生一个包含**37个特征**的剪枝后特征集。
### 12. 高级提升模型
在剪枝后的特征集上评估了三个高级梯度提升框架,并通过RandomizedSearchCV进行超参数调优:
| 模型 | 交叉验证 PR-AUC | 测试集 PR-AUC | 测试集 ROC-AUC |
|---|---|---|---|
| XGBoost | 0.4824 | 0.4743 | - |
| LightGBM | 0.4645 | 0.4754 | - |
| **CatBoost** | **0.4879** | **0.4777** | **0.7504** |
基于最高的交叉验证PR-AUC和对测试集的最佳泛化能力,选择CatBoost作为最终模型。
### 13. 最终模型配置
| 参数 | 值 |
|---|---|
| 算法 | CatBoost 分类器 |
| 分类阈值 | 0.54 (优化后) |
| 测试集 ROC-AUC | 0.7504 |
| 测试集 PR-AUC | 0.4777 |
| 召回率 (流失类) | 0.69 |
| F1分数 (流失类) | 0.54 |
阈值设为0.54是为了最大化流失类别的召回率,这反映了在员工辞职前识别出风险员工的实际人力资源目标,并接受一些误报作为运营上的权衡。
## 关键结果
| 模型 | 准确率 | ROC-AUC | F1分数 |
|---|---|---|---|
| 逻辑回归 | 0.68 | 0.737 | 0.50 |
| 随机森林 | 0.75 | 0.740 | 0.40 |
| 梯度提升 | 0.74 | 0.742 | 0.43 |
| **CatBoost (最终模型)** | **0.70** | **0.750** | **0.54** |
*最佳模型:采用优化分类阈值 (0.54) 的CatBoost模型,因其ROC-AUC最高且对少数流失类别的召回率最佳而被选用。*
## 仓库结构
```
employee-attrition-prediction/
│
├── README.md
├── requirements.txt
├── generate_hr_data.py
├── .gitignore
│
├── data/
│ ├── README.md
│ └── nigerian_bank_hr_dataset_final.csv
│
└── notebooks/
└── attrition_prediction.ipynb
```
## 开始使用
### 前置条件
```
pip install -r requirements.txt
```
### 运行 Notebook
1. 克隆此仓库
2. 进入 `/notebooks` 文件夹
3. 打开 `attrition_prediction.ipynb`
4. 顺序运行所有单元格
### 重新生成数据集
```
python generate_hr_data.py
```
## 技术栈
- **编程语言:** Python 3.9+
- **机器学习库:** Scikit-learn, XGBoost, LightGBM, CatBoost
- **数据处理:** Pandas, NumPy
- **可视化:** Matplotlib, Seaborn
- **不平衡学习:** Imbalanced-learn (SMOTE)
- **环境:** Jupyter Notebook
## 作者
**Gbemileke Falade**
高级数据分析师 | 数据科学家 | AI/ML 从业者 | 数据顾问
https://www.linkedin.com/in/gbemileke-falade
标签:Apex, HR 数据分析, MSc项目, Python, scikit-learn, 人力资源分析, 分类模型, 员工保留, 员工流失预测, 尼日利亚金融机构, 数据科学, 无后门, 机器学习, 资源验证, 运营风险, 逆向工具, 金融行业, 预测模型