DataCastle 员工离职预测 Baseline

2024-02-04 22:20

本文主要是介绍DataCastle 员工离职预测 Baseline,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


本文目录

    • 比赛介绍
      • 比赛链接
      • 赛题描述
      • 评分标准
    • 比赛数据
      • 数据下载
      • 数据说明
    • Baseline
      • 导包
      • 数据读取
      • 数据缺失状况
      • 样本标签是否均衡
      • 打印类别特征
      • 类别特征编码
      • 特征衍生
      • 数据标准化
      • 数据降维
      • 特征选择
      • 不均衡样本处理
      • 模型调参
        • XGBoost
        • LightGBM
        • CatBoost
      • 模型融合
      • 伪标签
      • 重新训练并预测结果
      • 线上得分


比赛介绍

比赛链接

DataCastle 员工离职预测:https://challenge.datacastle.cn/v3/cmptDetail.html?id=342

赛题描述

给定影响员工离职的因素和员工是否离职的记录,建立模型预测有可能离职的员工。

评分标准

评分算法为准确率,准确率越高,说明正确预测出离职员工与留职员工的效果越好。

评分算法参考代码如下:

from sklearn.metrics import accuracy_score
y_true = [1, 0, 1, 0]
y_pred = [1, 1, 1, 0]
score = accuracy_score(y_true, y_pred)

比赛数据

数据下载

百度网盘:https://pan.baidu.com/share/init?surl=UjkKggnWQMIBhrU1vPm1sw&pwd=99gu

数据说明

数据主要包括影响员工离职的各种因素工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等. 以及员工是否已经离职的对应记录。

数据分为训练数据和测试数据,分别保存在 train.csvtest_noLabel.csv 两个文件中,字段说明如下:

  1. Age:员工年龄
  2. Label:员工是否已经离职,1 表示已经离职,2 表示未离职,这是目标预测值;
  3. BusinessTravel:商务差旅频率,Non-Travel 表示不出差,Travel_Rarely 表示不经常出差,Travel_Frequently 表示经常出差;
  4. Department:员工所在部门,Sales 表示销售部,Research & Development 表示研发部,Human Resources 表示人力资源部;
  5. DistanceFromHome:公司跟家庭住址的距离,从 1 到 29,1 表示最近,29 表示最远;
  6. Education:员工的教育程度,从 1 到 5,5 表示教育程度最高;
  7. EducationField:员工所学习的专业领域,Life Sciences 表示生命科学,Medical 表示医疗,Marketing 表示市场营销,Technical Degree 表示技术学位,Human Resources 表示人力资源,Other 表示其他;
  8. EmployeeNumber:员工号码;
  9. EnvironmentSatisfaction:员工对于工作环境的满意程度,从 1 到 4,1 的满意程度最低,4 的满意程度最高;
  10. Gender:员工性别,Male 表示男性,Female 表示女性;
  11. JobInvolvement:员工工作投入度,从 1 到 4,1 为投入度最低,4 为投入度最高;
  12. JobLevel:职业级别,从 1 到 5,1 为最低级别,5 为最高级别;
  13. JobRole:工作角色:Sales Executive 是销售主管,Research Scientist 是科学研究员,Laboratory Technician 实验室技术员,Manufacturing Director 是制造总监,Healthcare Representative 是医疗代表,Manager 是经理,Sales Representative 是销售代表,Research Director 是研究总监,Human Resources 是人力资源;
  14. JobSatisfaction:工作满意度,从 1 到 4,1 代表满意程度最低,4 代表满意程度最高;
  15. MaritalStatus:员工婚姻状况,Single 代表单身,Married 代表已婚,Divorced 代表离婚;
  16. MonthlyIncome:员工月收入,范围在 1009 到 19999 之间;
  17. NumCompaniesWorked:员工曾经工作过的公司数;
  18. Over18:年龄是否超过 18 岁;
  19. OverTime:是否加班,Yes 表示加班,No 表示不加班;
  20. PercentSalaryHike:工资提高的百分比;
  21. PerformanceRating:绩效评估;
  22. RelationshipSatisfaction:关系满意度,从 1 到 4,1 表示满意度最低,4 表示满意度最高;
  23. StandardHours:标准工时;
  24. StockOptionLevel:股票期权水平;
  25. TotalWorkingYears:总工龄;
  26. TrainingTimesLastYear:上一年的培训时长,从 0 到6,0 表示没有培训,6 表示培训时间最长;
  27. WorkLifeBalance:工作与生活平衡程度,从 1 到 4,1 表示平衡程度最低,4 表示平衡程度最高;
  28. YearsAtCompany:在目前公司工作年数;
  29. YearsInCurrentRole:在目前工作职责的工作年数;
  30. YearsSinceLastPromotion:距离上次升职时长
  31. YearsWithCurrManager:跟目前的管理者共事年数;

测试数据主要包括 350 条记录,跟训练数据的不同是测试数据并不包括员工是否已经离职的记录,学员需要通过由训练数据所建立的模型以及所给的测试数据,得出测试数据相应的员工是否已经离职的预测。

注:比赛所用到的数据取自于 IBM Watson Analytics 分析平台分享的样例数据。我们只选取了其中的子集,并对数据做了一些预处理使数据更加符合逻辑回归分析比赛的要求。

Baseline

导包

import warnings
warnings.filterwarnings("ignore")import random
import numpy as np
import pandas as pdfrom imblearn.over_sampling import SMOTE
from category_encoders import OrdinalEncoder, BinaryEncoderfrom sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.feature_selection import VarianceThreshold
from sklearn.ensemble import StackingClassifierfrom xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifierseed = 1
random.seed(seed)
np.random.seed(seed)

数据读取

# 加载数据
df = pd.read_csv("./employee_leave/train.csv", index_col=0)
X_test = pd.read_csv("./employee_leave/test_noLabel.csv", index_col=0)X = df.drop(columns="Label")
y = df["Label"].copy()

数据缺失状况

# 数据是否缺失
print(df.isnull().sum().sum(), X_test.isnull().sum().sum())
# 输出:0 0

样本标签是否均衡

# 样本标签是否均衡
y.value_counts()
# 输出:
# Label
# 0    922
# 1    178
# Name: count, dtype: int64

打印类别特征

# 类别特征
cat_cols = set(X.select_dtypes(include="object").columns)
print(cat_cols)
# 输出:{'BusinessTravel', 'MaritalStatus', 'OverTime', 'JobRole', 'Over18', 'Department', 'EducationField', 'Gender'}

类别特征编码

# 对 BusinessTravel 进行顺序编码
encoder_map = {"Non-Travel": 0, "Travel_Rarely": 1, "Travel_Frequently": 2}
X["BusinessTravel"] = X["BusinessTravel"].map(encoder_map)
X_test["BusinessTravel"] = X_test["BusinessTravel"].map(encoder_map)# 对性别、是否加班、年龄是否超过 18 岁进行顺序编码
ord_cols = {"Gender", "OverTime", "Over18"}
encoder = OrdinalEncoder(cols=ord_cols)
X = encoder.fit_transform(X)
X_test = encoder.transform(X_test)# 对其他类别特征进行二进制编码
bin_cols = cat_cols - ord_cols - {"BusinessTravel"}
encoder = BinaryEncoder(cols=bin_cols)
X = encoder.fit_transform(X)
X_test = encoder.transform(X_test)

特征衍生

# 特征衍生
pass

数据标准化

# 数据标准化
scaler = StandardScaler()
X = pd.DataFrame(scaler.fit_transform(X), index=X.index)
X_test = pd.DataFrame(scaler.transform(X_test), index=X_test.index)

数据降维

# 数据降维
pca = PCA(n_components=0.95)
X = pd.DataFrame(pca.fit_transform(X), index=X.index)
X_test = pd.DataFrame(pca.transform(X_test), index=X_test.index)

特征选择

# 特征选择
selector = VarianceThreshold(threshold=0.01).fit(X)
X = pd.DataFrame(selector.transform(X), index=X.index)
X_test = pd.DataFrame(selector.transform(X_test), index=X_test.index)

不均衡样本处理

# 对训练数据进行 SMOTE 过采样
sampler = SMOTE(random_state=seed)
X, y = sampler.fit_resample(X, y)
print(X.shape, y.shape)
# 输出:(1844, 35) (1844,)

模型调参

XGBoost
xgb = XGBClassifier(random_state=seed)param_grid = {"n_estimators": [300],"max_depth": [4],"min_child_weight": [1],"gamma": [0.1],"subsample": [0.8],"colsample_bytree": [0.2],"regalpha": [0],"reglambda": [0],"learning_rate": [0.1],
}grid_search = GridSearchCV(xgb, param_grid, cv=5, scoring="accuracy", n_jobs=-1, verbose=1)
grid_search.fit(X, y)xgb_params = grid_search.best_params_
print(xgb_params)
print(grid_search.best_score_)
# 输出:
# Fitting 5 folds for each of 1 candidates, totalling 5 fits
# {'colsample_bytree': 0.2, 'gamma': 0.1, 'learning_rate': 0.1, 'max_depth': 4, 'min_child_weight': 1, 'n_estimators': 300, 'regalpha': 0, 'reglambda': 0, 'subsample': 0.8}
# 0.8932102038411689
LightGBM
lgb = LGBMClassifier(random_state=seed, verbose=-1)param_grid = {"n_estimators": [300],"max_depth": [9],"num_leaves": [52],"max_bin": [100],"min_data_in_leaf": [3],"feature_fraction": [0.7],"bagging_fraction": [0.8],"bagging_freq": [2],"lambda_l1": [0],"lambda_l2": [0],"min_split_gain": [0],"learning_rate": [0.1],
}grid_search = GridSearchCV(lgb, param_grid, cv=5, scoring="accuracy", n_jobs=-1, verbose=1)
grid_search.fit(X, y)lgb_params = grid_search.best_params_
print(lgb_params)
print(grid_search.best_score_)
# 输出:
# Fitting 5 folds for each of 1 candidates, totalling 5 fits
# {'bagging_fraction': 0.8, 'bagging_freq': 2, 'feature_fraction': 0.7, 'lambda_l1': 0, 'lambda_l2': 0, 'learning_rate': 0.1, 'max_bin': 100, 'max_depth': 9, 'min_data_in_leaf': 3, 'min_split_gain': 0, 'n_estimators': 300, 'num_leaves': 52}
# 0.9105573229645341
CatBoost
cat = CatBoostClassifier(random_state=seed, verbose=0)param_grid = {"n_estimators": [300],"depth": [9],"rsm": [0.8],"l2_leaf_reg": [1],"learning_rate": [0.1],
}grid_search = GridSearchCV(cat, param_grid, cv=5, scoring="accuracy", n_jobs=-1, verbose=1)
grid_search.fit(X, y)cat_params = grid_search.best_params_
print(cat_params)
print(grid_search.best_score_)
# 输出:
# Fitting 5 folds for each of 1 candidates, totalling 5 fits
# {'depth': 9, 'l2_leaf_reg': 1, 'learning_rate': 0.1, 'n_estimators': 300, 'rsm': 0.8}
# 0.9219350182632262

模型融合

stacking = StackingClassifier(estimators=[("xgb", XGBClassifier(random_state=seed, **xgb_params)),("lgb", LGBMClassifier(random_state=seed, verbose=-1, **lgb_params)),("cat", CatBoostClassifier(random_state=seed, verbose=0, **cat_params)),],cv=5,n_jobs=-1,
)stacking.fit(X, y)y_pred = pd.Series(stacking.predict(X_test), index=X_test.index, name="Label")
prob = pd.DataFrame(stacking.predict_proba(X_test), index=X_test.index, columns=stacking.classes_)
prob.head()

伪标签

# 伪标签
idx_pseudo = prob[prob.max(axis=1) > 0.9].index
X_pesudo = X_test.loc[idx_pseudo]
y_pesudo = y_pred[idx_pseudo]X_new = pd.concat([X, X_pesudo])
y_new = pd.concat([y, y_pesudo])
print(X_new.shape, y_new.shape)
# 输出:(2123, 35) (2123,)

重新训练并预测结果

stacking.fit(X_new, y_new)y_pred = pd.Series(stacking.predict(X_test), index=X_test.index, name="Label")submission = y_pred.to_frame()
submission.to_csv("submission.csv")
submission.head()

线上得分

线上得分: 0.8714

这篇关于DataCastle 员工离职预测 Baseline的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678971

相关文章

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频)

这是什么系统? 获取资料方式在最下方 java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频) 企业员工信息管理系统旨在为公司提供高效的员工信息管理解决方案。该系统的核心功能涵盖密码修改、员工管理、部门管理、出勤管理、工资管理、请假审核等方面,帮助企业优化人力资源管理流程。系统结构如下: (1)前端(员工端): 1.密码修改:员工可以修改自己的密码,提升账户的安全

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

如何限制与管控员工上网行为?四个方法让员工效率倍增!【企业员工上网行为管理】

在信息化时代,员工的上网行为直接影响着工作效率和企业的安全性。不当的网络使用,如浏览与工作无关的网站、下载不安全的文件,可能导致工作效率低下,甚至引发安全风险。因此,许多企业正在积极寻找有效的措施来管控员工的上网行为,以确保工作效率的提升。 以下是四个常见且有效的员工上网行为管理方法,帮助企业实现更高效的网络管理。 方法一:配置网络防火墙进行访问限制 最基础的员工上网行为管理方法是通过配置防

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测

多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测 目录 多维时序 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多变量时间序列预测(完整源码和数据) 2.SS

力扣 | 递归 | 区间上的动态规划 | 486. 预测赢家

文章目录 一、递归二、区间动态规划 LeetCode:486. 预测赢家 一、递归 注意到本题数据范围为 1 < = n < = 20 1<=n<=20 1<=n<=20,因此可以使用递归枚举选择方式,时间复杂度为 2 20 = 1024 ∗ 1024 = 1048576 = 1.05 × 1 0 6 2^{20} = 1024*1024=1048576=1.05 × 10^

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型 程序设计参考资料致谢 预测效果 Matlab实现PSO-LSTM多变量回归预测 1.input和outpu

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积