目录
一、决策树算法原理
决策树由:根节点、内部节点和叶子节点。前两者的作用在于根据属性对对对象进行划分,而后者是分类的结果。
1.1信息增益
熵是指类别属性的不确定性,而决策树算法的本质是通过描述属性从而减少熵。对于某个属性取值为,其中是该属性分类出现的概率,为属性出现的元祖数
,定义自信息量。同时定义无条件熵
注意这里对数函数以2为底是因为信息用二进制位编码,但并非不可改变。无条件熵反映了该属性中各类别取值的平均自信息量,即平均不确定值。当相同时均值最大。定义条件熵为
对应的信息增益为
1.2提前分类规则
建立IF-THEN分类规则,即每个内部属性值形成规则前件(IF部分)的一个合取项,叶子结点形成规则后件(THEN部分)
二、案例分析及代码实现
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from sklearn.tree import export_graphviz
import graphviz
###########数据读取和预处理#####################################
df=pd.read_excel('员工离职预测模型.xlsx')
df.head()
#数据中的文字内容也成为哑变量需要进行数据化处理
df=df.replace({'工资':{'低':0,'中':1,'高':2}})
df.head()
#########提取特征变量和目标函数##################################
#单独提取特征变量和目标变量单独提取
X=df.drop(colums='离职')
y=df['离职']
########划分训练集和测试集###################################
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=123)
X_train.head()##划分后数据展示
X_test.head()
y_train.head()
y_test.head()
##########模型训练及搭建#################################
model=DecisionTreeClassifier(max_depth=3,random_state=123)
model.fit(X_train,y_train)
y_pred=model.predict(X_test)#直接预测是否离职
#将预测值和实际值汇总到一起
a=pd.DataFrame()
a['预测值']=list(y_pred)
a['实际值']=list(y_test)
#查看整体的预测准确度
score=accuracy_score(y_pred,y_test)
##########预测离职和不离职的概率########################
y_pred_proba=model.predict_proba(X_test)
b=pd.DataFrame(y_pred_proba,columns=['不离职概率','离职概率'])
#########模型预测效果估计########################
fpr,tpr,thres=roc_curve(y_test,y_pred_proba[;,1])
#命中率(tpr):实际离职预测离职 假警报率(FPR):实际不离职预测为离职 阈值:为划分的门槛
a=pd.DataFrame()
a['阈值']=list(thres)
a['假警报率']=list(fpr)
a['命中率']=list(tpr)
##绘制图表可视化不同阈值下的假警报率和命中率
score=roc_auc_score(y_test,y_pred_proba[;,1])
plt.plot(fpr,tpr)
plt.show()
print(model.feature_importances_)
>output:[0. 0.59810862 0.14007392 0.10638659 0.00456495 0.15086592]
#######模型特征重要性评估#####################
features=X.columns#查看特征重要性
importances=model.feature_importances_
##在特征比较多的情况下
features=X.columns#获取特征名称
importances=model.feature_importances_#或许特征重要性
importances_df=pd.DataFrame()#通过二维表格形式显示
importances_df['特征名称']=features
importances_df['特征重要性']=importances
importances_df.sort_values('特征重要性',ascending=False)
importances_df=pd.DataFrame([features,importances],index=['特征名称','特征重要性']).T
print(importances_df)
>output
特征名称 特征重要性
0 工资 0.0
1 满意度 0.598109
2 考核得分 0.140074
3 工程数量 0.106387
4 月工时 0.004565
5 工龄 0.150866
#############决策树模型的可视化######################
dot_data=export_graphviz(model,out_file=None)#model极为模型名称
graph=graphviz.Source(dot_data)#将决策树模型模型可视化
graph.render('决策树可视化')#生产决策树可视化PDF文件
三、结果分析
roc_auc曲线
通过特征重要性的表格可以观察到不同特征的重要程度
本文为个人学习所得,多有疏漏不足之处还望读者诸君批评指正