《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法

《机器学习》西瓜书P93

4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树。

以下内容是使用sklearn快捷生成的决策树,由于该函数的局限性,所得到的决策树是二叉树,但是也能做到相对正确的分类,同时在敲代码的过程中参考了大量资料和博客,在此文中一并总结了决策树构造所踩的坑和学到的东西,请大家仔细阅读

前言(都是坑、运行代码前务必阅读、理解以下部分并配置好相关的环境)

初识sklearn构造决策树

python中的sklearn库中含有DecisionTree的构造方法,在本实例中我们主要是采用该方法来构造决策树,一般方法代码量较大且复杂,如果想要详细实现决策树构建的每一步请参见其他博客。下面介绍一下python中的DecisionTree构造方法。

各种划分选择算法理论参见我的另一篇博客:https://blog.csdn.net/qq_45955883/article/details/116481131

python中sklearn库中的DecisionTreeClaasifier使用方法参见官方文档:官方文档

在python使用此类方法是ID3和CART之间存在差别,具体参见博客:

ID3、C4.5、C5.0、CART决策树区别

ID3、C4.5、CART三种决策树的区别


数据编码

注意:在使用sklearn构造决策树的过程中你会发现,该方法只针对数据部分为数值的数据集进行构造,像“色泽:青绿”这种字符串类型是无法进行处理的,因此,我们需要解决的问题是如何将这些字符串转换成数字来标识,该思路简言之就是对字符串进行编码处理。

同样地,在sklearn中也存在一部分函数用于离散型编码,对于不同的函数对应于不同的编码类型,为了降低编码这一过程对决策树的产生所造成的影响最低,同时也要考虑最终输出结果能够清晰明了,那么我们究竟该选择哪一种编码方式对我们的数据进行合适的编码呐/p>

关于sklearn中的多种离散型编码方式,参见博客:sklearn中多种编码方式——category_encoders(one-hot多种用法)

经过最终的比较和分析,我们选定使用DictVectorizer方法来对数据中的离散型内容进行编码,同时使用preprocessing.LabelBinarizer对标记进行编码,原因如下

  1. 使用preprocessing.LabelBinarizer对标记进行编码很容易理解,就是将标签进行二值化,即’1’代表’是‘,’0‘代表‘否’。从而将字符转换为0-1表示。

  2. DictVectorizer的处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等,将符号转成数字0/1表示。这句话是什么意思呐面看一个例子就能明白

    输出结果为:

    我们不难发现,DictVectorizer对非数字化的处理方式是,借助原特征的名称,组合成新的特征,并采用0/1的方式进行量化,而数值型的特征转化比较方便,一般情况维持原值即可。

    其中[ 1. 0. 0. 33.]代表的含义是’city=Dubai,temperature=33’,因为数组第一个元素为1,故表示‘city=Dubai’被选中,最后的元素代表‘temperature’的具体的值;该方法只针对离散型的值进行编码,对原本为数值的不修改值。

    那么对于我们的西瓜数据集2.0为什么适用于这种方法呐/strong>

    首先,我们的数据集中‘密度’和‘含糖率’是连续的,其他属性是离散的,因此使用上述方法可以统一进行一次性编码,无需分开编码后再合并。

    第二,该方法中的离散型数据均使用0-1来表示,就好像线性模型中的对率回归中使用的“单位阶跃函数”一样,对于x>0.5,可认为x=1,而x

接下来我们来谈一谈决策树的可视化问题……


决策树的可视化

同样的,python中也提供了决策树可视化的库和函数,即Graphviz,我们只需要在决策树建立完成之后将其导出到graphviz,

可视化软件gvedit.exe 免费下载地址:graphviz-2.38.msi免费下载

运行程序后会产生一个dot文件,使用gvedit.exe打开即可,注意:由于我的程序的问题最终产生的dot文件中文无法正确输出,需要以txt文本打开后在文本中添加多行命令:fontname=“SimSun”,添加到节点内,具体的操作百度搜索一下就知道了……

《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)
  1. 基于基尼指数建立的决策树2

    《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

针上面生成的决策树图像的几点说明:

  1. 基于基尼指数生成的决策树有两种,why见博客:sklearn 决策树相同数据集及模型参数为什么生成的模型不一样/li>
  2. 图的阅读方法,以第一幅图为例现予以解释:第一个节点中的samples=17,说明此时样本个数为17个,gini=0.498代表基尼指数,根据”含糖率

【完整源代码】

'''4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树'''import csvfrom sklearn.feature_extraction import DictVectorizerfrom sklearn import preprocessingfrom sklearn import treedef is_number(n):    is_number = True    try:num = float(n)# 检查 "nan"is_number = num == num   # 或者使用 `math.isnan(num)`    except ValueError:is_number = False    return is_numberdef loadData(filename):    data=open(filename,'r',encoding='GBK')    reader = csv.reader(data)    headers = next(reader)    featureList = []    labelList = []    for row in reader:labelList.append(row[len(row)-1])rowDict = {}for i in range(1,len(row)-1):    if is_number(row[i]) == True: rowDict[headers[i]] = float(row[i])    else: rowDict[headers[i]]=row[i]featureList.append(rowDict)    print(featureList)    print(labelList)    return featureList,labelListdef createDTree(featureList,labelList):    vec = DictVectorizer()    dummyX = vec.fit_transform(featureList来源:Yozu_Roo
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月11日
下一篇 2022年3月11日

相关推荐