🧑 博主简介:曾任某智慧城市类企业
算法总监
,目前在美国市场的物流公司从事高级算法工程师
一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907
)
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
【机器学习案例】员工离职预测:从数据探索到模型构建完整流程解析
一、项目背景与目标
“员工突然离职对企业造成多大损失?如何提前预判离职风险?”
本文将带您从零开始,使用决策树和随机森林算法,基于真实HR数据集构建员工离职预测模型。通过完整的数据分析流程,揭示影响员工离职的关键因素,并实现可落地的预测方案。
二、数据集介绍
使用公开HR数据集,包含14,999条员工记录,关键特征包括:
特征名称 | 说明 | 类型 |
---|---|---|
satisfaction_level | 员工对公司的满意度 | float64 |
last_evaluation | 绩员工上次KPI评分 | float64 |
number_project | 同时处理的项目数 | int64 |
average_montly_hours | 平均每个月的工作时间 | int64 |
time_spend_company | 在公司的时间 | int64 |
Work_accident | 是否出现过工作事故 | int64 |
left | 是否离开 | int64 |
promotion_last_5years | 最近5年是否升职 | int64 |
sales | 员工部门 | object |
salary | 薪资等级 | object |
三、完整代码实现
1. 环境准备与数据加载
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, roc_auc_score
# 配置可视化样式
plt.style.use('ggplot')
%matplotlib inline
# 加载数据
df = pd.read_csv('/path/to/HR_comma_sep.csv')
查看数据基本情况:
print(df.shape)
df.info()
df.head()
df.isna().sum()
发现一共有14999条数据,数据包含10个特征,而数据集中无缺失值;
2. 数据预处理
# 特征重命名
df = df.rename(columns={
'satisfaction_level': 'satisfaction',
'last_evaluation': 'evaluation',
'number_project': 'projectCount',
'average_montly_hours': 'averageMonthlyHours',
'time_spend_company': 'yearsAtCompany',
'Work_accident': 'workAccident',
'promotion_last_5years': 'promotion',
'sales': 'department',
'left': 'turnover'
})
# 处理分类变量
df['department'] = df['department'].astype('category').cat.codes
df['salary'] = df['salary'].astype('category').cat.codes
# 检查数据平衡性
print(f"离职比例:{df.turnover.value_counts(normalize=True)[1]:.1%}")
3. 探索性分析(EDA)
3.1 特征分布可视化
# 设置画布
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
# 满意度分布对比
sns.kdeplot(data=df, x='satisfaction', hue='turnover', ax=axes[0,0], fill=True)
axes[0,0].set_title('满意度分布对比')
# 工时分布对比
sns.boxplot(data=df, x='turnover', y='averageMonthlyHours', ax=axes[0,1])
axes[0,1].set_title('月均工时分布')
# 项目数分布
sns.countplot(data=df, x='projectCount', hue='turnover', ax=axes[1,0])
axes[1,0].set_title('参与项目数分布')
# 司龄分布
sns.histplot(data=df, x='yearsAtCompany', hue='turnover', multiple='stack', ax=axes[1,1])
axes[1,1].set_title('司龄分布')
plt.tight_layout()
3.2 相关性分析
# 计算相关系数矩阵
corr_matrix = df.corr()
# 绘制热力图
plt.figure(figsize=(12,8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('特征相关性热力图')
4. 特征工程与数据拆分
# 划分特征与标签
X = df.drop('turnover', axis=1)
y = df['turnover']
# 分层抽样拆分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
stratify=y, # 保持类别分布
random_state=42
)
5. 模型构建与评估
5.1 决策树模型
# 初始化决策树
dtree = DecisionTreeClassifier(
criterion='entropy',
max_depth=3,
min_samples_leaf=0.01,
random_state=42
)
# 训练模型
dtree.fit(X_train, y_train)
# 模型评估
print("决策树性能评估:")
print(classification_report(y_test, dtree.predict(X_test)))
print(f"AUC得分:{roc_auc_score(y_test, dtree.predict_proba(X_test)[:,1]):.2f}")
5.2 随机森林模型
# 初始化随机森林
rf = RandomForestClassifier(
n_estimators=100,
max_depth=5,
class_weight='balanced', # 处理数据不平衡
random_state=42
)
# 训练模型
rf.fit(X_train, y_train)
# 模型评估
print("\n随机森林性能评估:")
print(classification_report(y_test, rf.predict(X_test)))
print(f"AUC得分:{roc_auc_score(y_test, rf.predict_proba(X_test)[:,1]):.2f}")
6. 关键特征解析
# 获取特征重要性
feature_importance = pd.Series(rf.feature_importances_, index=X.columns)
feature_importance = feature_importance.sort_values(ascending=False)
# 可视化特征重要性
plt.figure(figsize=(10,6))
sns.barplot(x=feature_importance, y=feature_importance.index)
plt.title('特征重要性排序')
plt.xlabel('重要性得分')
四、分析结论与业务洞见
-
关键离职驱动因素
- 员工满意度与离职率呈强负相关(相关系数-0.39)
- 高绩效员工离职呈现双峰现象(满意度分布分析)
- 月均工时超过250小时的员工离职风险显著增加
-
模型表现对比
模型 准确率 召回率 AUC 决策树 0.97 0.95 0.96 随机森林 0.98 0.98 0.99 -
业务建议
- 建立满意度实时监测系统
- 优化高绩效员工的工作强度分配
- 对司龄3-5年的员工加强关怀计划
五、优化方向与思考
-
模型优化
- 尝试XGBoost、LightGBM等梯度提升算法
- 使用SMOTE等过采样技术处理数据不平衡
-
特征工程
- 构建交叉特征(如:满意度*绩效评分)
- 添加时间序列特征(历史行为数据)
-
部署应用
- 开发可视化预警看板
- 集成到HR系统实现实时预测