决策树(算法+代码)

决策树:比较适合分析离散数据
如果是连续数据要先转成离散数据。

几个重要的定义
**信息熵:**表示不确定的变量,越大时,表示不确定性越大。Info(D)=-∑ p(i)log2p(i)
**条件熵:**H(Y|X)X给定条件下随机变量Y的不确定性。InfoA(D)=∑Dj/D*Info(Dj)

决策树会选择最大信息增益来对节点进行划分。
信息增益::表示X的信息,而使得Y不确定性减少的程度。
信息增益方法倾向于首先选择因子数较多的变量。信息增益的改进。
Gain(A)=Info(D)-InfoA(D)

信息增益的改进:增益率
信息增益比:倾向于选择取值较多的特征来进行划分。
ID3算法:使用信息增益最大的进行划分。
CART算法:递归构建二叉决策树的过程

C4.5算法:选择信息增益比来进行划分
如果数据集只剩下一个类别,则把这些剩下的样本设置为叶节点。如果没有特征可以进行划分,则把剩下节点也设置为叶节点。否则计算信息增益比,选择信息比最大的特征进行划分。若信息增益比小于一个给定的阈值,不进行划分,直接设置为叶节点。
剪枝:可以抵抗过拟合。
决策树适合小规模的数据集,类别较多时,错误增加的比较快。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
from sklearn import tree

#载入数据
data = np.genfromtxt("LR-testSet.csv",delimiter=',')
x_data=data[:,:-1]
y_data=data[:,-1]
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()

#创建决策树模型
model = tree.DecisionTreeClassifier()
#输入数据建立模型
model.fit(x_data,y_data)

#导出决策树

import graphviz #http://www.graphviz.org/

dot_data = tree.export_graphviz(model,
                                out_file=None,
                                feature_names=vec.get_feature_names(),
                                class_names=lb.classes_,
                                filled=True,
                                rounded=True,
                                special_characters=True
                                )

graph=graphviz.Source(dot_data)

#获取数据值所在范围
x_min,x_max=x_data[:,0].min()-1,x_data[:,0].max()+1
y_min,y_max=x_data[:,1].min()-1,x_data[:,1].max()+1

#生成网络矩阵
xx,yy =np.meshgrid(np.arange(x_min,x_max,0.02),
                   np.arange(y_min,y_max,0.02)
                   )
z = model.predict(np.c_[xx.ravel(),yy.ravel()])
z=z.reshape(xx.shape)
#等高线图
cs = plt.contour(xx,yy,z)
#样本散点图
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
plt.show()

你可能感兴趣的:(决策树(算法+代码))