16.使用决策树预测其他数据集
2024-09-23 00:00:38  阅读数 583

隐形眼镜数据集是《机器学习实战》中决策树算法的第二个数据集。按书上吹,隐形眼镜数据集是一个非常著名的数据集,包含了“很多”患者眼部状况的观察条件以及医生推荐的隐形眼镜类型。我很期待的打开了数据集,发现它只有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和标签直接相当了。一直没找到问题的所在,但至少说明,不要试图去使分支过多,二叉就挺好的。