在学习决策树之前,需要了解一些信息论的决策知识
熵:
熵的理解和物理上相似,也可以理解为混乱程度,越小越清楚
条件熵:
条件熵(加个条件)
信息增益:
关键词:减少程度。 比如找女朋友,看了女朋友的建立,我对她的信息熵为0.3,得知她喜欢coding之后我对她的信息熵为0.1,那么信息增益即为0.3-0.1=0.2
信息增益率:
基尼指数:
类似于熵,对于表达式来说不取对数,应该减少了计算的复杂度
决策树的三种算法: ID3、C4.5、CART
ID3算法: 具体方法: 从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益值最大的特征作为节点的划分特征; 由该特征的不同取值建立子节点; 再对子节点递归地调用以上方法,构建决策树; 到所有特征的信息增益都很小或者没有特征可以选择为止,得到最终的决策树。 缺点:没有剪枝 (会导致决策树过于庞大-数据多的时候)
C4.5算法: 对ID3进行了改进:引入悲观剪枝策略进行后剪枝; 引入信息增益率作为划分标准; 处理缺失值:
C4.5 采用的悲观剪枝方法,用递归的方式从低往上针对每一个非叶子节 点,评估用一个最佳叶子节点去代替这课子树是否有益。如果剪枝后与 剪枝前相比其错误率是保持或者下降,则这棵子树就可以被替换掉。
CART算法:(二叉树) 分裂:分裂过程是一个二叉递归划分过程,其输入和预测特征既可以是连续型的也可以是离散型的,CART 没有停止准则,会一直生长下去; 剪枝:采用代价复杂度剪枝,从最大树开始,每次选择训练数据熵对整体性能贡献最小的那个分裂节点作为下一个剪枝对象,直到只剩下根节点。CART 会产生一系列嵌套的剪枝树,需要从中选出一颗最优的决策树; 树选择:用单独的测试集评估每棵剪枝树的预测性能(也可以用交叉验证)。
三者差异:
python编程实现:
代码语言:javascript复制import pandas as pd
import sklearn as sklearn
from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
import pydotplus
from six import StringIO
import joblib
import numpy
from sklearn.preprocessing import StandardScaler
# pandas 读取 csv 文件,header = None 表示不将首行作为列
data = pd.read_csv('data/test.csv', header=None)
data2 = pd.read_csv('data/testtest.csv', header=None)
# 指定列
data.columns = ['Diet Habits', 'viviparous animal', 'Aquatic animals', 'Can fly','mammal']
data2.columns = ['Diet Habits', 'viviparous animal', 'Aquatic animals', 'Can fly']
# sparse=False意思是不产生稀疏矩阵
# 标准化数据,保证每个维度的特征数据方差为1,均值为0,使得预测结果不会被某些维度过大的特征值而主导
ss = StandardScaler()
# 先用 pandas 对每行生成字典,然后进行向量化
feature = data[['Diet Habits', 'viviparous animal', 'Aquatic animals', 'Can fly']]
feature2 = data2[['Diet Habits', 'viviparous animal', 'Aquatic animals', 'Can fly']]
X_train = ss.fit_transform(feature)
X_test = ss.transform(feature2)
# 打印各个变量
print('show featuren', feature)
print('show vectorn', X_train)
#print('show vector namen', vec.get_feature_names())
#print('show vector namen', vec.vocabulary_)
Y_train = data['mammal']
#print('show vectorn', Y_train)
clf = tree.DecisionTreeClassifier(criterion='entropy')#关键代码
clf.fit(X_train, Y_train)#关键代码
joblib.dump(clf, "train_model.m")
#print(X_test)
#读取模型进行预测
clf2 = joblib.load("train_model.m")
RESULT=clf2.predict(X_test)
print("result=",RESULT)
#输出结果
dot_data = StringIO()
tree.export_graphviz(clf,out_file=dot_data)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("test.pdf")
如果下载anaconda是自带sklearn库,需要手动安装的是pydotplus库和Graphviz工具 Graphviz工具下载 Graphviz能生成决策树的图,即最后一件的test.pdf文件 效果如下: