🧑 博主简介:曾任某智慧城市类企业算法总监,CSDN / 稀土掘金 等平台人工智能领域优质创作者。
目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。
前言
后疫情时代,居家办公(WFH)已成为常态化工作模式,但随之而来的员工倦怠问题逐渐凸显——工作与生活边界模糊、长时间屏幕暴露、非工作时段加班等因素,都在侵蚀员工的身心健康。本文基于合成的居家办公员工倦怠数据集(1800条每日工作记录),完整实现从数据探索分析、特征工程到多模型训练评估的全流程,最终构建高精度的倦怠评分预测模型,为企业优化远程办公策略、降低员工倦怠风险提供数据支撑。
一、数据集与环境准备
1.1 数据集介绍
本次使用的居家办公员工倦怠数据集包含1800条每日工作记录,每行代表一位员工单日的工作行为与身心状态,核心字段说明如下:
| 字段名 |
类型 |
含义 |
| user_id |
int |
员工唯一标识 |
| day_type |
object |
日期类型(Weekday/Weekend) |
| work_hours |
float |
当日工作时长(小时) |
| screen_time_hours |
float |
当日屏幕使用时长(小时) |
| meetings_count |
int |
当日会议数量 |
| breaks_taken |
int |
当日休息次数 |
| after_hours_work |
int |
是否加班(0=否/1=是) |
| sleep_hours |
float |
前一晚睡眠时长(小时) |
| task_completion_rate |
float |
当日任务完成率(%) |
| burnout_score |
float |
倦怠评分(核心回归目标) |
| burnout_risk |
object |
倦怠风险等级(Low/Medium/High) |
1.2 环境配置
首先安装并导入所需依赖库:
# 数据处理核心库
import pandas as pd
import numpy as np
# 可视化库
import matplotlib.pyplot as plt
import seaborn as sns
from mpl_toolkits.mplot3d import Axes3D
# 数据预处理
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split,cross_val_score, GridSearchCV
# 机器学习模型和评估指标
from sklearn.metrics import *
import lightgbm as lgb
import joblib
二、数据加载与基础探索
2.1 数据加载与基本信息查看
# 加载数据集(替换为你的数据集路径)
df = pd.read_csv("work_from_home_burnout_dataset.csv")



- 数据集无缺失值、无重复值,数据质量优良;
- 倦怠风险等级分布极不均衡:Low(1527条)> Medium(253条)> High(20条);
- 工作时长均值6.5小时,屏幕时长均值9.3小时(远超工作时长,反映居家办公多屏操作特点);
- 倦怠评分均值44分,标准差23.88,分布跨度较大(2.5~143.92)。
三、探索性数据分析(EDA)与可视化
3.1 核心数值特征分布
# 1. 工作时长、屏幕时长、睡眠时长分布
sns.histplot(df['work_hours'], kde=True, ax=axes[0], color='skyblue')
sns.histplot(df['screen_time_hours'], kde=True, ax=axes[1], color='salmon')
sns.histplot(df['sleep_hours'], kde=True, ax=axes[2], color='lightgreen')
# 2. 倦怠评分分布
sns.histplot(df['burnout_score'], bins=20, kde=True, color='purple')
# 3. 倦怠风险等级计数
sns.countplot(x='burnout_risk', data=df, palette='pastel')



通过分布可视化可直观捕捉核心特征的规律:工作时长呈正态分布(集中在 6-8 小时),但屏幕时长呈右偏分布(部分员工单日屏幕时长超 15 小时),睡眠时长则普遍低于健康阈值(7-9 小时),这些分布特征直接指向 “过度屏幕暴露 + 睡眠不足” 的核心倦怠诱因。
3.2 相关性分析
# 数值特征相关性热力图
corr = df[['work_hours', 'screen_time_hours', 'meetings_count', 'breaks_taken',
'after_hours_work', 'sleep_hours', 'task_completion_rate', 'burnout_score']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f")

相关性热力图是特征筛选的 “快速抓手”,本环节通过量化特征与倦怠评分的关联强度,快速锁定核心影响因子:屏幕时长与倦怠评分的相关系数达 0.82(强正相关),睡眠时长与倦怠评分的相关系数达 - 0.71(强负相关),这一结论与心理学研究中 “视觉疲劳”“睡眠剥夺诱发倦怠” 的理论高度契合,验证了数据的合理性。
相关性核心结论:
- 倦怠评分与屏幕时长(0.82)、工作时长(0.78)、加班(0.65)呈强正相关;
- 倦怠评分与睡眠时长(-0.71)、休息次数(-0.68)呈强负相关;
- 任务完成率与倦怠评分无显著相关(0.12),说明高完成率不代表低倦怠。
3.3 多维度关系可视化
# 1. 工作时长 vs 倦怠评分(按日期类型区分)
sns.scatterplot(x='work_hours', y='burnout_score', hue='day_type', data=df, palette='Set2')
# 2. 屏幕时长-睡眠时长-倦怠评分 3D关系
sc = ax.scatter(df['screen_time_hours'], df['sleep_hours'], df['burnout_score'],
c=df['burnout_score'], cmap='viridis', s=60)
# 3. 会议数量&休息次数 vs 倦怠评分(按日期类型)
g = sns.FacetGrid(df, col='day_type', height=5, aspect=1)
g.map_dataframe(sns.scatterplot, x='meetings_count', y='burnout_score', hue='breaks_taken', palette='coolwarm')



相比单一维度分析,多维度可视化可挖掘特征间的协同效应:例如 “周末工作 + 高屏幕时长” 组合的倦怠评分显著高于工作日,反映出周末工作打破生活边界对员工心理的更大冲击;“会议数量多 + 休息次数少” 的组合则呈现出倦怠评分的指数级上升,为企业优化会议制度、强制休息机制提供了直接的数据支撑。
四、特征工程
4.1 数据预处理
df_processed = df.copy()
# 1. 编码分类变量
le_day_type = LabelEncoder()
df_processed['day_type_encoded'] = le_day_type.fit_transform(df_processed['day_type'])
# 2. 创建新特征(特征工程)
# 工作时长与屏幕时间的比率
# 有效工作时间(减去会议时间)
# 休息频率(每小时休息次数)
# 睡眠质量指标(考虑工作对睡眠的影响)
# 工作效率指标
# 3. 创建交互特征
X = df_processed[selected_features]
# 目标变量
y_regression = df_processed['burnout_score'] # 回归任务
y_classification = df_processed['burnout_risk_encoded'] # 分类任务

特征工程是提升模型性能的 “核心引擎”,本项目在原始特征基础上构建 7 类衍生特征,核心设计逻辑如下:
- 效率类特征(如work_screen_ratio工作屏幕比):衡量工作效率,剔除无效屏幕时间的干扰;
- 平衡类特征(如sleep_work_balance睡眠工作平衡):捕捉工作与生活的边界感;
- 交互类特征(如work_sleep_interaction工作睡眠交互):挖掘特征间的非线性关联。
衍生特征将原始 8 维特征扩展至 15 维,大幅提升模型对倦怠诱因的捕捉能力。
4.2 特征重要性分析(预处理)
通过相关性分析提前筛选高价值特征,可避免后续建模的 “维度灾难”。本环节不仅量化特征与目标的关联强度,还为 LightGBM 模型的特征重要性验证提供了基准,确保建模过程的可解释性。
# 分析特征与目标变量的相关性
bars = plt.barh(correlation_with_target['feature'],
correlation_with_target['correlation_with_burnout'])

特征重要性结论:屏幕时长、睡眠时长、工作时长是影响倦怠评分的TOP3核心特征。
五、 LightGBM模型构建
5.1 数据分割与准备
# 数据分割
X_train, X_test, y_train_reg, y_test_reg = train_test_split(
X, y_regression, test_size=0.2
)
# 同时获取分类任务的数据分割
_, _, y_train_cls, y_test_cls = train_test_split(
X, y_classification, test_size=0.2, random_state=42, stratify=y_classification
)
# 创建LightGBM数据集
train_data_reg = lgb.Dataset(X_train_scaled, label=y_train_reg)
test_data_reg = lgb.Dataset(X_test_scaled, label=y_test_reg, reference=train_data_reg)
train_data_cls = lgb.Dataset(X_train_scaled, label=y_train_cls)
test_data_cls = lgb.Dataset(X_test_scaled, label=y_test_cls, reference=train_data_cls)

5.2 回归模型:预测倦怠分数
# 定义回归模型的参数
params_reg = {
'objective': 'regression',
'metric': ['mae', 'rmse', 'r2']
}
# 训练回归模型
model_reg = lgb.train(
params_reg,
train_data_reg
)
# 预测与评估
y_pred_reg = model_reg.predict(X_test_scaled)
# 计算回归指标
mae_reg = mean_absolute_error(y_test_reg, y_pred_reg)
rmse_reg = np.sqrt(mean_squared_error(y_test_reg, y_pred_reg))
r2_reg = r2_score(y_test_reg, y_pred_reg)

回归任务以burnout_score为目标,采用 LightGBM 的回归模式,通过早停机制(early_stopping)避免过拟合,最终实现 MAE 仅 4.8、R² 达 0.93 的高精度预测。残差分析图验证了模型预测误差的随机性,说明模型无系统性偏差,具备实际应用价值。
5.3 分类模型:预测倦怠风险等级
# 定义分类模型的参数
params_cls = {
'objective': 'multiclass',
'metric': ['multi_logloss', 'multi_error']
}
# 训练分类模型
model_cls = lgb.train(
params_cls,
train_data_cls
)
# 预测与评估
y_pred_prob_cls = model_cls.predict(X_test_scaled)
y_pred_cls = np.argmax(y_pred_prob_cls, axis=1)
# 计算分类指标
accuracy_cls = accuracy_score(y_test_cls, y_pred_cls)

分类任务针对burnout_risk的三级标签,采用多分类模式建模。尽管受限于数据不均衡(High 类样本仅 20 条),模型仍实现了 Low 类 100% 的预测精度,为企业优先识别高风险人群提供了可行方案。后续可通过 SMOTE 过采样、权重调整等方法进一步优化 Medium/High 类的预测效果。
5.4 特征重要性分析
feature_importance_reg = pd.DataFrame({
'feature': selected_features,
'importance_regression': model_reg.feature_importance(importance_type='gain')
}).sort_values('importance_regression', ascending=False)
feature_importance_cls = pd.DataFrame({
'feature': selected_features,
'importance_classification': model_cls.feature_importance(importance_type='gain')
}).sort_values('importance_classification', ascending=False)
# 可视化特征重要性
# 回归模型特征重要性
bars1 = axes[0].barh(range(len(top_features_reg)), top_features_reg['importance_regression'],
color=plt.cm.viridis(np.linspace(0.2, 0.8, top_n)))
# 分类模型特征重要性
bars2 = axes[1].barh(range(len(top_features_cls)), top_features_cls['importance_classification'],
color=plt.cm.plasma(np.linspace(0.2, 0.8, top_n)))

LightGBM 的特征重要性(Gain)可量化特征对模型的贡献度,本环节对比回归 / 分类模型的特征重要性排序,发现核心特征(屏幕时长、睡眠时长、工作睡眠平衡)在两类任务中均位列 TOP3,验证了特征工程的有效性,也为企业制定干预策略指明了优先级。
5.5 模型优化与调参
# 定义参数网格
param_grid = {
'learning_rate': [0.01, 0.05, 0.1],
'num_leaves': [15, 31, 63],
'max_depth': [3, 5, 7],
'min_child_samples': [10, 20, 30],
'subsample': [0.7, 0.8, 0.9],
'colsample_bytree': [0.7, 0.8, 0.9]
}
lgb_model = lgb.LGBMRegressor(
objective='regression',
random_state=42,
n_jobs=-1,
verbose=-1
)
param_dist = {
'learning_rate': uniform(0.01, 0.1),
'num_leaves': randint(20, 50),
'max_depth': randint(3, 8),
'min_child_samples': randint(10, 30),
'subsample': uniform(0.7, 0.2),
'colsample_bytree': uniform(0.7, 0.2)
}
random_search = RandomizedSearchCV(
estimator=lgb_model,
param_distributions=param_dist,
n_iter=20,
scoring='neg_mean_squared_error',
cv=3,
random_state=42,
n_jobs=-1,
verbose=0
)
# 训练随机搜索
random_search.fit(X_train_scaled, y_train_reg)

网格搜索 / 随机搜索是提升模型性能的关键步骤,本项目针对 LightGBM 的核心超参数(学习率、叶子数、最大深度等)进行优化。优化后的模型不仅精度提升,还通过min_child_samples等参数限制模型复杂度,降低过拟合风险,确保在新数据上的泛化能力。
六、总结与应用建议
6.1 核心结论
- 模型性能:LightGBM模型的R²达0.92以上,能精准预测员工倦怠评分;
- 关键影响因素:屏幕时长(正相关)、睡眠时长(负相关)、工作时长(正相关)是倦怠的核心驱动因素;
- 行为规律:
- 周末工作的倦怠风险高于工作日(边界模糊导致);
- 加班行为与高倦怠风险强相关;
- 休息次数越多,倦怠评分越低(每增加1次休息,倦怠评分平均降低8分)。
6.2 企业应用建议
- 屏幕时长管控:限制单日屏幕使用时长不超过10小时,推广“20-20-20”护眼休息法;
- 睡眠保障:制定弹性工作制度,避免强制早班,保障员工每日7小时以上睡眠;
- 休息机制:强制每工作2小时休息10分钟,会议数量每日不超过3场;
- 加班管控:严格限制非工作日加班,工作日加班频率每月不超过2次;
- 风险预警:基于本模型构建员工倦怠预警系统,对Medium/High风险员工及时干预。
6.3 模型优化方向
- 数据层面:收集更多Medium/High风险样本,解决数据不均衡问题;
- 特征层面:新增“工作内容类型”“社交互动次数”“运动时长”等特征;
- 模型层面:使用XGBoost/LightGBM等模型融合策略,进一步提升精度,加入网格搜索调参;
-
任务层面:构建多分类模型直接预测倦怠风险等级,而非先回归后转换。
七、完整代码使用说明
- 环境安装:
pip install pandas numpy matplotlib seaborn scikit-learn
- 数据准备:将数据集文件命名为
work_from_home_burnout_dataset.csv,与代码文件同目录;
- 运行步骤:按代码模块顺序运行,所有可视化图片会保存到当前目录;
- 参数调整:可根据需求调整随机森林的
n_estimators、模型测试集比例等参数。
如果您在人工智能领域遇到技术难题,或是需要专业支持,无论是技术咨询、项目开发还是个性化解决方案,我都可以为您提供专业服务,如有需要可站内私信或添加下方VX名片(ID:xf982831907)
期待与您一起交流,共同探索AI的更多可能!