前言
- 蛋肥使用员工离职数据集(包含14999个样本以及10个特征),通过现有员工是否离职的数据,建立决策树模型预测有可能离职的员工,最后尝试对模型进行评估与调优。
准备
时间:2021/06/30
系统环境:Windows 10
所用工具:Jupyter Notebook\Python 3.0
涉及的库:pandas\train_test_split\DecisionTreeClassifier\accuracy_score\roc_curve\matplotlib.pyplot\roc_auc_score\export_graphviz\graphviz\os\GridSearchCV
搭建决策树模型
参考资料
阿里云天池-员工离职数据
#读取数据集
import pandas as pd
df=pd.read_csv(r"C:\Users\Archer\Desktop\HR_comma_sep.csv")
#将sales、salary转化为数值
df=df.replace({"salary":{"low":1,"medium":2,"high":3},
"sales":{"accounting":1,"hr":2,"IT":3,"management":4,"marketing":5,
"product_mng":6,"RandD":7,"sales":8,"support":9,"technical":10}})
#选取自变量、因变量
X=df.drop(columns="left")
Y=df["left"]
#划分训练集、测试集,测试集占20%
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=1)
#搭建决策树模型
from sklearn.tree import DecisionTreeClassifier
model=DecisionTreeClassifier(max_depth=3,random_state=1)
model.fit(X_train,Y_train)
获取预测准确度
蛋肥想法:通过测试集数据,检验预测准确度,测得准确度为95.47%。
#预测结果评分
from sklearn.metrics import accuracy_score
Y_pred=model.predict(X_test)
score=accuracy_score(Y_pred,Y_test)
print(str(score))
获取预测概率
#预测概率
Y_pred_=model.predict_proba(X_test)
data=pd.DataFrame(Y_pred_,columns=["不离职概率","离职概率"])
模型评估-ROC曲线
蛋肥想法:通过绘制ROC曲线,得出AUC值为0.966,表明预测效果不错。
#获取不同阈值下的命中率(TPR)和假警报率(FPR)
from sklearn.metrics import roc_curve
fpr,tpr,thres=roc_curve(Y_test,Y_pred_[:,1])
#绘制ROC曲线
import matplotlib.pyplot as plt
plt.plot(fpr,tpr)
plt.savefig(r"C:\Users\Archer\Desktop\my_fig.png",dpi=500)
plt.show
#获取模型AUC值
from sklearn.metrics import roc_auc_score
auc=roc_auc_score(Y_test,Y_pred_[:,1])
特征重要性评估
蛋肥想法:特征重要性最高的是“satisfaction_level”,而“salary”在该模型中的特征重要性为0,并不符合实际(钱可太重要了~),应该是因为数据处理时单纯将工资分为“高”“中”“低”3个档次,使得该特征变量在决策树模型中发挥的作用较小。
#获取特征重要性
features=X.columns
imp=model.feature_importances_
imp_data=pd.DataFrame()
imp_data["特征名称"]=features
imp_data["特征重要性"]=imp
imp_data.sort_values("特征重要性",ascending=False)
决策树模型可视化
#决策树模型可视化
from sklearn.tree import export_graphviz
import graphviz
import os
os.environ["PATH"]=os.pathsep+r"C:\Program Files\Graphviz\bin"
dot_data=export_graphviz(model,out_file=None,class_names=["0","1"])
graph=graphviz.Source(dot_data)
graph.render(r"C:\Users\Archer\Desktop\result")
参数调优-GridSearch网格搜索
蛋肥想法:GridSearch网格搜索可以进行单参数和多参数调优,蛋肥这里以max_depth参数来练习调优,得出'max_depth': 7时,AUC更好为0.985。
#单参数调优,cv=5为5折交叉验证
from sklearn.model_selection import GridSearchCV
parameters={"max_depth":[1,3,5,7,9,11]}
model=DecisionTreeClassifier()
grid_search=GridSearchCV(model,parameters,scoring="roc_auc",cv=5)
#输出参数的最优值
grid_search.fit(X_train,Y_train)
grid_search.best_params_
总结
- 作为机器学习的经典算法模型,决策树模型具有独特的优势,如对异常值不敏感、可解释性强等,也有一些缺点,如结果不稳定、容易造成过拟合等。
- 决策树模型是很多重要集成模型的基础。