Python数据挖掘与机器学习——决策树算法代码实现

本文介绍了决策树算法原理,包括信息增益和提前分类规则,并通过Python的sklearn库实现了员工离职预测模型。数据预处理、特征选择、模型训练以及ROC曲线分析展示了模型的性能,同时探讨了特征的重要性。
摘要由CSDN通过智能技术生成

目录

一、决策树算法原理

1.1信息增益

1.2提前分类规则

二、案例分析及代码实现

三、结果分析


一、决策树算法原理

        决策树由:根节点、内部节点和叶子节点。前两者的作用在于根据属性对对对象进行划分,而后者是分类的结果。

1.1信息增益

        熵是指类别属性的不确定性,而决策树算法的本质是通过描述属性从而减少熵。对于某个属性取值为{b_{1},...,b_{k}},其中p(b_{i})是该属性分类出现的概率p(b_{i})=s_{i}/n,s_{i}为属性出现的元祖数

,定义自信息量I(b_{i})=log_{2}\frac{1}{p(b_{i})}=-log_{2}p(b_{i})。同时定义无条件熵

E(B)=-\sum{p(c_{i})log_{2}p(c_{i})}=-\sum{\frac{s_{i}}{n}log_{2}\frac{s_{i}}{n}}

注意这里对数函数以2为底是因为信息用二进制位编码,但并非不可改变。无条件熵反映了该属性中各类别取值的平均自信息量,即平均不确定值。当p_{i}相同时均值最大。定义条件熵为

E(B,A_{k})=\sum{\frac{s_{j}}{n}}\left ( -\sum{\frac{s_{ij}}{s_{j}}log_{2}\frac{s_{ij}}{s_j}} \right )

对应的信息增益为G(B,A_{k})=E(B)-E(B,A_{k})

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曲线

通过特征重要性的表格可以观察到不同特征的重要程度

 本文为个人学习所得,多有疏漏不足之处还望读者诸君批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值