多分类模型尝试-员工是否离职预测

目录

文章目录

前言

一、初始化

二、了解数据集

三、了解变量

四、特征处理

五、建模

5.1 模型一:逻辑回归

5.2 模型二:KNN

5.3 模型三:随机森林

总结




前言

本项目的主要内容是对公司员工进行分类 预测其两年内是否会离职

尝试模型:逻辑回归、KNN、随机森林

变量含义:

· Education:受教育水平  
· JoiningYear:加入公司年份  
· City:所在城市  
· PaymentTier :薪资支付水平  
· Age :年龄  
· Gender :性别  
· EverBenched :历史是否离开过一个月及以上时间  
· ExperienceInCurrentDomain:在当前领域的经验  
· LeaveOrNot :是否离职  



一、初始化

导入相关包和库

#数据处理包
import numpy as np
import pandas as pd

#画图
import matplotlib.pyplot as plt
from matplotlib import rcParams
import seaborn as sns 

#建模
from sklearn.preprocessing import scale,LabelEncoder #用于数据预处理模块的缩放器、标签编码
from sklearn.model_selection import train_test_split #数据集分类器 用于划分训练集和测试集
from sklearn.metrics import classification_report,accuracy_score #评估预测结果
from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.neighbors import KNeighborsClassifier #KNN
from sklearn.tree import DecisionTreeClassifier #决策树
from sklearn.ensemble import RandomForestClassifier #随机森林
from sklearn.ensemble import GradientBoostingClassifier #XGB分类

设置显示

#设置输出全部结果 而非只有最后一个
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

#设置正常显示负号和中文
%matplotlib inline
plt.rcParams['font.family'] = 'SimHei' #用来正常显示中文
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

导入数据

#读取数据
data = pd.read_csv("/和鲸数据/多分类模型尝试-员工是否离职预测/Employee.csv")
data.head()



多分类模型尝试-员工是否离职预测_第1张图片

二、了解数据集

data.shape # 查看数据集结构 
data.head() # 预览数据
data.isnull().sum() # 查看每一列的缺失值数量

多分类模型尝试-员工是否离职预测_第2张图片

由此可知,数据集共有4653行&9列,特征变量中无缺失值。

data.info() # 查看特征类型

多分类模型尝试-员工是否离职预测_第3张图片

data.skew() #查看偏态分布

多分类模型尝试-员工是否离职预测_第4张图片

三、了解变量

· 根据变量含义,将特征分为分类变量col_cate和数值变量col_num
· 对分类变量col_cate查看频率分布
· 对数值变量col_num查看数值分布

col_all = list(data.columns) # 全部特征
col_cate = ['Education','City','Gender','EverBenched'] # 分类特征
col_num = ['JoiningYear','PaymentTier','Age','ExperienceInCurrentDomain'] # 连续(数值)特征

构建简单for循环 对每个分类变量查看各数据出现的次数 同时绘制直方图

plt.figure(figsize=(25,20),dpi=300)
plt.subplots_adjust(wspace =0.3, hspace =0.3)
for n,i in enumerate(data[col_cate].columns):
    plt.subplot(2,2,n+1)
    plt.title(i,fontsize=15)
    plt.grid(linestyle='--')
    data[col_cate][i].hist(color='darkcyan',alpha=0.5)

多分类模型尝试-员工是否离职预测_第5张图片

对数值型变量绘制直方图 查看数据分布

data[col_num].hist(bins=20,figsize=(15,10),color ="darkcyan") 

多分类模型尝试-员工是否离职预测_第6张图片

四、特征处理

利用get_dummies()函数对分类变量进行编码

data = pd.get_dummies(data=data,columns=["Education","City","Gender","EverBenched"],prefix_sep="+",drop_first=False)
data

多分类模型尝试-员工是否离职预测_第7张图片

查看目前数据集中变量之间的相关系数

corr = data.corr()
corr

多分类模型尝试-员工是否离职预测_第8张图片

绘制相关系数的热力图

plt.figure(figsize=(20,8))
sns.heatmap(data=corr,xticklabels=corr.columns,yticklabels=corr.columns,annot=True,cmap="YlGnBu_r") #参数annot设置为True可以将数值展示出来

多分类模型尝试-员工是否离职预测_第9张图片

五、建模

· 划分数据 对数据进行缩放处理
· 划分训练集和测试集
· 模型实例化+拟合训练集+预测测试集
· 对预测结果进行展示和评估

X = data.loc[:,['JoiningYear', 'PaymentTier', 'Age', 'ExperienceInCurrentDomain',
       'Education+Bachelors', 'Education+Masters',
       'Education+PHD', 'City+Bangalore', 'City+New Delhi', 'City+Pune',
       'Gender+Female', 'Gender+Male', 'EverBenched+No', 'EverBenched+Yes']].values 
y = data.loc[:,['LeaveOrNot']].values
X_scale = scale(X) # 缩放处理
X_scale # 查看缩放后的数据

多分类模型尝试-员工是否离职预测_第10张图片

对数据集进行划分 test_size参数设置为0.4 取其中40%的数据作为测试集

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4)

5.1 模型一:逻辑回归

model_LR = LogisticRegression() # 实例化
model_LR = model_LR.fit(X_train,y_train) # 拟合

y_pred_LR = model_LR.predict(X_test) #预测
y_pred_LR=pd.DataFrame(y_pred_LR) # 转化为DataFrame形式
y_pred_LR.value_counts() # 预测结果数据分布
y_pred_LR.hist(color="darkcyan") # 绘制直方图查看分布

print(accuracy_score(y_test,y_pred_LR)) #评估准确度
print(classification_report(y_test,y_pred_LR)) #输出分类预测报告

多分类模型尝试-员工是否离职预测_第11张图片

制作混淆矩阵

from sklearn.metrics import confusion_matrix

confusion = confusion_matrix(y_test, y_pred_LR)
confusion


多分类模型尝试-员工是否离职预测_第12张图片

混淆矩阵可视化

plt.matshow(confusion,cmap=plt.cm.Blues, alpha=0.8)
plt.title('混淆矩阵')
plt.colorbar() 
plt.ylabel('预测')
plt.xlabel('实际')
plt.show()

多分类模型尝试-员工是否离职预测_第13张图片 

5.2 模型二:KNN

参数解释:

· n_neighbors:默认为5,K的个数。
· p:默认2;距离度量,1为曼哈顿距离,2为欧式距离。
· weights:默认为“uniform”;距离权重,“uniform”表示近邻样本权重一致,“distance”表示权重和距离成反比,距离越近,权重越大。

model_KNN = KNeighborsClassifier(n_neighbors=10,p=1,weights="distance") # 实例化逻辑回归模型
model_KNN = model_KNN.fit(X_train,y_train) # 拟合

y_pred_KNN = model_KNN.predict(X_test)
y_pred_KNN = pd.DataFrame(y_pred_KNN) # 转化为DataFrame形式

y_pred_KNN.value_counts() # 预测结果数据分布
y_pred_KNN.hist(color="darkcyan") # 绘制直方图查看分布

print(accuracy_score(y_test,y_pred_KNN))
print(classification_report(y_test,y_pred_KNN))

多分类模型尝试-员工是否离职预测_第14张图片

5.3 模型三:随机森林

参数解释:

· n_estimators:默认100,树的个数。
· bootstrp:默认True;是否对样本进行有放回抽样。
· max_depth:默认;树的深度。
· max_features:默认“auto”;最大特征数。

model_RF = RandomForestClassifier(n_estimators=80,max_depth=8) # 实力化逻辑回归模型
model_RF = model_RF.fit(X_train,y_train) # 拟合

y_pred_RF = model_RF.predict(X_test)
y_pred_RF = pd.DataFrame(y_pred_RF) # 转化为DataFrame形式

y_pred_RF.value_counts() # 预测结果数据分布
y_pred_RF.hist(color="darkcyan") # 绘制直方图查看分布

print(accuracy_score(y_test,y_pred_RF))
print(classification_report(y_test,y_pred_RF))

多分类模型尝试-员工是否离职预测_第15张图片



总结

评估指标说明

· accuracy_score 分类准确率分数 返回分类正确的样本占全部样本之比
· precision 精确度 TP/(TP+FP) 反映是否查准
· recall 召回率 TP/(TP+FN) 反映是否查全
· f1-score 调和平均值

可以看到,在本数据集当前参数下,逻辑回归准确度分数为0.72,KNN分数0.81,随机森林分数0.85。

也可以多多尝试其他参数,调整出最优结果。

你可能感兴趣的:(机器学习,python,机器学习,数据挖掘,数据分析)