1.什么是决策树?树也分为回归树和分类树。本文讨论分类树。如果你了解或者学习过数据结构,那么你一定对“树”这个概念不陌生。在此基础上,学习和掌握决策树会更加容易。让我们用一个小例子来帮助理解什么是决策树。下图所示的流程图是一个决策树。矩形代表判断模块,椭圆代表终止模块,表示已经得出结论终止程序运行;左右箭头代表分支,通过分支可以到达另一个判断模块或终止程序。模块。这个流程图主要是想像一个择偶系统。之前网上还不流行“阿姨,我不想努力了”,树是看你要不要继续努力。如果不想继续打拼,可以选择找个“富婆”;相反,如果你想找个女朋友一起拼,这里要根据女孩的性格来判断。喜欢温柔性格的可以选“温柔女”,喜欢冷酷性格的可以选“酷女”。girl”。整个决策树可以看作是一个if-then规则,即“如果判断条件,则...”,需要注意以下三点:从根节点到每个子节点可以构成一条规则,每条路径上的中间节点的特征对应规则的判断条件,叶子节点的标签对应规则的结论,每个实例被一个且唯一的覆盖instance,即实例的特征与路径上的一致2.决策树收集数据的过程:开放数据源或爬虫等方法准备数据:树构建算法只适用于标称数据,所以数值数据必须离散化。分析数据:可以使用任何方法。构建树后,需要检查图形是否符合预期。训练算法:构建树的数据结构。测试算法:计算正确的树模型的t率。UsingAlgorithms:这一步可以应用于任何监督学习算法,决策树可视化可以更好地理解数据的内在含义。构建决策树的数据一定要充足,特征少的数据集可能会导致决策树的准确率不高。如果数据特征太多,不选择特征也会影响决策树的准确性。构建一个理想的决策树大致可以分为以下三个步骤:特征选择、决策树的生成和决策树的剪枝。3.特征选择特征选择是决定数据集中的哪些特征用于划分特征空间,主要是选择对训练数据具有分类能力的特征。这样做的目的是提高决策树的效率。如果一个特征的分类结果与随机分类的结果相差不大,那么这个特征就没有分类能力。一般来说,去除此类特征对决策树的准确性有影响。不大。下表是一份关于海洋生物的数据。数据的两个特征是nosurfacing(不浮出水面是否能生存),flippers(是否有flippers),有classlabelfish(是否是鱼)。nosurfacingflippersfishyesyesyesnononononono无论一个数据集有多少特征,每次划分数据集只能选择一个特征,所以选择哪个特征作为参考属性第一划分可以更新数据快速分类呢?答案一定是分类能力最好的特征,但问题是,如何判断哪个特征的分类能力最好呢?这时候引入一个新的概念——信息增益。什么是信息增益?数据集划分前后信息的变化就成为信息增益。知道了如何计算信息增益,我们就可以计算将数据集划分为每个特征值得到的信息增益。具有最高信息增益的特征是最佳选择。3.1熵(Shannonentropy)在计算信息增益之前,我们需要知道“熵”的概念。“熵”到底是什么,不用深究。我们只需要明白,熵被定义为信息的期望值。在信息论和概率统计中,熵是衡量一个随机变量不确定性的指标,通俗地说,就是系统的混乱程度。假设有一个包含n个样本的数据集,第i类样本为Xi,则可以定义符号Xi的信息:其中p(Xi)为选择该类别的概率。通过改变i的值,可以得到数据集中所有类别的信息。为了计算熵,我们需要计算所有类别的所有可能值所包含的信息的期望值(数学期望值),通过以下公式得出:熵越高,表示的不确定性越大变量,即数据的混合程度越高。3.2计算熵在创建数据集之前,对数据进行自定义化简,用1表示“是”,0表示“否”。熵计算代码如下:#创建数据集defcreateDataSet():DataSet=[[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]#矩阵转换DataframeDataSet=pd.DataFrame(DataSet,columns=['nosurfacing','flippers','fish'])returnDataSet#calculationInformationentropydefcalculatetent(DataSet):#统计类标签的分类fish_type=DataSet['fish'].value_counts()'''no3yes2'''#获取样本个数m=DataSet.shape[0]#每个类别的概率,即p(Xi)p=fish_type/m#计算熵值ent=(-p*np.log2(p)).sum()returnent'''0.9709505944546686'''最终返回熵为0.9709505944546686在这个数据中,有两类最终类标签“是鱼”和“不是鱼”。前者占标签总数的2/5,后者占3/5。因此,这部分代码的核心部分是应用熵公式:得到熵后,可以按照最大信息增益的方法对数据集进行划分,接下来的部分开始计算信息增益。3.3信息增益计算完熵后,如何计算信息增益?信息增益的计算是用其下所有子节点的熵之和减去父节点的熵,并且在求和时,由于类别所占比例不同,需要进行加权平均。以“无堆焊”为例,5个样本中,有3个“1”和2个“0”,所以两者的权重为3/5,另一个为2/5;其中对于“1”这三个样本,样本标签fish中有两个“yes”和一个“no”,所以分类的概率分别为2/3和1/3。同样,对于“0”的两个样本,样本标签fish都是“no”,所以分类概率为1。该列的信息增益计算公式如下:两个特征的信息增益计算结果如下:计算每个特征的信息增益的目的是为每个分类选择当前最优的特征,所以必须有一个比较的过程,方便得到最大的信息增益,返回特征的索引,然后就可以用这个最优的特征对数据集进行裁剪。所以这里构造了两个函数,一个是选择最优特征函数,一个是划分数据集函数。具体代码如下:#最优特征函数defChooseBF(DataSet):#获取基本信息entropyall_ent=calculatetent(DataSet)BestGain=0#初始化一个信息增益col=-1#为范围内的i初始化一个最优特征索引(DataSet.shape[1]-1):#遍历所有特征#得到分类index_=DataSet.iloc[:,i].value_counts().indexchild_ent=0#为jin初始化某列的信息熵index_:#按类别对第i列进行分类child_DataSet=DataSet[DataSet.iloc[:,i]==j]#计算某类别的信息熵ent=calculatelatent(child_DataSet)#所有类别的加权和informationentropychild_ent+=(child_DataSet.shape[0]/DataSet.shape[0])*entprint("%s列的熵For%s"%(i,child_ent))TheGain=all_ent-child_ent#Getinformationgainprint("Theinformationgainofcolumn%sis%s"%(i,TheGain))#得到最优特征索引if(TheGain>BestGain):BestGain=TheGaincol=iprint("最优特征索引为:%s"%col)returncol该函数两次调用计算信息熵函数calcultetent,一次得到基本信息熵,即上式中ent('total');另一次是计算特征中不同类别的信息熵,即上式中的ent('yes')和ent('no')。代码运行截图如下:返回的最优特征索引为0,即“无表面处理”列;并且两列的信息增益和上面手写计算的结果是一致的,所以代码是完全没问题的。下一步使用最优特征对数据集进行划分,代码如下:#拆分数据集函数defsplitSet(DataSet,col,value):#寻找最优特征索引labelindex=(DataSet.iloc[:,col]).name#拆分数据集并删除当前最优特征resetdata=DataSet[DataSet.iloc[:,col]==value].drop(index,axis=1)returnresetdata这个函数需要传入三个第一个参数是要切分的数据集,最优的特征索引,特征中要保留的类别。可能有些人不理解这个值的作用,通过对比运行结果就明白了。'''col=0,value=1flippersfish01yes11yes20nocol=0,value=0flippersfish31no41no'''以上两个DataFrames是splitdataset函数返回的结果,当当value=1时,三个保留样本均为“无表面处理”,值为1;当value=0时,两个保留样本的“无表面化”特征的中值为0,这样一对比就很容易理解value的作用了。文末大致介绍了熵和信息增益的计算方法。本文取的数据集的特征数很少,所以数据集的分类数也会很少。当数据特征较多时,经过第一次划分后,数据集会向下传递到决策树分支中的下一个节点,在这里我们可以对数据进行再次划分,因此需要对数据集进行递归处理。下面将介绍如何使用递归构建决策树以及决策树的可视化。毕竟决策树的一大优势就是通过可视化更好的理解数据是如何一步步划分的。公众号【奶糖猫】后台回复“信息增益”获取源码供参考,感谢阅读。
