人才流失预测项目

news2024/11/26 15:38:41

在本项目中,通过数据科学和AI的方法,分析挖掘人力资源流失问题,并基于机器学习构建解决问题的方法,并且,我们通过对AI模型的反向解释,可以深入理解导致人员流失的主要因素,HR部门也可以根据分析做出正确的决定。

探索性数据分析

在这里插入图片描述

##1.数据加载

import pandas as pd
import seaborn as sns
data = pd.read_csv('../data/train.csv')
#分析建模,查看数据情况,1.数据包含数值型和类别型
data

在这里插入图片描述

查看数据基本信息

#字段,类型,缺失情况
data.info()
data.info() 来获取数据的信息,包括总行数(样本数)和总列数(字段数)、变量的数据类型、数据集中非缺失的数量以及内存使用情况。
从数据集的信息可以看出,一共有31 个特征,Attrition 是目标字段,23个变量是整数类型变量,8个是对象类型变量。
在这里插入图片描述

2.数据基本分析

#数据无缺失值,查看数据分布
data.describe()

在这里插入图片描述

跑baseline模型(使用不同的分类算法)

对特征不进行处理

# 选出数值型特征
numerical_feat = data.select_dtypes(include=['int64'])
numerical_feat
# 切分特征和标签
X = numerical_feat.drop(['Attrition'],axis=1)
Y = numerical_feat.Attrition
# 特征幅度缩放
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(X)
x_scaled = pd.DataFrame(x_scaled, columns=X.columns)
x_scaled
# 第一次跑模型
## 训练集测试集切分
from sklearn.model_selection import train_test_split
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
import xgboost as xgb
import lightgbm as lgb

 
X_train, X_test, Y_train, Y_test  = train_test_split(x_scaled,Y,test_size=0.3,random_state=1)
# 决策树
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train, Y_train)
dt_auc = roc_auc_score(Y_test, dt_clf.predict_proba(X_test)[:, 1])

# 逻辑回归
lr_clf = LogisticRegression()
lr_clf.fit(X_train, Y_train)
lr_auc = roc_auc_score(Y_test, lr_clf.predict_proba(X_test)[:, 1])

# 随机森林
rf_clf = RandomForestClassifier()
rf_clf.fit(X_train, Y_train)
rf_auc = roc_auc_score(Y_test, rf_clf.predict_proba(X_test)[:, 1])

# 集成学习 - 梯度提升
gb_clf = GradientBoostingClassifier()
gb_clf.fit(X_train, Y_train)
gb_auc = roc_auc_score(Y_test, gb_clf.predict_proba(X_test)[:, 1])

#XGBoost
xgb_clf = xgb.XGBClassifier(eval_metric="auc")
xgb_clf.fit(X_train, Y_train)
xgb_auc = roc_auc_score(Y_test, xgb_clf.predict_proba(X_test)[:, 1])

#LightGBM
lgb_clf = lgb.LGBMClassifier()
lgb_clf.fit(X_train, Y_train)
lgb_auc = roc_auc_score(Y_test, lgb_clf.predict_proba(X_test)[:, 1])

# 打印AUC值
print(f"Decision Tree AUC: {dt_auc}")
print(f"Logistic Regression AUC: {lr_auc}")
print(f"Random Forest AUC: {rf_auc}")
print(f"Gradient Boosting AUC: {gb_auc}")
print(f"XGBoost AUC: {xgb_auc}")
print(f"LightGBM AUC: {lgb_auc}")

在这里插入图片描述

3.特征工程

人才流失中,更多的是做特征选择

尝试编码

# 按照出差的频度进行编码
data.BusinessTravel = data.BusinessTravel.replace({
                        'Non-Travel':0,'Travel_Rarely':1,'Travel_Frequently':2
                        })
 
# 性别与overtime编码
data.Gender = data.Gender.replace({'Male':1,'Female':0})
data.OverTime = data.OverTime.replace({'Yes':1,'No':0})
data.Over18 =data.Over18.replace({'Y':1,'N':0})
# 独热向量编码  
new_df = pd.get_dummies(data=data,columns=['Department','EducationField','JobRole', 'MaritalStatus'])
new_df

# 切分特征和标签
X = new_df.drop(['Attrition'],axis=1)
Y = new_df.Attrition
# 特征幅度缩放
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(X)
x_scaled = pd.DataFrame(x_scaled, columns=X.columns)
# 决策树
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train, Y_train)
dt_auc = roc_auc_score(Y_test, dt_clf.predict_proba(X_test)[:, 1])

# 逻辑回归
lr_clf = LogisticRegression()
lr_clf.fit(X_train, Y_train)
lr_auc = roc_auc_score(Y_test, lr_clf.predict_proba(X_test)[:, 1])

# 随机森林
rf_clf = RandomForestClassifier()
rf_clf.fit(X_train, Y_train)
rf_auc = roc_auc_score(Y_test, rf_clf.predict_proba(X_test)[:, 1])

# 集成学习 - 梯度提升
gb_clf = GradientBoostingClassifier()
gb_clf.fit(X_train, Y_train)
gb_auc = roc_auc_score(Y_test, gb_clf.predict_proba(X_test)[:, 1])

#XGBoost
xgb_clf = xgb.XGBClassifier(eval_metric="auc")
xgb_clf.fit(X_train, Y_train)
xgb_auc = roc_auc_score(Y_test, xgb_clf.predict_proba(X_test)[:, 1])

#LightGBM
lgb_clf = lgb.LGBMClassifier()
lgb_clf.fit(X_train, Y_train)
lgb_auc = roc_auc_score(Y_test, lgb_clf.predict_proba(X_test)[:, 1])

# 打印AUC值
print(f"Decision Tree AUC: {dt_auc}")
print(f"Logistic Regression AUC: {lr_auc}")
print(f"Random Forest AUC: {rf_auc}")
print(f"Gradient Boosting AUC: {gb_auc}")
print(f"XGBoost AUC: {xgb_auc}")
print(f"LightGBM AUC: {lgb_auc}")


在这里插入图片描述
并没有明显提高

特征筛选,选出对模型贡献度大的特征

## 训练集测试集切分
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import mutual_info_classif
X_train, X_test, Y_train, Y_test  = train_test_split(x_scaled,Y,test_size=0.3,random_state=1)
mutual_info = pd.Series(mutual_info)
mutual_info.index = X_train.columns
mutual_info.sort_values(ascending=False)
 
plt.title("Feature Importance",fontsize=20)
mutual_info.sort_values().plot(kind='barh',figsize=(12,9),color='r')
plt.show()

在这里插入图片描述
剔除无效特征(后18位)

sorted_mutual_info = mutual_info.sort_values(ascending=False)
# 获取互信息值最低的18个特征的索引(列名)
least_important_feature_indices = sorted_mutual_info.tail(18).index

# 从new_df中删除这些特征
new_df = new_df.drop(columns=least_important_feature_indices)
new_df 

在这里插入图片描述

# 切分特征和标签
X = new_df.drop(['Attrition'],axis=1)
Y = new_df.Attrition
# 特征幅度缩放
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(X)
x_scaled = pd.DataFrame(x_scaled, columns=X.columns)
## 训练集测试集切分
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import mutual_info_classif
X_train, X_test, Y_train, Y_test  = train_test_split(x_scaled,Y,test_size=0.3,random_state=1)
# 定义模型列表
models = [
    ("Decision Tree", DecisionTreeClassifier()),
    ("Logistic Regression", LogisticRegression()),
    ("Random Forest", RandomForestClassifier()),
    ("Gradient Boosting", GradientBoostingClassifier()),
    ("XGBoost", xgb.XGBClassifier(eval_metric="auc")),
    ("LightGBM", lgb.LGBMClassifier())
]

# 训练模型并计算AUC
for name, model in models:
    model.fit(X_train, Y_train)
    pred_proba = model.predict_proba(X_test)[:, 1]
    auc = roc_auc_score(Y_test, pred_proba)
    print(f"{name} AUC: {auc}")

在这里插入图片描述
有了明显提高

做一些SMOTE

# SMOTE处理类别不均衡
from imblearn.over_sampling import SMOTE
sm = SMOTE(sampling_strategy='minority')
x,y = sm.fit_resample(X,Y)
# 过采样之后的比例
sns.countplot(data=new_df,x=y,palette='Set1')
plt.show()
print(y.value_counts())

在这里插入图片描述

# 特征幅度缩放
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)
x_scaled = pd.DataFrame(x_scaled, columns=x.columns)

## 训练集测试集切分
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import mutual_info_classif
X_train, X_test, Y_train, Y_test  = train_test_split(x_scaled,y,test_size=0.3,random_state=1)
# 定义模型列表
models = [
    ("Decision Tree", DecisionTreeClassifier()),
    ("Logistic Regression", LogisticRegression()),
    ("Random Forest", RandomForestClassifier()),
    ("Gradient Boosting", GradientBoostingClassifier()),
    ("XGBoost", xgb.XGBClassifier(eval_metric="auc")),
    ("LightGBM", lgb.LGBMClassifier())
]

# 训练模型并计算AUC
for name, model in models:
    model.fit(X_train, Y_train)
    pred_proba = model.predict_proba(X_test)[:, 1]
    auc = roc_auc_score(Y_test, pred_proba)
    print(f"{name} AUC: {auc}")

在这里插入图片描述
模型有了大幅度提高

LOF

from pyod.models.lof import LOF
train = new_df.copy()
val = new_df.copy()
#创建LOF对象
clf = LOF(n_neighbors=20, algorithm='auto')
# 切分特征和标签
X = train.drop(['Attrition'],axis=1)

#无监督学习算法,因此没有y,不需要传入y
clf.fit(X)

#模型预测
train['out_pred'] = clf.predict_proba(X)[:,1]
#随机给的一个93%分数数的一个参考值(93%是随便给的,不宜太小)
#判断依据:只要小于93%分位数的值,就说明这个样本是正常数据,如果大于93%分位数的值,则说明是异常数据
key = train['out_pred'].quantile(0.93)
#  'Attrition' 是目标变量列,我们不想将其包括在特征列表中
excluded_columns = ['Attrition']
# 获取所有列名,并将排除列从列表中移除
feature_lst = [col for col in new_df.columns.tolist() if col not in excluded_columns]
#获取用于模型训练的特征列
x = train[train['out_pred'] < key][feature_lst]
y = train[train['out_pred'] < key]['Attrition']

#准备验证集的x和y
x =train[feature_lst]
y = train['Attrition']
val_x = val[feature_lst]
val_y = val['Attrition']
#模型训练
lr_model = LogisticRegression(C=0.1,class_weight='balanced')
lr_model.fit(x,y)
from sklearn.metrics import roc_curve

#模型预测和画图
y_pred = lr_model.predict_proba(x)[:,1]
fpr_lr_train,tpr_lr_train,_ = roc_curve(y,y_pred)
train_ks = abs(fpr_lr_train - tpr_lr_train).max()
print('train_ks : ',train_ks)

y_pred = lr_model.predict_proba(val_x)[:,1]
fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred)
val_ks = abs(fpr_lr - tpr_lr).max()
print('val_ks : ',val_ks)

from matplotlib import pyplot as plt
plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR')
plt.plot(fpr_lr,tpr_lr,label = 'evl LR')
plt.plot([0,1],[0,1],'k--')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC Curve')
plt.legend(loc = 'best')
plt.show()

在这里插入图片描述

交叉验证和超参数调优

  • 网格搜索:模型针对具有一定范围值的超参数网格进行评估,尝试参数值的每种组合,并实验以找到最佳超参数,计算成本很高。
  • 随机搜索:这种方法评估模型的超参数值的随机组合以找到最佳参数,计算成本低于网格搜索。

from sklearn.metrics import roc_auc_score
from sklearn.model_selection import cross_val_score

# 定义模型列表
models = [
    ("Decision Tree", DecisionTreeClassifier()),
    ("Logistic Regression", LogisticRegression()),
    ("Random Forest", RandomForestClassifier()),
    ("Gradient Boosting", GradientBoostingClassifier()),
    ("XGBoost", xgb.XGBClassifier(eval_metric="auc")),
    ("LightGBM", lgb.LGBMClassifier())
]

# X_train, Y_train, X_test, Y_test是已经准备好的数据集
# X_scaled是经过标准化的特征数据集

# 训练模型并计算AUC
for name, model in models:
    model.fit(X_train, Y_train)
    pred_proba = model.predict_proba(X_test)[:, 1]
    auc = roc_auc_score(Y_test, pred_proba)
    print(f"{name} AUC: {auc}")

# 使用交叉验证查看得分
for name, model in models:
    print("******", name, "******")
    cv_scores = cross_val_score(model, x_scaled, y, cv=5, scoring='roc_auc')  # 使用roc_auc作为评分标准
    cv_mean = cv_scores.mean()
    print(f"Cross-validated AUC mean score: {cv_mean}")

在这里插入图片描述

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer, roc_auc_score

# 定义模型列表
models = [
    ("Decision Tree", DecisionTreeClassifier(), {'max_depth': [3, 5, 10]}),
    ("Logistic Regression", LogisticRegression(), {'C': [0.1, 1, 10]}),
    ("Random Forest", RandomForestClassifier(), {'n_estimators': [10, 50, 100]}),
    ("Gradient Boosting", GradientBoostingClassifier(), {'n_estimators': [50, 100, 200]}),
    ("XGBoost", xgb.XGBClassifier(eval_metric="auc"), {'n_estimators': [50, 100, 200]}),
    ("LightGBM", lgb.LGBMClassifier(), {'n_estimators': [50, 100, 200]})
]

# 使用网格搜索进行交叉验证
for name, model, params in models:
    print(f"Grid searching {name}...")
    grid_search = GridSearchCV(model, param_grid=params, cv=5, scoring='roc_auc')
    grid_search.fit(X_scaled, y)
    print(f"Best parameters for {name}: {grid_search.best_params_}")
    print(f"Cross-validated AUC mean score for {name}: {grid_search.best_score_}")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

备战秋招60天算法挑战,Day22

题目链接&#xff1a; https://leetcode.cn/problems/missing-number/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1HS42197Hc/ LeetCode 268.丢失的数字 题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组…

基于Python flask的岗位招聘数据分析系统,应用Python、Flask框架、Pyecharts、Wordcloud等技术

基于Python Flask的岗位招聘数据分析系统旨在为企业人力资源部门和求职者提供一个全面的数据分析平台&#xff0c;通过对招聘数据的深度挖掘和可视化展示&#xff0c;帮助用户做出更明智的决策。该系统采用了Python、Flask框架&#xff0c;并结合Pyecharts、Wordcloud等技术&am…

Matplotlib基本操作

1.什么是Matplotlib matplotlib 是一个广泛使用的 Python 图形库&#xff0c;用于生成静态、动态和交互式的可视化图表。它最初由 John D. Hunter 创建&#xff0c;并首次发布于2003年。matplotlib 提供了一个面向对象的 API&#xff0c;允许用户创建多种类型的图表&#xff0c…

[JavaScript版本五子棋小游戏]

目录 全部运行代码&#xff1a;五子棋游戏的基本步骤&#xff1a;代码剖析&#xff1a;1. 初始化游戏界面2. 管理游戏状态3. 玩家交互4. 电脑AI5. 胜负判定6. 游戏控制 本文通过实现一个基本的五子棋游戏&#xff0c;展示了如何使用HTML、CSS和JavaScript来构建一个简单的交互式…

ATGM332D-F8N低功耗、小尺寸单北斗多频定位导航模块规格书

ATGM332D-F8N主要 特征 &#xff1a; 1、多频点单北斗接收机 支持B1C独立定位通道数目&#xff1a;176通道支持北斗二号、北斗三号支持B1I、B1C、B2I、B3I、B2a、B2b 定位精度 单点定位精度&#xff1a;<1.0mCEP50推算定位误差&#xff1a;<3&#xff05;&#xff08;定位…

伦敦银行情的软件有什么选择?

普通投资者做伦敦银交易&#xff0c;多以技术分析为主、基本分析为辅的方法作为自己的交易策略&#xff0c;既然提到技术分析&#xff0c;那么伦敦银行情的软件就至关重要&#xff0c;因为我们需要通过这些软件才能看到行情并进行分析&#xff0c;那看伦敦银行情的软件有什么好…

2024.8.21

130124202408211006 DATE #:20240821 ITEM #:DOC WEEK #:WEDNESDAY DAIL #:捌月拾捌 TAGS < BGM "琴师--要不要买菜" > < theme oi-contest > < [NULL] > < [空] > < [空] > 此情可待成追忆&#xff0c;只是当时已惘然 -- 《锦瑟》…

「OC」视图控制器的懒加载策略

「OC」视图控制器的懒加载策略 文章目录 「OC」视图控制器的懒加载策略懒加载懒加载的优点常见的懒加载实现方法使用懒加载的注意事项 控制器的懒加载参考资料 懒加载 懒加载&#xff08;Lazy Loading&#xff09;是一种设计模式&#xff0c;其核心思想是在需要时才进行对象的…

Verilog刷题笔记55

题目&#xff1a; Exams/ece241 2014 q5a You are to design a one-input one-output serial 2’s complementer Moore state machine. The input (x) is a series of bits (one per clock cycle) beginning with the least-significant bit of the number, and the output (Z)…

更快更强,SLS 推出高性能 SPL 日志查询模式

作者&#xff1a;无哲 引言 随着数字化进程的持续深化&#xff0c;可观测性一直是近年来非常火热的话题&#xff0c;在可观测的三大支柱 Log/Trace/Metric 中&#xff0c;日志&#xff08;Log&#xff09;数据一般是最为常见的&#xff0c;企业迈向可观测性的第一步&#xff…

《黑神话:悟空》总销量已破 450 万份,总销售额超过15亿元,对于单机游戏来说,这一成绩意味着什么?

《黑神话&#xff1a;悟空》总销量突破450万份&#xff0c;总销售额超过15亿元&#xff0c;意味着几个关键点&#xff1a; 市场认可度高&#xff1a;这样的销量和销售额表明游戏受到了广泛的玩家欢迎&#xff0c;市场认可度极高。对于单机游戏而言&#xff0c;这代表了其在游戏…

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…

算法4:前缀和(下)

文章目录 和为K的子数组和可被k整除的子数组连续数组矩阵区域和 一定要看懂算法原理之后写代码&#xff0c;博主大概率因注意力不够&#xff0c;看了好多遍&#xff0c;才看懂原理细节。 切记&#xff0c;不彻底懂原理&#xff0c;千万别看代码 和为K的子数组 class Solution …

K8s部署安装

目录 一.K8s简介 1.Kubernetes 的关键概念 2.Kubernetes 的功能优势 3.节点&#xff08;Node&#xff09; 4.组件&#xff08;Component&#xff09; 二.Kubernetes集群架构 三.安装部署环境 1.初始化系统环境 2.安装容器引擎 3. 安装containerd 4.安装crictl工具 5…

鸿蒙(API 12 Beta3版)【DRM会话管理(C/C++)】数字版权保护开发

DRM会话管理&#xff08;MediaKeySession&#xff09;支持媒体密钥管理及媒体解密等&#xff0c;MediaKeySession实例由系统管理里的MediaKeySystem实例创建和销毁。 开发步骤 导入NDK接口&#xff0c;接口中提供了DRM相关的属性和方法&#xff0c;导入方法如下。 #include &…

YoloV8训练单通道数据方法+单通道Onnx模型转换

1. ultralytics/cfg/models/v8/yolov8-xxx.yaml 添加ch: 1 2. ultralytics/utils/checks.py 注释assert amp_allclose(YOLO("yolov8n.pt"), im) 3. ultralytics/nn/tasks.py 添加&#xff1a;batch[img] batch[img][:,:1,:,:] 4. ultralytics/nn/autobacken…

文件存储系统的总结

仪表试验报告整理技巧和反思 仪表调试报告技巧 目的&#xff1a;签字更顺利。报告依据、减少页数、正确率、工作量 表1/2 序号 目的 原因方法 降低签字页数 减少报告页数&#xff0c;增加回路测试类报告的每页信息容量 单元格高度&#xff1a;0.7cm&#xff1b;可以正…

ASP.NET Core 6.0 ServiceCollection 实现依赖注入

ASP.NET Core6 lOC容器 控制反转&#xff08;Inversion of Control, IoC&#xff09;是一种软件设计模式&#xff0c;其目的是降低代码之间的耦合度。在C#中&#xff0c;可以使用依赖注入&#xff08;Dependency Injection, DI&#xff09;来实现控制反转。 一般系统分为 UI …

将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解

1.首先,你将你的iso的文件按照正常的流程和需求安装到你的虚拟机中,我这里使用的是vmware,安装完成之后,关机。再次点开你安装好的那台虚拟机的窗口,如下图 选中要导出的镜像,镜像需要关机 2.点击工具栏的文件------选择 导出 整个工程到 ovf 格式—这里你可以选择你要导…

LearnOpenGL——SSAO学习笔记

LearnOpenGL——SSAO学习笔记 SSAO一、基本概念二、样本缓冲三、法向半球四、随机核心转动五、SSAO着色器六、环境遮蔽模糊七、应用SSAO遮蔽因子 SSAO 一、基本概念 环境光照是我们加入场景总体光照中的一个固定光照常量&#xff0c;它被用来模拟光的散射(Scattering)。散射应…