Python高级--决策树( 二 )


2)检测SNS社区中的僵尸账号

Python高级--决策树

文章插图
1、计算整个系统中信息的熵
如图我们可以观察得到:
账号真实:y 7个 p1: 7/10
账号虚假:n 3个 p2: 3/10
计算这个系统中的信息熵
inof_D = -((3/10)*math.log2(3/10)+(7/10)*math.log2(7/10))#当前系统的信息熵0.8812908992306927
2、求依据日志密度 判断帐号是否真实的信息熵
现在我们假设将训练元组D(帐号是否真实)按属性A(日志密度)进行划分,则A对D划分的期望信息为:
如图我们可以观察得到:
s:3个 p1: 0.3 n y n
m:4个 p2: 0.4 y y n y
l:3个 p2: 0.3 y y y
Python高级--决策树

文章插图
计算这个系统中的信息熵
info_L_D = -0.3*((2/3*math.log2(2/3))+1/3*math.log2(1/3)) - 0.4*(1/4*math.log2(1/4)+3/4*math.log2(3/4))-0.3*(math.log2(1))
3、日志密度这个特征带来的 信息增益
inof_D-info_L_D0.2812908992306927
4、求 依据好友密度判断帐号是否真实的 信息熵
s - 4 p=0.4 n n y n
m - 4 p=0.4 y y y y
l - 2 p=0.2 y y
info_F_D = -0.4*((3/4)*math.log2(3/4)+(1/4)*math.log2(1/4))info_F_D0.32451124978365314
5、好友密度带来的信息增益
inof_D-info_F_D0.5567796494470396
可以看出:好友密度带来的信息增益就很大了
6、求 是否适用真实头像判断帐号是否真实的 信息熵
y - 5 p=0.5 y y y y n
n - 5 p=0.5 n y n y y
info_F_D = -0.5*(1/5*math.log2(1/5)+4/5*math.log2(4/5))-0.5*(2/5*math.log2(2/5)+3/5*math.log(3/5))0.7785973535509508
7、是否适用真实头像带来的信息增益
inof_D-info_F_D 0.10269354567974187
可以看出:是否适用真实头像带来的信息增益很小
3)创建决策树模型
导入一些列包
import numpy as npimport pandas as pdfrom pandas import Series,DataFrameimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeClassifierdtree = DecisionTreeClassifier()
4)将训练数据数字化供模型训练
训练数据与数字的映射关系:
# 日志密度 s m l0 1 2# 好友密度 s m l0 1 2# 头像n y0 1# 结果n y0 1X_train = np.array([[0,0,0],[0,2,1],[2,1,1],[1,1,1],[2,1,1],[1,2,0],[1,0,0],[2,1,0],[1,0,0],[0,0,1],])y_train = np.array([0,1,1,1,1,1,0,1,1,0])
5)将训练数据传入模型训练
dtree.fit(X_train,y_train)
6)用训练好的模型来预测
dtree.predict([[0,0,0],# 日志密度低 好友密度低 头像是假的[0,1,0],# 日志密度低 好友密度中等 头像是假的好友密度这个条件还可以 其他条件都不好[2,0,1]# 其他条件都很好 就是好友密度不好])array([0, 1, 0])
从结果可以看出 优先以信息增益大的条件去决定分类
五、决策树、K-近邻值、逻辑回归比较 1)导入模型
# 导入 数据集 和 模型 knn lgc dtree from sklearn.neighbors import KNeighborsClassifierfrom sklearn.linear_model import LogisticRegression# 虽然名字里有回归 但是是用来分类的from sklearn.tree import DecisionTreeClassifier