隐形眼镜数据集是《机器学习实战》中决策树算法的第二个数据集。按书上吹,隐形眼镜数据集是一个非常著名的数据集,包含了“很多”患者眼部状况的观察条件以及医生推荐的隐形眼镜类型。我很期待的打开了数据集,发现它只有24行……
我还不死心,想啊这恐怕是书里对数据集做了处理,裁剪掉了很多。于是我就开始搜索网上该数据集的下载链接,找到了这个:
https://archive.ics.uci.edu/ml/machine-learning-databases/lenses/
将lenses.data下载下来后一看,竟然还是24条,并且还很不清晰的(其实是将字符串特征值转化成了数字)表述方式。
好吧,这是一个迷你数据集。也许决策树最适合的就是用在迷你数据集上。
书中对这块是直接命令行操作了,我把对应的代码摘出来:
fr = open('lenses.txt')
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lensesLabels = ['age', 'rescript', 'astigmatic', 'tearRate']
lensesTree = createTree(lenses, lensesLabels)
print(lensesTree)
得出的结果是:
由于没有测试数据了(也不想改代码了),就不去纠结决策树是否有一个好结果了,反正是跑通并生成树了。
从书中的评价来说,这棵树搭的分支太多了(虽然按照ID3算法,就该把特征耗尽),导致匹配选项可能太多了,会出现过度匹配的现象(overfitting)。在深度学习里,overfitting经常带来的是模型阶段能够跑出不错的成绩,但是实际场合下就不行。为了减少过度匹配,我们就需要裁剪一些只增加少量信息的叶子节点,将其删除并合并到其他叶子节点中。这会在后面的章节进行讨论。
我尝试用决策树模型去玩了一下手写数字识别(ch02的数据集),正确率结果是88%,总体成绩还行,比KNN还是差了点。我想是因为这里输入的特征太多了吧(32*32,一共1024个特征),这会导致过拟合。生成的树状图如下(其实光看树的结构,还挺好的):
可能用了其他两种改进方法,会好一点。
那么有没有办法进一步提升正确率呢?我想了个办法,就是不按32*32个特征,而是按每一行的和(即有多少个像素是1)作为输入呢?
这里有个问题,就是求和后,实际上每一个特征的范围会变的很大,也会是0-32。用生成的模型去跑,却跑出了100%的成功率,实际是result和标签直接相当了。一直没找到问题的所在,但至少说明,不要试图去使分支过多,二叉就挺好的。