\1. The high rate of employee attrition can have significant implications for organizations, leading to increased recruitment and training costs, reduced productivity, and decreased employee morale. \2. It is crucial for companies to understand the underlying factors contributing to attrition and take proactive measures to address them.
\1. The objective of this project is to perform an Exploratory Data Analysis (EDA) on the IBM HR Analytics Employee Attrition & Performance dataset using Python. \2. The goal is to gain insights into the factors influencing employee attrition and performance within the organization. \3. By examining various features and conducting statistical analysis, we aim to identify patterns, trends, and potential areas for improvement that can help the company better understand and manage employee attrition and performance.
整体思路梳理:
01特征可视化
02新交互特征评估
03特征工程分析
04模型调整
05最终模型分析
ppt切换没有平滑特效时动画会失效
cluster_anal.py 聚类分析
kdeplot.py kdeplot图生成
注:
1.由于时间紧迫,多次试验修改代码时未能全部备份,可能图为中间过程生成,最终代码不包含
2.图例展示由AI生成,思路参考reference[1]
01和02仅用于简单评估,不参与最后的性能比较
enhanced_feature_engineering.py 增强特征全面分析
注:
1.效果不佳,最终模型未使用构建的交互语义特征
2.整体思路:构建强特征->三个不同参数组合xgb上验证->集成模型构建,评估加与不加特征
01_ofi_drop_smote.py 丢弃smote与rfecv
02_ofi_rfcv_to_xgb.py 用xgboost替换refcv的estimator
official.py 案例中的模型,为本项目的基线
-
可能的改进方向
-
如果你的主模型是树类(如XGBoost),风格:
-
- 保留稀疏独热、缺失值填充、 scale_pos_weight 。
- SelectKBest(chi2) 可用也可省略;树模型能在原始高维上工作良好。
- 建议取消 TruncatedSVD (对树模型通常不必要且可能损失可分信息)。
- 调参用 roc_auc ,最终训练用验证集早停并优化分类阈值。
-
如果你的主模型是线性类(LogisticRegression、线性SVM):
- 保持标准化与 log1p 缓解偏态。
- 用 RFECV 或 SelectFromModel 做特征选择。
- 不要对独热特征做标准化(或用 ColumnTransformer 仅缩放原始数值列)。
- 不平衡建议用 class_weight='balanced' 或使用 SMOTENC (而不是普通 SMOTE ,它能正确处理分类特征)。
- 评分用 roc_auc 或 f1 比 accuracy 更稳。
-
-
-
原因分析
- 纠正数据泄漏后指标“回归现实”:原流程(手工编码/缩放/SMOTE/RFECV在CV之外或在全量数据上拟合)会把测试信息泄漏到训练中,导致过高的测试准确率和AUC。移除 SMOTE 或把预处理放入 Pipeline 并在每折CV中独立拟合后,指标通常会下降到更可信的水平。
- 移除 SMOTE 后默认阈值不再合适:SMOTE提高了正类占比,默认阈值0.5下正类召回升高;去掉SMOTE后类别极不平衡,0.5阈值往往使模型更偏向负类,导致召回下降,准确率也可能下降(尤其当测试集正类比例高于训练集时)。
- RFECV替换/移除导致特征集和正则化方式变化:用逻辑回归的RFECV相当于对特征施加了较强的线性筛选与正则化;换成XGB或移除后,特征维度变大、稀疏特征增多,如果没有同步提高树模型的正则化(如 min_child_weight 、 gamma 、 reg_lambda 、 subsample 、 colsample_bytree ),泛化会变差。
- 超参未调优、无早停:当前 max_depth=8 , learning_rate=0.1 , n_estimators=200 在不平衡、稀疏独热特征下容易过拟合或欠拟合。没有 early_stopping_rounds 配合验证集,难以停在较优位置。
- 仅用 accuracy 做CV评分:在不平衡数据上, accuracy 偏向多数类,选出的参数或流程可能优化了负类精度而牺牲了正类识别,导致整体业务表现感受“下降”。建议看 balanced_accuracy 、 F1 、 ROC AUC 、 PR AUC 。
-
改进方向
-
查看训练/验证/测试的 accuracy 和 ROC AUC ,若训练高、测试低,说明过拟合(常见于高 max_depth +无早停)。加入正则
-
输出混淆矩阵与分类报告,关注正类 recall 与 precision 的变化;若移除SMOTE后 recall 显著下降,基本就是阈值问题。排除
-
画 ROC / PR 曲线,并在验证集上扫描阈值;若0.5远离最佳点,就需要阈值调优。无效
-
对比RFECV前后的特征数与XGB的 feature_importances_ 或 gain ,若噪声特征增多且正则较弱,泛化变差。
-
检查 scale_pos_weight 是否正确设置为 neg/pos ,以及是否在CV中生效;同时确认标签已经统一为0/1。 快速改进建议(最小改动)- 可采用
-
添加阈值调优(验证集):从训练中划出20%做验证,按 accuracy 或 balanced_accuracy 扫描阈值,选出最佳阈值用于测试集预测。通常能显著恢复准确率。效果不好
-
调整XGB正则化以替代RFECV的效果:已采用
- 将 max_depth 降到4–6,设定 min_child_weight 为3–5;
- 加 subsample 和 colsample_bytree 到0.7–0.9,提升随机性与鲁棒性;
- 设 reg_lambda 到1–5,必要时 gamma 到0–1。
-
用 eval_metric='auc' 并启用早停:将 n_estimators 设大一点(如500–1000),配合验证集 early_stopping_rounds=50 ,减少过拟合。
- 早停只能使用xgboost原生接口,model.fit()不提供早停接口
-
将CV评分改为 balanced_accuracy 或 roc_auc :比 accuracy 更稳健地选参数和流程。
-
如果必须保留特征筛选,务必在Pipeline里用 RFECV(estimator=XGBClassifier(...)) ,并把编码/缩放/采样纳入Pipeline,防止泄漏和模型错配。 常见情形对应处理
-
移除SMOTE后准确率降低但AUC提升:阈值未调优,优先做阈值调整。
-
替换RFECV为XGB后准确率下降:树的正则化不足;按上面的正则化组合微调。
-
只去掉RFECV准确率下降:之前RFECV起到了强正则化的作用;可换成 colsample_bytree / subsample + reg_lambda 来补。
-
F1.py K则交叉验证+网格搜索
f1_roc.py,f1_acc.py分别探究了scoring的区别(此处加强了正则化,数据列在性能对比表中)
01_best_performence.py
02_分箱.py 基线xgboost+lr
-
逻辑回归系数:
- 是什么:训练一个逻辑回归模型,查看每个数值特征的系数。
- 解读:系数的绝对值大小代表了该特征对预测标签的重要性。正系数表示该特征值增大会导致属于正类的概率增加,负系数则相反。
-
点二列相关:
- 是什么:是皮尔逊相关的一种特殊情况,用于衡量一个二分类变量和一个连续变量之间的相关性。
- 解读:与皮尔逊相关系数类似,取值范围也是
[-1, 1]。
-
Python实现(逻辑回归):
python
from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train[[‘numerical_feature’]], y_train) # 只用一个特征 importance = abs(model.coef_[0][0])
-
是什么:检验两个分类变量是否独立。通过比较观察频数和期望频数(即假设两者独立时的理论频数)的差异来判断。
-
解读:主要看p值。
p值 < 0.05:拒绝原假设,认为两个分类变量不独立,即它们之间存在相关性。
-
注意:卡方检验的结果只告诉你是否相关,但不表示相关性的强弱。为了衡量强弱,可以进一步计算:
- 克莱姆V系数:基于卡方统计量归一化后的值,范围在
[0, 1]之间,越大表示关联性越强。
- 克莱姆V系数:基于卡方统计量归一化后的值,范围在
-
Python实现:
python
from scipy.stats import chi2_contingency contingency_table = pd.crosstab(df['categorical_feature'], df['label']) chi2, p_value, dof, expected = chi2_contingency(contingency_table) # 计算克莱姆V系数 import numpy as np n = contingency_table.sum().sum() cramers_v = np.sqrt(chi2 / (n * (min(contingency_table.shape) - 1)))
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 点二列相关 | 数值特征 vs 二分类标签 | 专门设计,解释性好 | 只适用于二分类 |
| 斯皮尔曼相关 | 数值特征 vs 有序分类标签 | 非参数,稳健 | 对无序分类解释性差 |
| 互信息 | 任何数据类型组合 | 捕捉非线性关系,通用性强 | 计算成本较高 |
| 方差分析 | 数值特征 vs 多分类标签 | 检验组间差异 | 需要满足假设条件 |
| 卡方检验 | 分类特征 vs 分类标签 | 检验独立性 | 只给出是否相关,不给出方向 |
利用交叉验证在训练集内部对每一组超参数进行多次“模拟考试”,以得到一个可靠的平均性能分数,从而在不触及测试集的前提下,选出最有潜力的“选手”,最后再让这个选手在真正的“赛场”(测试集)上接受最终检验。
这意味着将scoring设置为accuracy并不能保证测试集准确率最高
- 过拟合风险(最主要原因)
网格搜索会选择在交叉验证上表现最好的参数,但这些参数可能在你的特定测试集上不是最优的。
- 数据分布的差异
- 训练集和测试集可能存在分布差异
- 交叉验证是在训练集内部进行的,可能无法完全代表测试集的特性
- 随机性的影响
==不建议在平常的训练中使用==:手动验证前n个最优选
先用 RandomizedSearchCV 缩小范围,再用 GridSearchCV 精细调优,在所有best_estimator中对测试机评分(model.score)
- 计算成本:这种方法需要训练更多模型,计算成本较高
- 数据泄露风险:严格来说这是在测试集上"调参",但在固定测试集的研究中是可接受的
- 结果稳定性:建议多次运行以确保结果的稳定性
xgboost+K则交叉验证+第二层逻辑回归
思考:
决策树在预测时,会为每个样本分配一个叶子节点索引,表示这个样本最终落到了树的哪个叶子。
- 在训练集上进行 K 折交叉验证。用训练数据训练 XGBoost 模型。
- 使用训练好的 XGBoost 模型对当前折叠的验证数据生成叶子节点索引(Out-Of-Fold, OOF)。
- 同时,使用训练好的 XGBoost 模型对 最终测试集 生成叶子节点索引,并累积这些预测。
- 独热编码 :对生成的叶子节点索引进行独热编码,将其转换为稀疏特征矩阵。
- 将叶子特征和原始特征拼接后作为逻辑回归的元学习器.
- 逻辑回归作为元学习器 :使用独热编码后的叶子节点特征训练逻辑回归模型。
- 模型评估 :在最终测试集上评估融合模型的性能。
| model | PRECISION | RECALL | F1-SCORE | ROC_AUC | ACCURACY |
|---|---|---|---|---|---|
| baseline | 0.87 | 0.88 | 0.87 | 0.8609 | 0.8829 |
| baseline_replace1[1] | 0.86 | 0.87 | 0.86 | 0.8601 | 0.8686 |
| baseline_replace3[2]/score='roc_auc' | 0.86 | 0.87 | 0.86 | 0.8485 | 0.8743 |
| baseline_replace3[2]/score='accuracy' | 0.87 | 0.88 | 0.87 | 0.8543 | 0.8800 |
[1]用scale_pos_weight替换smote,取消rfecv
[2]将RFECV优化器改为xgboost
| model(scoring='roc_auc') | PRECISION | RECALL | F1-SCORE | ROC_AUC | ACCURACY |
|---|---|---|---|---|---|
| baseline | 0.87 | 0.88 | 0.87 | 0.8609 | 0.8829 |
| baseline+StratifiedKFold+gridsearch[1] | 0.88 | 0.89 | 0.88 | 0.8654 | 0.8914 |
| [1]+Regularization->a),b) | 0.87 | 0.88 | 0.87 | 0.8583 | 0.8829 |
| our_best_perfermence | 0.89 | 0.90 | 0.88 | 0.8752 | 0.8971 |
| [1]+regular+logicregression | 0.88 | 0.89 | 0.88 | 0.8848 | 0.8914 |
a.)四个参数效果不符合直觉->发现过拟合:
| scoring | f1 | roc | accuracy | Train_acc/roc | Test_acc/roc |
|---|---|---|---|---|---|
| roc_auc | 0.88 | 0.8654 | 0.8914 | 1.0/1.0 | 0.8914/0.8654 |
| accuracy | 0.87 | 0.8614 | 0.8800 | 1.0/1.0 | 0.8800/0.8614 |
| balanced_accuracy | 0.87 | 0.8614 | 0.8800 | - | - |
| f1 | 0.87 | 0.8614 | 0.8800 | - | - |
b.)加入正则化:(展示图)
| scoring | f1 | roc | accuracy | Train_acc/roc | Test_acc/roc |
|---|---|---|---|---|---|
| roc_auc | 0.87 | 0.8583 | 0.8829 | 1.0/0.9989 | 0.8829/0.8583 |
| acc | 0.89 | 0.89 | 0.88 | 1.0/1.0 | 0.8943/0.8594 |
1.[IBM HR Analytics: Ensemble Approach](IBM HR Analytics: Ensemble Approach)
2.[IBM HR Analytics💼Employee Attrition & Performance](IBM HR Analytics💼Employee Attrition & Performance)