人才流失预测模型(机器学习)

1. 项目描述

​ 企业的快速发展离不开人才的支撑,可是现在我国的企业的人才流失严重,人才流失问题现在已经成为了关系企业发展的一个重大的问题。这些企业要想在目前激烈的竞争中快速发展,就需要依靠自身的人力资源的来竞争。只有拥有比对方更强,更优秀,更具有创造力的人才,才能在竞争中取得优势。所以如何有效解决我国企业人才流失问题是一个很迫切的任务。人才流失已经成了很多企业正在面临的困境,关键人才的流程对企业的影响尤为明显。​ 无论在IT互联网领域还是传统领域、事业单位,均面临关键人才的流失,作为公司的核心的人力资源部门,我们需要把控员工的基本情况,对员工的情况进行实时监控和预测,人才流失模型从公司的角度和员工自身角度分别入手,阐释了在那些重要维度能够保持流失率的下降,常规的做法比如增强企业文化,提高薪资,提高年终奖等,通过模型给出人力资源部门一定的建议。

2. 技术说明

​ 项目通过公司内部人资资源系统数据,通过数据的基本ETL(数据清洗过滤和汇总)对数据进行基本的预处理,通过python的numpy、pandas、matplotlib和seaborn进行各维度数据分析,经过数据分析得到分类特征较好的特征数据,对数值型数据、类别型数据、有序性数据分别进行处理和分析,使用label encoder和one encoder分别对类别数据进行特征编码,处理组合后的数据特征后形成特征向量,通过Python的Scikit-learn机器学习库的机器学习算法寻找数据之间存在的关系,从而为公司人力资源及决策层提供信息建议及决策建议

3. 需求分析

1 分析各个维度的数据对人才流失的影响2 通过训练数据建立的模型以及所给的测试数据,构建人才流失模型,最终预测测试数据相应的员工是否已经离职(0未离职,1离职)。

4. 数据集描述

数据主要包括影响员工离职的各种因素(工资、出差、工作环境满意度、工作投入度、是否加班、是否升职、工资提升比例等)以及员工是否已经离职的对应记录。数据分为训练数据和测试数据,分别保存在train.csv和test.csv两个文件中。训练数据主要包括1100条记录,31个字段。* Attrition:员工是否已经离职,1表示已经离职,0表示未离职,这是目标预测值;
* Age:员工年龄
* BusinessTravel:商务差旅频率,Non-Travel表示不出差,Travel_Rarely表示不经常出差,							  Travel_Frequently表示经常出差;
* Department:员工所在部门,Sales表示销售部,Research & Development表示研发部,Human Resources表示人力资源部;
* DistanceFromHome:公司跟家庭住址的距离,从1到29,1表示最近,29表示最远;
* Education:员工的教育程度,从1到5,5表示教育程度最高;
* EducationField:员工所学习的专业领域,Life Sciences表示生命科学,Medical表示医疗,Marketing表示市场营销,Technical Degree表示技术学位,Human Resources表示人力资源,Other表示其他;
* EmployeeNumber:员工号码;
* EnvironmentSatisfaction:员工对于工作环境的满意程度,从1到4,1的满意程度最低,4的满意程度最高;
* Gender:员工性别,Male表示男性,Female表示女性;
* JobInvolvement:员工工作投入度,从1到4,1为投入度最低,4为投入度最高;
* JobLevel:职业级别,从1到5,1为最低级别,5为最高级别;
* JobRole:工作角色:Sales Executive是销售主管,Research Scientist是科学研究员,Laboratory Technician实验室技术员,Manufacturing Director是制造总监,Healthcare Representative是医疗代表,Manager是经理,Sales Representative是销售代表,Research Director是研究总监,Human Resources是人力资源;
* JobSatisfaction:工作满意度,从1到4,1代表满意程度最低,4代表满意程度最高;
* MaritalStatus:员工婚姻状况,Single代表单身,Married代表已婚,Divorced代表离婚;
* MonthlyIncome:员工月收入,范围在1009到19999之间;
* NumCompaniesWorked:员工曾经工作过的公司数;
* Over18:年龄是否超过18岁;
* OverTime:是否加班,Yes表示加班,No表示不加班;
* PercentSalaryHike:工资提高的百分比;
* PerformanceRating:绩效评估;
* RelationshipSatisfaction:关系满意度,从1到4,1表示满意度最低,4表示满意度最高;
* StandardHours:标准工时;
* StockOptionLevel:股票期权水平;
* TotalWorkingYears:总工龄;
* TrainingTimesLastYear:上一年的培训时长,从0到6,0表示没有培训,6表示培训时间最长;
* WorkLifeBalance:工作与生活平衡程度,从1到4,1表示平衡程度最低,4表示平衡程度最高;
* YearsAtCompany:在目前公司工作年数;
* YearsInCurrentRole:在目前工作职责的工作年数
* YearsSinceLastPromotion:距离上次升职时长
* YearsWithCurrManager:跟目前的管理者共事年数;

5. 开发流程详细描述:

5.1 人员组成和分工:

整体流程:王晓通 柯于辉 数据探索分析,特征处理: 张潇予,常春倩 初始模型: 刘冰冰,郑舒文,马毅景 优化模型:柯于辉,刘冰冰,郑舒文,马毅景 toad跑整个流程: 王晓通,计宇东 汇报: 柯于辉

5.1 数据获取(来源于公司内部的人力资源数据,通常没有缺失值的)
5.1.1 git项目描述

每个组一个总分支: group06: 用于最后合并汇报

组内每个人一个分支: group06_keyuhui, 用于自己个人开发.pull拉取group06分支结构

5.1.2 git项目结构:

# 1. 加载数据,shape,info,desc查看基本信息
data = pd.read_csv('../../data/raw/train.csv')
5.2 数据探索性分析
5.2.1 data.shape()结果

5.2.2 data.info()结果: 无空值情况,有object 需要转数值

 5.2.3 data.describe()结果: 暂时看不出异常,需要处理的地方

5.2.4 数据探索性分析结果:

通过以上shape,info,describe 查看结果: 无空值需要处理, 有object类型需要转数值类型,

其他暂时看不出需要处理之处.

5.3 数据预处理

接下来对object类型数据转数值, 通过分析这些object特征列

商务差旅频率,	员工所在部门,	员工所学习的专业领域,	Gender,
工作角色,员工婚姻状况,年龄是否超过18岁,是否加班,		

适合采用label encoder,标签编码

5.4 特征处理
5.4.1 对8个object特征进行 label encoder
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['BusinessTravel'] = le.fit_transform(data['BusinessTravel'])
data['Department'] = le.fit_transform(data['Department'])
data['EducationField'] = le.fit_transform(data['EducationField'])
data['Gender'] = le.fit_transform(data['Gender'])
data['JobRole'] = le.fit_transform(data['JobRole'])
data['MaritalStatus'] = le.fit_transform(data['MaritalStatus'])
data['Over18'] = le.fit_transform(data['Over18'])
data['OverTime'] = le.fit_transform(data['OverTime'])data.head()
5.4.2 转换后结果:

5.5 数据集的划分:使用20%部分作为测试集,80%作为训练集
x_train, x_test, y_train, y_test = train_test_split(data.drop('Attrition',axis=1), data['Attrition'], test_size=0.2, random_state=21)

 

5.6 模型训练:逻辑回归、决策树、随机森林等
5.6.1 逻辑回归: baseline 初始模型训练
# 6. baseline 初始模型训练: 逻辑回归
lr = LogisticRegression()
lr.fit(x_train, y_train)
# 7. 初始模型的AUC值
y_pred_lr = lr.predict_proba(x_test)[:,1]
print('初始模型的AUC值:',roc_auc_score(y_test, y_pred_lr))

 

5.6.2 决策树
# 6.2 决策树
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_dt = dt.predict_proba(x_test)[:,1]
print('初始模型决策树AUC值:',roc_auc_score(y_test, y_pred_dt))

5.6.3 随机森林
# 6.3 随机森林
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_rf = rf.predict_proba(x_test)[:,1]
print('初始模型随机森林AUC值:',roc_auc_score(y_test, y_pred_rf))

 

5.6.4 adaBoost
# 6.4 AdaBoost
from sklearn.ensemble import AdaBoostClassifier
mytree = DecisionTreeClassifier(criterion='entropy', max_depth=1, random_state=0)
myada = AdaBoostClassifier(estimator=mytree, n_estimators=500, learning_rate=0.1, random_state=0)
myada.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_myada = myada.predict_proba(x_test)[:,1]
print('初始模型AdaBoostAUC值:',roc_auc_score(y_test, y_pred_myada))

5.6.5 GBDT
# 6.5 DBDT 
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier()
gbdt.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_gbdt = gbdt.predict_proba(x_test)[:,1]
print('初始模型DBDTAUC值:',roc_auc_score(y_test, y_pred_gbdt))

 

5.6.6 xgboost 
5.6.7 lightGBM
# 6.6 lightGBM
from lightgbm import LGBMClassifier
# 创建lgb对象
lgbm =LGBMClassifier(boosting_type = 'gbdt',objective = 'binary',metric = 'auc',learning_rate = 0.3,n_estimators = 100,max_depth = 3,num_leaves = 20,max_bin = 45,min_data_in_leaf = 6,bagging_fraction = 0.6,bagging_freq = 0,feature_fraction = 0.8)
# 使用这个对象训练lgb模型
lgbm.fit(x_train,y_train,eval_set = [(x_train,y_train),(x_test,y_test)],eval_metric = 'auc')
# 7. 初始模型xgb的AUC值
y_pred_lgbm = lgbm.predict_proba(x_test)[:,1]
print('初始模型lgbm的AUC值:',roc_auc_score(y_test, y_pred_lgbm))

 

结果:初始模型lgbm的AUC值: 0.8018461538461539

5.6.8 对比以上几个模型结果:
模型逻辑回归AUC值: 0.7341538461538462
决策树AUC值: 0.6282051282051282
随机森林AUC值: 0.7871794871794872
AdaBoostAUC值: 0.7749743589743588
GBDTAUC值: 0.7928205128205129
xgb的AUC值: 0.7688205128205129
lgbm的AUC值: 0.8018461538461539

从上面挑选AUC值最高的几个模型做进一步优化: 随机森林,GBDT,xgboost,lightGBM

5.6.9 尝试对随机森林模型进行交叉网络搜索优化
# 6.7.1 随机森林 交叉验证网格搜索 进行模型训练和评估
from sklearn.model_selection import GridSearchCV
estimator = RandomForestClassifier()
param = {"n_estimators": [10, 20, 30, 40, 50, 60, 70], "max_depth": [2, 4, 6, 8, 10], "random_state": [9]}
grid_search = GridSearchCV(estimator, param_grid=param, cv=2)
grid_search.fit(x_train, y_train)
accuracy = grid_search.score(x_test, y_test)
print("随机森林网格搜索accuracy:", accuracy)
# 输出: RandomForestClassifier(max_depth=6, n_estimators=10, random_state=9)
# 就可以根据最优超参组合用模型
print(grid_search.best_estimator_)
# 上面得到最佳模型输出: RandomForestClassifier(max_depth=6, n_estimators=10, random_state=9)
# 6.7.2 根据交叉验证网格搜索 得到的超参组合,得到的模型来测试
rf_best = RandomForestClassifier(max_depth=6, n_estimators=10, random_state=9)
rf_best.fit(x_train, y_train)
y_pred_rf_best = rf_best.predict_proba(x_test)[:,1]
print('RandomForest 交叉验证网格搜索的AUC值:',roc_auc_score(y_test, y_pred_rf_best))

结果:RandomForest 交叉验证网格搜索的AUC值: 0.7132307692307693..

效果还更差,,可见是在训练集上更好,但测试集更差,,过拟合了. 不采用

5.7 模型校验:

模型准确率、召回率、精确率、F1值、ROC曲线(横轴:真正率TRP,纵轴:假正率FPR)-----通过曲线和x轴围城的面积衡量分类性能的好坏,曲线面积叫做AUC值---面积大小代表准确率大小---Roc-Auc曲线

5.7.1 使用验证数据集:
# 先随机森林
# 利用数据集test2.csv 来验证3个模型: 随机森林,GBDT,lightGBM
from sklearn.metrics import accuracy_score, precision_score,recall_score,f1_score,roc_auc_score
y_pred_rf = rf.predict_proba(x_val)[:,1]
# 模型准确率, 、ROC曲线
print('模型准确率',rf.score(x_val,y_val))
print('验证集随机森林AUC值:',roc_auc_score(y_val, y_pred_rf))
y_predict=rf.predict(x_val)
# 计算 召回率、精确率、F1值
print("随机森林的精确率:",precision_score(y_val,y_predict))
print("随机森林的召回率:",recall_score(y_val,y_predict))
print("随机森林的f1-score:",f1_score(y_val,y_predict))# 结果:
模型准确率 0.8714285714285714
验证集随机森林AUC值: 0.808461978273299
随机森林的精确率: 0.75
随机森林的召回率: 0.22641509433962265
随机森林的f1-score: 0.3478260869565218# 直接报告api输出:
from sklearn.metrics import classification_report
print("随机森林验证报告:",classification_report(y_val,y_predict))
随机森林验证报告:  precision    recall  f1-score   support0       0.88      0.99      0.93       2971       0.75      0.23      0.35        53accuracy                           0.87       350macro avg       0.81      0.61      0.64       350
weighted avg       0.86      0.87      0.84       350
# GBDT
y_pred_gdbt = gbdt.predict_proba(x_val)[:,1]
# 模型准确率, 、ROC曲线
print('GBDT模型准确率',gbdt.score(x_val,y_val))
print('验证集GBDT的AUC值:',roc_auc_score(y_val, y_pred_gdbt))
# 结果:
GBDT模型准确率 0.8742857142857143
验证集GBDT的AUC值: 0.7949939648052855
# 报告: 
y_predict=gbdt.predict(x_val)
print("随机森林验证报告:",classification_report(y_val,y_predict))
# 结果 
gbdt验证报告:    precision    recall  f1-score   support0       0.89      0.97      0.93       2971       0.66      0.36      0.46        53accuracy                           0.87       350macro avg       0.77      0.66      0.70       350
weighted avg       0.86      0.87      0.86       350
# xgboost
y_pred_xgb = xgb.predict_proba(x_val)[:,1]
# 模型准确率, 、ROC曲线
print('xgb模型准确率',xgb.score(x_val,y_val))
print('验证集xgb的AUC值:',roc_auc_score(y_val, y_pred_xgb))
# 结果:
xgb模型准确率 0.8514285714285714
验证集xgb的AUC值: 0.787497617686297
# 报告
y_predict=xgb.predict(x_val)
print("xgb验证报告:",classification_report(y_val,y_predict))
xgb验证报告:    precision    recall  f1-score   support0       0.88      0.96      0.92       2971       0.52      0.26      0.35        53accuracy                           0.85       350macro avg       0.70      0.61      0.63       350
weighted avg       0.82      0.85      0.83       350
# lightGBM
y_pred_lgbm = lgbm.predict_proba(x_val)[:,1]
# 模型准确率, 、ROC曲线
print('lgbm模型准确率',lgbm.score(x_val,y_val))
print('验证集lgbm的AUC值:',roc_auc_score(y_val, y_pred_lgbm))
# 结果:
lgbm模型准确率 0.86
验证集lgbm的AUC值: 0.7875611460517121
# 报告:
y_predict=lgbm.predict(x_val)
print("lgbm验证报告:",classification_report(y_val,y_predict))
lgbm验证报告:     precision    recall  f1-score   support0       0.89      0.95      0.92       2971       0.56      0.38      0.45        53accuracy                           0.86       350macro avg       0.73      0.66      0.68       350
weighted avg       0.84      0.86      0.85       350
5.7.2 验证集验证了4个模型:随机森林,GBDT,xgBoost,lightGBM

相差不明显,下一步处理样本.

5.8 处理过采样
5.8.1 用代价敏感class_weight = 'balanced' 调整样本系数重新训练随机森林,
# 训练集: x_train,y_train 1100 条,
# 测试集: x_val,y_val 350条
rf = RandomForestClassifier(class_weight = 'balanced')
rf.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_rf = rf.predict_proba(x_val)[:,1]
print('模型随机森林AUC值:',roc_auc_score(y_val, y_pred_rf))
# 结果:有较大提升(原AUC值:0.808461978273299)
# 输出结果:模型随机森林AUC值: 0.8227558604917096

下一步计算特征重要性,减少不重要特征.再训练验证

5.9 过采样后再次训练
5.9.1 用lightGBM 拟合计算特征重要性
def lgb_test(train_x,train_y,test_x,test_y):# 创建lgb对象lgbm =LGBMClassifier(boosting_type = 'gbdt',objective = 'binary',metric = 'auc',learning_rate = 0.3,n_estimators = 100,max_depth = 3,num_leaves = 20,max_bin = 45,min_data_in_leaf = 6,bagging_fraction = 0.6,bagging_freq = 0,feature_fraction = 0.8)# 使用这个对象训练lgb模型lgbm.fit(train_x,train_y,eval_set = [(train_x,train_y),(test_x,test_y)],eval_metric = 'auc')# 返回训练好的lgb模型, 返回最佳的分数return lgbm,lgbm.best_score_['valid_1']['auc']# 训练集: x_train,y_train 1100 条,
# 测试集: x_val,y_val 350条
model, auc = lgb_test(x_train,y_train,x_val,y_val)
# 计算特征重要性
feature_importance_df = pd.DataFrame({'name':model.booster_.feature_name(),'importance':model.feature_importances_}).set_index('name').sort_values(by='importance',ascending=False) # 为了方便后面结果的拼接, 这里把name 特征的名字作为行索引
feature_importance_df# 根据特征重要些结果: 先删除7个重要性很低的特征(值<10):
drop_columns=['Education','Gender','Department','JobLevel','Gender','Over18','StandardHours']
x_train= x_train.drop(columns=drop_columns,axis=1)
x_val=x_val.drop(columns=drop_columns,axis=1)
x_train
# 删除7个不重要特征重新训练验证模型
# 随机森林
# 代价敏感跑 逻辑回归
lr = LogisticRegression(C=0.1,class_weight = 'balanced')
lr.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_lr = lr.predict_proba(x_val)[:,1]
print('删除不重要特征后,模型逻辑回归AUC值:',roc_auc_score(y_val, y_pred_lr))# 结果: 模型逻辑回归AUC值: 0.7220634013086844
# 更低,不采用
# lightGBM
# lightGBM
lgbm =LGBMClassifier(boosting_type = 'gbdt',objective = 'binary',metric = 'auc',learning_rate = 0.3,n_estimators = 100,max_depth = 3,num_leaves = 20,max_bin = 45,min_data_in_leaf = 6,bagging_fraction = 0.6,bagging_freq = 0,feature_fraction = 0.8)
lgbm.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_lgbm = lgbm.predict_proba(x_val)[:,1]
print('删除不重要特征后,模型lightGBM的AUC值:',roc_auc_score(y_val, y_pred_lgbm))# 结果:删除不重要特征后,模型lightGBM的AUC值: 0.8073184676958262
# 相对于前值:0.7875611460517121  有提升
# GBDT
# 训练集: x_train,y_train 1100 条,
# 测试集: x_val,y_val 350条
gbdt = GradientBoostingClassifier()
gbdt.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_gbdt = gbdt.predict_proba(x_val)[:,1]
print('删除不重要特征后,模型DBDTAUC值:',roc_auc_score(y_val, y_pred_gbdt))# 结果:删除不重要特征后,模型DBDTAUC值: 0.8296169239565465
# 对比前值:0.7949939648052855  有较大提升
# GBDT
# 训练集: x_train,y_train 1100 条,
# 测试集: x_val,y_val 350条
gbdt = GradientBoostingClassifier()
gbdt.fit(x_train, y_train)
# 7. 初始模型决策树AUC值
y_pred_gbdt = gbdt.predict_proba(x_val)[:,1]
print('删除不重要特征后,模型DBDTAUC值:',roc_auc_score(y_val, y_pred_gbdt))# 结果:删除不重要特征后,模型DBDTAUC值: 0.8296169239565465
# 对比前值:0.7949939648052855  有较大提升
# xgBoost
xgb = XGBClassifier(n_estimators=100,eta=0.1,random_state=21)
xgb.fit(x_train, y_train)
# 7. 初始模型xgb的AUC值
y_pred_xgb = xgb.predict_proba(x_val)[:,1]
print('删除不重要特征后,xgb的AUC值:',roc_auc_score(y_val, y_pred_xgb))# 结果: 删除不重要特征后,xgb的AUC值: 0.8103678292357538
# 对比前值:0.787497617686297 有较大提升

下一步,查看样本平衡性..采用smote 平衡样本再训练验证

5.10 过采样后模型验证
5.10.1 查看样本的平衡情况
# 训练集: x_train,y_train 1100 条,
# 测试集: x_val,y_val 350条
y_train.value_counts()
# 结果:
0,922
1,178
y_val.value_counts()
# 结果:
0,297
1,53# 可见需要做样本平衡处理.
# 10.3 用lightGBM 预测每个样本概率,倒序排序
#调用函数,进行训练
lgb_model,lgb_auc  = lgb_test(x_train,y_train,x_val,y_val) 
#模型预测
sample = x_train.copy()
sample['bad_ind'] = y_train 
sample['pred'] = lgb_model.predict_proba(x_train)[:,1]  
#对预测结果进行降序排序,这样,排序后的结果中,预测为正样本(坏人)概率越大的越靠前
sample = sample.sort_values(by=['pred'],ascending=True).reset_index()  
sample['rank'] = sample.index.values/len(sample)  
sample
# 再对过滤后数据,smote 少量样本 k近邻插入终结者,,增加少量样本数..达到平衡
# 定义函数去掉预测值与实际值不符的部分
#x:真实的结果
#y:预测的结果
#过滤预测和真实的情况严重不相符的样本
#由于上述表格中,我们是按照pred降序排序,因此越往前,是正样本(坏人)的概率越大,但是实际上是负样本(好人),所以这部分的数据要排除,同理,越往后,是负样本(好人)的概率越大,但是实际上是正样本(坏人),这部分的数据也要排除。
def weight(x, y):# 真实标签为0,违约概率为所有样本中最高的10%if x == 0 and y < 0.1:return 0.1# 真实标签为1  违约概率为所有样本中最低的30%elif x == 1 and y > 0.7:return 0.1else:return 1sample['weight'] = sample.apply(lambda row:weight(row['bad_ind'],row['rank']),axis = 1)
sample
#把预测相对比较准的取出来进行过采样
# 结果里: 没有结果为0,weight == 1的情况,所以无需过滤,直接在原数据上smote
# smote_sample = sample[sample.weight == 1]
smote_sample = sample
smote_sample.shape# 输出结果: (1100, 29)
# 只保留需要训练的特征字段
train_x_smote = smote_sample.drop(columns=['bad_ind','pred','rank','weight'])
train_y_smote = smote_sample['bad_ind']
train_x_smote
# 创建smote过采样函数,进行过采样
from imblearn.over_sampling import SMOTE
def smote(train_x_smote,train_y_smote,K=15,random_state=0):smote = SMOTE(k_neighbors=K, n_jobs=1,random_state=random_state)#fit_resample,找K个邻居,然后进行过采样rex,rey = smote.fit_resample(train_x_smote,train_y_smote)return rex,rey
rex,rey =smote(train_x_smote,train_y_smote)#查看数据smote 前
train_y_smote.value_counts()# smote前结果:
# 0,922
# 1,178
rey.value_counts()
# smote 后结果
# 0,922
# 1,922
# 再次用smote后的训练数据集训练
# 利用smote后的数据集rex,rey 训练模型
x_train=rex.drop('index',axis=1)
y_train=rey
# 决策树
dt = DecisionTreeClassifier(class_weight = 'balanced')
dt.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_dt = dt.predict_proba(x_val)[:,1]
print('模型决策树AUC值:',roc_auc_score(y_val, y_pred_dt))# 结果输出: 模型决策树AUC值: 0.5897020519662028 
# 更低,不采用
# 再用smote后的数据集训练
#随机森林
rf = RandomForestClassifier(class_weight = 'balanced')
rf.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_rf = rf.predict_proba(x_val)[:,1]
print('模型随机森林AUC值:',roc_auc_score(y_val, y_pred_rf))# 结果: 模型随机森林AUC值: 0.7608474683946382
# 更低,不采用
# gbdt
gbdt = GradientBoostingClassifier()
gbdt.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_gbdt = gbdt.predict_proba(x_val)[:,1]
print('模型DBDT的AUC值:',roc_auc_score(y_val, y_pred_gbdt))# 结果: 模型DBDT的AUC值: 0.7919446032653581
# 更低,不采用
# xgboost
xgb = XGBClassifier(n_estimators=100,eta=0.1,random_state=21)
xgb.fit(x_train, y_train)
# 模型xgb的AUC值
y_pred_xgb = xgb.predict_proba(x_val)[:,1]
print('模型xgb的AUC值:',roc_auc_score(y_val, y_pred_xgb))# 结果: 模型xgb的AUC值: 0.7953751349977765
# 更低,不采用
# lightGBM
lgbm =LGBMClassifier(boosting_type = 'gbdt',objective = 'binary',metric = 'auc',learning_rate = 0.3,n_estimators = 100,max_depth = 3,num_leaves = 20,max_bin = 45,min_data_in_leaf = 6,bagging_fraction = 0.6,bagging_freq = 0,feature_fraction = 0.8)
lgbm.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_lgbm = lgbm.predict_proba(x_val)[:,1]
print('smote特征后,模型lightGBM的AUC值:',roc_auc_score(y_val, y_pred_lgbm))# 输出结果: smote特征后,模型lightGBM的AUC值: 0.795629248459437
# 更低, 不采用
5.11 结论: 综上: 最高AUC出现在:
删除不重要特征后,模型DBDT的AUC值: 0.8296169239565465

6. toad 跑整体流程

6.1 先toad把train.csv和test2.csv 合并,select筛选,再2:8分训练集测试集跑GBDT看看效果
# 2. 加载数据
data1 = pd.read_csv('../../data/raw/train.csv')
# object 类型数据转数值类型
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data1['BusinessTravel'] = le.fit_transform(data1['BusinessTravel'])
data1['Department'] = le.fit_transform(data1['Department'])
data1['EducationField'] = le.fit_transform(data1['EducationField'])
data1['Gender'] = le.fit_transform(data1['Gender'])
data1['JobRole'] = le.fit_transform(data1['JobRole'])
data1['MaritalStatus'] = le.fit_transform(data1['MaritalStatus'])
data1['Over18'] = le.fit_transform(data1['Over18'])
data1['OverTime'] = le.fit_transform(data1['OverTime'])data1.head()
data2 = pd.read_csv('../../data/raw/test2.csv')
# object 类型数据转数值类型
le = LabelEncoder()
data2['BusinessTravel'] = le.fit_transform(data2['BusinessTravel'])
data2['Department'] = le.fit_transform(data2['Department'])
data2['EducationField'] = le.fit_transform(data2['EducationField'])
data2['Gender'] = le.fit_transform(data2['Gender'])
data2['JobRole'] = le.fit_transform(data2['JobRole'])
data2['MaritalStatus'] = le.fit_transform(data2['MaritalStatus'])
data2['Over18'] = le.fit_transform(data2['Over18'])
data2['OverTime'] = le.fit_transform(data2['OverTime'])data2.head()
# 合并2份数据试试
data_all=pd.concat([data1,data2])
data_all.head()
# 3. toad特征筛选
# 先来个简单的
ex_lis=['Attrition','EmployeeNumber']   # 排除列: 结果y列,,员工号
dev_slct1, drop_lst= toad.selection.select(data_all, data_all['Attrition'], empty=0.7, iv=0.03, corr=0.7, return_drop=True, exclude=ex_lis) 
print("keep:", dev_slct1.shape[1],  "drop empty:", len(drop_lst['empty']), "drop iv:", len(drop_lst['iv']),  "drop corr:", len(drop_lst['corr']))
# 直接用筛选后的跑下:
# 5. 数据集的划分: 2:8
x_train, x_test, y_train, y_test = train_test_split(dev_slct1.drop('Attrition',axis=1), dev_slct1['Attrition'], test_size=0.2, random_state=21)
x_train.head()
# 验证集过滤需要的特征列
x_val=data2[dev_slct1.columns] #.drop('Attrition', axis=1),
x_val=x_val.drop('Attrition', axis=1)
y_val = data2['Attrition']
x_val.head()
from sklearn.ensemble import GradientBoostingClassifier# gbdt
gbdt = GradientBoostingClassifier()
gbdt.fit(x_train, y_train)
# 模型gbdt的AUC值
y_pred_gbdt = gbdt.predict_proba(x_val)[:,1]
print('模型DBDT的AUC值:',roc_auc_score(y_val, y_pred_gbdt))# 结果输出: 模型DBDT的AUC值: 0.958134807191411
# 有较大提升
# 决策树
dt = DecisionTreeClassifier(class_weight = 'balanced')
dt.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_dt = dt.predict_proba(x_val)[:,1]
print('模型决策树AUC值:',roc_auc_score(y_val, y_pred_dt))# 结果输出: 模型决策树AUC值: 0.9383457213645894
# 有较大提升
# 随机森林
rf = RandomForestClassifier(class_weight = 'balanced')
rf.fit(x_train, y_train)
# 模型随机森林AUC值
y_pred_rf = rf.predict_proba(x_val)[:,1]
print('模型随机森林AUC值:',roc_auc_score(y_val, y_pred_rf))# 结果输出: 模型随机森林AUC值: 0.9880566673019503
# xgboost
xgb = XGBClassifier(n_estimators=100,eta=0.1,random_state=21)
xgb.fit(x_train, y_train)
# 模型xgboost的AUC值
y_pred_xgb = xgb.predict_proba(x_val)[:,1]
print('模型xgboost的AUC值:',roc_auc_score(y_val, y_pred_xgb))# 结果输出: 模型xgboost的AUC值: 0.9758592211422401
# lightGBM
lgbm =LGBMClassifier(boosting_type = 'gbdt',objective = 'binary',metric = 'auc',learning_rate = 0.3,n_estimators = 100,max_depth = 3,num_leaves = 20,max_bin = 45,min_data_in_leaf = 6,bagging_fraction = 0.6,bagging_freq = 0,feature_fraction = 0.8)
lgbm.fit(x_train, y_train)
# 模型lightGBM的AUC值
y_pred_lgbm = lgbm.predict_proba(x_val)[:,1]
print('模型lightGBM的AUC值:',roc_auc_score(y_val, y_pred_lgbm))# 结果输出: 模型lightGBM的AUC值: 0.961755924020075
6.2 不合并,tain.csv为训练集,test2做测试集
# 不合并2个数据集试试
# 3. toad特征筛选
# data1 为 tain.csv 只做了label encoder
ex_lis=['Attrition','EmployeeNumber']   # 排除列: 结果y列,,员工号
dev_slct2, drop_lst2= toad.selection.select(data1, data1['Attrition'], empty=0.7, iv=0.03, corr=0.7, return_drop=True, exclude=ex_lis) 
print("keep:", dev_slct2.shape[1],  "drop empty:", len(drop_lst2['empty']), "drop iv:", len(drop_lst2['iv']),  "drop corr:", len(drop_lst2['corr']))
# 训练集
x_train, y_train= dev_slct2.drop('Attrition',axis=1), dev_slct2['Attrition']
x_train.head()
# 测试集
x_val=data2[dev_slct2.columns] 
x_val=x_val.drop('Attrition', axis=1)
y_val = data2['Attrition']
x_val.head()
# gbdt
gbdt = GradientBoostingClassifier()
gbdt.fit(x_train, y_train)
# 模型gbdt的AUC值
y_pred_gbdt = gbdt.predict_proba(x_val)[:,1]
print('模型DBDT的AUC值:',roc_auc_score(y_val, y_pred_gbdt))# 结果输出: 模型DBDT的AUC值: 0.8524236071405884
# 决策树
dt = DecisionTreeClassifier(class_weight = 'balanced')
dt.fit(x_train, y_train)
# 模型决策树AUC值
y_pred_dt = dt.predict_proba(x_val)[:,1]
print('模型决策树AUC值:',roc_auc_score(y_val, y_pred_dt))# 结果输出: 模型决策树AUC值: 0.6247061813099549
# 随机森林
rf = RandomForestClassifier(class_weight = 'balanced')
rf.fit(x_train, y_train)
# 模型随机森林AUC值
y_pred_rf = rf.predict_proba(x_val)[:,1]
print('模型随机森林AUC值:',roc_auc_score(y_val, y_pred_rf))# 结果输出: 模型随机森林AUC值: 0.8129407280350678
# xgboost
xgb = XGBClassifier(n_estimators=100,eta=0.1,random_state=21)
xgb.fit(x_train, y_train)
# 模型xgboost的AUC值
y_pred_xgb = xgb.predict_proba(x_val)[:,1]
print('模型xgboost的AUC值:',roc_auc_score(y_val, y_pred_xgb))# 结果输出: 模型xgboost的AUC值: 0.8126548503906994
# lightGBM
lgbm =LGBMClassifier(boosting_type = 'gbdt',objective = 'binary',metric = 'auc',learning_rate = 0.3,n_estimators = 100,max_depth = 3,num_leaves = 20,max_bin = 45,min_data_in_leaf = 6,bagging_fraction = 0.6,bagging_freq = 0,feature_fraction = 0.8)
lgbm.fit(x_train, y_train)
# 模型lightGBM的AUC值
y_pred_lgbm = lgbm.predict_proba(x_val)[:,1]
print('模型lightGBM的AUC值:',roc_auc_score(y_val, y_pred_lgbm))# 结果输出:模型lightGBM的AUC值: 0.8293628104948859
# 综上toad 的select 对tain.csv数据集筛选,训练
# 最高auc: 模型DBDT的AUC值: 0.8524236071405884

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

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

相关文章

【Mac】安装 VMware Fusion Pro

VMware Fusion Pro 软件已经正式免费提供给个人用户使用&#xff01; 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号&#xff0c;点击右上角 LOGIN &#xff0c;选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时&#xff0c;Username为…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

【el-pagination的使用及修改分页组件的整体大小修改默认样式的宽度详细教程】

今天遇到个bug&#xff0c;使用element-puls中的分页的时候&#xff0c;长度会超出盒子&#xff0c;今天教大家如何修改el-pagination的宽度&#xff0c;以及修改分页组件的整体大小 直接修改 style"width: 100%; margin-top: 10px"不生效 控制台修改el-pagination…

单体架构的 IM 系统设计

先直接抛出业务背景&#xff01; 有一款游戏&#xff0c;日活跃量&#xff08;DAU&#xff09;在两千左右&#xff0c;虽然 DAU 不高&#xff0c;但这两千用户的忠诚度非常高&#xff0c;而且会持续为游戏充值&#xff1b;为了进一步提高用户体验&#xff0c;继续增强用户的忠…

设计模式之单列模式(7种单例模式案例,Effective Java 作者推荐枚举单例模式)

前言 在设计模式中按照不同的处理方式共包含三大类&#xff1b;创建型模式、结构型模式和行为模式&#xff0c;其中创建型模式目前已经介绍了其中的四个&#xff1b;工厂方法模式、抽象工厂模式、生成器模式和原型模式&#xff0c;除此之外还有最后一个单例模式。 单列模式介绍…

具有扩展卷积的DCNN

目的&#xff1a; 进行了一系列实验来证明&#xff0c;在没有任何全连接层的情况下&#xff0c;具有扩展卷积的 DCNN 的性能并不比广泛使用的具有包含收缩&#xff08;无零填充&#xff09;卷积层和多个全连接层的混合结构的深度神经网络差。 DCNN&#xff1a;Deep convoluti…

【linux】查看不同网络命名空间的端口

在部署harbor时&#xff0c;内部用的是数据库postgresql&#xff0c;端口默认是: 5432&#xff0c;一开始以为这个数据库docker容器是在本命名空间中&#xff0c;一直用ss -lnt查询系统的端口&#xff0c;找不到5432端口。但是harbor要能正常使用&#xff0c;所有怀疑harbor的容…

W5500-EVB-Pico2评估板介绍

目录 1 概述 2 板载资源 2.1 硬件规格 2.2 硬件规格 2.3 工作条件 3 参考资料 3.1 RP2350 数据手册 3.2 W5500 数据手册 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图 (单位 : mm) 3.4 参考例程 认证 CE FCC AWS 资质 Microsoft Azure 认证…

2024MoonBit全球编程创新挑战赛参赛作品“飞翔的小鸟”技术开发指南

本文转载自 CSDN&#xff1a;https://blog.csdn.net/m0_61243965/article/details/143510089作者&#xff1a;言程序plus 实战开发基于moonbit和wasm4的飞翔的小鸟游戏 游戏中&#xff0c;玩家需要通过上下左右按键控制Bird&#xff0c;在不断移动的障碍pipe之间穿梭&#xf…

认证授权基础概念详解

目录 认证 (Authentication) 和授权 (Authorization)的区别是什么&#xff1f; RBAC 模型了解吗&#xff1f; 什么是 Cookie ? Cookie 的作用是什么? 如何在项目中使用 Cookie 呢&#xff1f; 如何在 Spring Boot 中创建和读取 Cookie 创建 Cookie Cookie 到期日期 安全…

彻底解决idea不识别java项目

需求背景 下载了一个java swing的项目,通过idea导入后,项目无法识别。打开java文件,也不会报错,也不编译。 无法识别效果图 可以看到左侧的菜单,项目是没有被识别。 打开java文件,可以看到没有识别,java的图标也没有出现。 解决方法 1、打开Project Structure 2、修改…

R6:LSTM实现糖尿病探索与预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 学习使用LSTM对糖尿病进行探索预测 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebook…

笔试题11 -- 装箱问题(01背包)

装箱问题&#xff08;01背包&#xff09; 文章目录 装箱问题&#xff08;01背包&#xff09;一、原题复现二、思路剖析三、示例代码 题目链接&#xff1a;NOIP2001装箱问题 一、原题复现 题目描述 有一个箱子容量为V&#xff08;正整数&#xff0c;0 ≤ V ≤ 20000&#xff09;…

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

测试-正交表与工具pairs的介绍使用(1)

目录 正交表 生成正交表 步骤 实操 注意事项 编写测试用例 根据正交表编写测试用例 补充遗漏的重要测试用例 正交表 关于长篇大论也不多介绍了&#xff0c;我们只需要知道正交法的⽬的是为了减少⽤例数⽬&#xff0c;⽤尽量少的⽤例覆盖输⼊的两两组合 正交表的构成&…

抗晃电马达保护器在工业厂房中的应用

安科瑞刘鸿鹏 摘要 随着工业自动化水平的提高&#xff0c;生产线上电动机作为关键设备的使用频率不断增加。然而&#xff0c;工厂生产环境中的电力波动&#xff0c;尤其是晃电现象&#xff0c;会对电动机的正常运转造成干扰&#xff0c;甚至导致设备停机和生产中断。抗晃电型…

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器&#xff0c;而会涉及到一些系统定时器的知识&#xff0c;这里我们简单讲解一下内核中定时器是如何组织&#xff0c;又是如何通过通过定时器实现了调度器的间隔调度。首先我们…

RHCE循环执行的例行性任务--crontab(周期性)

1.每分钟执行命令 2.每小时执行 3.每天凌晨3点半和12点半执行脚本 4.每隔6小时&#xff0c;相当于6,12,18,24点半执行脚本 5.30半点&#xff0c;8-18/2表示早上8点到下午18点之间每隔2小时执行脚本代表 6.每天晚上9点30重启nginx 7.每月1号和10号4点45执行脚本 8. 每周六和周日…

ETLCloud异常问题分析ai功能

在数据处理和集成的过程中&#xff0c;异常问题的发生往往会对业务运营造成显著影响。为了提高ETL&#xff08;提取、转换、加载&#xff09;流程的稳定性与效率&#xff0c;ETLCloud推出了智能异常问题分析AI功能。这一创新工具旨在实时监测数据流动中的潜在异常&#xff0c;自…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…