目录
文章目录
前言
一、初始化
二、了解数据集
三、了解变量
四、特征处理
五、建模
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()
data.shape # 查看数据集结构
data.head() # 预览数据
data.isnull().sum() # 查看每一列的缺失值数量
由此可知,数据集共有4653行&9列,特征变量中无缺失值。
data.info() # 查看特征类型
data.skew() #查看偏态分布
· 根据变量含义,将特征分为分类变量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)
对数值型变量绘制直方图 查看数据分布
data[col_num].hist(bins=20,figsize=(15,10),color ="darkcyan")
利用get_dummies()函数对分类变量进行编码
data = pd.get_dummies(data=data,columns=["Education","City","Gender","EverBenched"],prefix_sep="+",drop_first=False)
data
查看目前数据集中变量之间的相关系数
corr = data.corr()
corr
绘制相关系数的热力图
plt.figure(figsize=(20,8))
sns.heatmap(data=corr,xticklabels=corr.columns,yticklabels=corr.columns,annot=True,cmap="YlGnBu_r") #参数annot设置为True可以将数值展示出来
· 划分数据 对数据进行缩放处理
· 划分训练集和测试集
· 模型实例化+拟合训练集+预测测试集
· 对预测结果进行展示和评估
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 # 查看缩放后的数据
对数据集进行划分 test_size参数设置为0.4 取其中40%的数据作为测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4)
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)) #输出分类预测报告
制作混淆矩阵
from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(y_test, y_pred_LR)
confusion
混淆矩阵可视化
plt.matshow(confusion,cmap=plt.cm.Blues, alpha=0.8)
plt.title('混淆矩阵')
plt.colorbar()
plt.ylabel('预测')
plt.xlabel('实际')
plt.show()
参数解释:
· 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))
参数解释:
· 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))
评估指标说明
· accuracy_score 分类准确率分数 返回分类正确的样本占全部样本之比
· precision 精确度 TP/(TP+FP) 反映是否查准
· recall 召回率 TP/(TP+FN) 反映是否查全
· f1-score 调和平均值
可以看到,在本数据集当前参数下,逻辑回归准确度分数为0.72,KNN分数0.81,随机森林分数0.85。
也可以多多尝试其他参数,调整出最优结果。