随机森林手写数字识别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011630458/article/details/78738039

简介

  本篇主要是对随机森林的进一步学习笔记记录,主要是使用随机森林对手写数字图像做分类。

具体实现

  基本原理也不做讲解了,这里主要是使用Mnist数据集来做手写数字图像的训练和测试。
Mnist数据集包含若干张28x28的手写数字图像,具体内容如下所示:
         


具体实现

前提准备

  首先准备好前面提到的训练集图像和对应的测试集图像,这里一共是使用了60000张28x28的图像作为训练集。

训练参数设置

  本例中,随机森林训练树设置为10棵,每棵的节点最大深度设置为10,同时如果每个节点使用训练样本数量需要大于10。使用28x28的图像,每个图像特征一共有28x28=794个,
每次训练随机不可重复抽取sqrt(794)=28的特征加入训练;每次训练随机可重复的抽取60000张图片作为每次训练样本集。设置最大分类数量为10,也就是分类出[0,9]。

训练流程

  1、每棵树依次训练,训练时候,首先随机生成可重复的60000样本图片作为本次训练集a。

  2、计算当前训练集,分别在[0,9]类别中概率。并通过公式:gini= 1- ((各个分类数量/所有选中样本数量)的平方相加)。这里的gini表示当前训练样本的分类情况。
样本分类在[0,9]上,分类越平均,则gini越大;反之越小。

  3、创建一个节点数组cartreeArray用来存储树结构,数组大小为:pow(2,树最大深度);

  4、cartreeArray[0]表示根节点,对应的训练集为整个a,从28x28中,随机生成28的不可重复特征集合f。

  5、计算确认该节点是否为叶子节点,如果是则树训练结束,如果不是则计算数据集分类以及对应子节点生成。
具体规则为:
    (1)、首先选择一个集合f中一个特征,你用测试集a每个样本的该特征值大小,对样本进行排序。

    (2)、将样本集全部放入右分类中,然后对排序后的样本从头到尾遍历,依次将当前遍历样本统计左分类中,并且从右分类中删除。然后计算当前联合左分类和右分类的infoGain。
最终找到当前特征值属性下,联合左右分类的最大infoGain值,以及当前infoGain值下的样本集分类情况。

    (3)、infoGain越大,表示左右分类中样本分布在[0,9]上面越不平均;并且因为对样本根据特值征进行了排序,比如在第3000个样本时候,infoGain最大,则表示该节点下,当前特征
值大于等于第3000个样本当前特征值的,进入当前节点的左子节点,否则进入右子节点。

    (4)、遍历整个特征集合f,确定最大infoGain对应的特征属性以及他的样本分类情况。(比如第11个特征值,遍历到2500个样本时候,得到最大infoGain,则表示第11个特征属性就是当前节点
特征属性,第2500个样本对应的当前特征值作为子节点判断依据。如果测试样本在该节点当前特征值大于等于第2500样本当前特征值,则进入左子节点,否则进入右子节点,同时根据该特征
排序之后的前2500个样本,作为左子节点训练样本,其他的作为右子节点训练样本)。

    (5)、创建左右子节点,分别设置它们的id为当前节点id*2+1和当前节点id*2+2,并且将前面的分类样本分别放入子节点中。

  6、根据节点id,从id为0开始依次遍历,直到id=pow(2,树最大深度)为止。其中:
                                  (1)、如果当前遍历节点没有父节点,则该树节点不存在。
                                  (2)、如果当前遍历节点父节点为叶子节点,则该树节点不存在。
                                  (3)、如果当前遍历节点的子节点id大于了最大允许节点数量,则设置当前节点为叶子节点。
                                  (4)、如果当前遍历节点的训练样本数量小于了允许的最小样本分类,则设置该节点为叶子节点。

  7、如果某个节点被设置为叶子节点,则统计该节点下训练样本在[0,9]分类中,哪个分类下样本最多,则表示当前叶子节点标签为该分类标签。

  注意在模型训练树中,每个非叶子节点必须包含:当前最佳特征属性值(infoGain最大时候对应特征属性)以及特征分类阀值(infoGain最大时候,对应的前面例子中提到的第2500个样本的当前特征值)

测试流程

  1、获取到和训练集数据格式一致的测试数据集以及训练阶段获取到的训练模型。

  2、将测试样本丢入训练树中,从树节点id=0开始查找,如果当前根节点为叶子节点,则直接返回当前标签作为当前树分类结果。

  3、如果不是叶子节点,则找到当前节点在训练时候得到最大特征属性,根据测试样本当前特征值,是否大于该节点中保存的特征值阀值,来判断样本下一个搜索子节点。
如果大于当前节点特征值阀值,则下一个搜索节点为当前节点的左子节点,对应id为:当前id*2+1,否则进入当前节点的右子节点,对应id为:当前id*2+2。

  4、直到搜索到当前节点为叶子节点,表示当前树搜索完毕,返回当前叶子节点标签作为当前树分类结果。

  5、遍历整个模型,一共得到10个分类结果,统计比较在[0,9]上,哪个分类结果最多,则表示当前测试样本为该分类结果。

猜你喜欢

转载自blog.csdn.net/u011630458/article/details/78738039
今日推荐