文章原创,最近更新:2018-08-13
本章节的主要内容是:
重点介绍项目案例1:判定鱼类和非鱼类划分数据集的函数代码
。
1.决策树项目案例介绍:
项目案例1:
判定鱼类和非鱼类
项目概述:
- 根据以下 2 个特征,将动物分成两类:鱼类和非鱼类。
- 特征: 1. 不浮出水面是否可以生存 2. 是否有脚蹼
开发流程:
- 收集数据:可以使用任何方法
- 准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化
- 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期
- 训练算法:构造树的数据结构
- 测试算法:使用决策树执行分类
- 使用算法:此步骤可以适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义
数据集介绍
2.划分数据集的函数代码
分类算法除了需要测量信息熵,还需要划分数据集,度量花费数据集的熵,以便判断当前是否正确地划分了数据集。我们将对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式。想象一个分布在二维空间的数据散点图,需要在数据之间划条线,将它们分成两部分,我们应该按照x轴还是按照y轴划线呢?
以上直白一点就是要理解这个函数的是作用是当我们按某个特征划分数据集时,把划分后剩下的元素抽取出来,形成一个新的子集,用于计算条件熵。
要划分数据集,打开分布编辑器,在trees.py文件中输入下列的代码:
def splitDataSet(dataSet,axis,value):
"""
splitDataSet(通过遍历dataSet数据集,求出index对应的column列的值为value的行)
就是依据index列进行分类,如果index列的数据等于value的时候,就要index划分到我们创建的新的数据集中
Args:
dataSet:数据集 待划分的数据集
axis:表示每一行的index列 特征的坐标,等于0,第0个特征为0或者1
value:表示index列对应的value值 需要返回的特征的值
Returns:
index列为value的数据集[该数据集需要排除axis列]
"""
retDataSet = []
# index列为value的数据集[该数据集需要排除index列]
# 判断index列的值是否等于value
# 遍历数据集,将axis上的数据和value值进行对比
for featVec in dataSet:
# 如果待检测的特征axis和指定的特征value相等
if featVec[axis] == value:
# 从第0开始,一旦发现第axis符合要求,就将数据0-axis保存至reduceFeatVec
reducedFeatVec =featVec[:axis]
# 将指定的数据的axis+1位到末尾添加至reducedFeatVec,保持数据完整性
reducedFeatVec.extend(featVec[axis+1:])
# 收集结果值除掉index列的reducedFeatVec收据集添加到retDataSet数据集
retDataSet.append(reducedFeatVec)
return retDataSet
测试代码及其结果如下:
import trees
mydata,labels=trees.createDataSet()
mydata
Out[111]: [[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
trees.splitDataSet(mydata,0,1)
Out[112]: [[1, 'maybe'], [1, 'yes'], [0, 'no']]
为了更好地理解上面代码,列了以下简单示例,示例从a=[0,1,2,3,4,5]中取出除去第3个元素后所有元素的方法,具体如下:
c=[]#空列表
a=[0,1,2,3,4,5]
b=a[:2]
b#打印可知a[:2] 获取的是前2个元素[0, 1]
Out[131]: [0, 1]
a[2+1:]#打印可知a[2+1:]获取的是后三个元素[3, 4, 5]
Out[132]: [3, 4, 5]
b
Out[133]: [0, 1]
b.extend(a[2+1:])#把获取的后三个元素3, 4, 5加到b里,列表b变为[0, 1, 3, 4, 5]
b
Out[134]: [0, 1, 3, 4, 5]
c.append(b)#把列表b加到列表c里
c
Out[135]: [[0, 1, 3, 4, 5]]#得到了去除2的列表c,这可以作为小的编程题目了
3.相关知识点的理解
3.1 extend和append的区别
具体见小案例:假定存在两个列表,a和b
a=[1,2,3]
b=[4,5,6]
a.append(b)
a
Out[141]: [1, 2, 3, [4, 5, 6]]
如果执行a.append(b),则列表得到了第四个元素,而且第四个元素也是一个列表,如果使用extend方法:
a=[1,2,3]
b=[4,5,6]
a.extend(b)
a
Out[147]: [1, 2, 3, 4, 5, 6]
则得到一个包含a和b所有元素的列表。