创建单层提升树 :param trainDataArr:训练数据集数组 :param trainLabelArr: 训练标签集数组 :param D: 算法8.1中的D :return: 创建的单层提升树
(trainDataArr, trainLabelArr, D)
| 93 | return np.array(predict), e |
| 94 | |
| 95 | def createSigleBoostingTree(trainDataArr, trainLabelArr, D): |
| 96 | ''' |
| 97 | 创建单层提升树 |
| 98 | :param trainDataArr:训练数据集数组 |
| 99 | :param trainLabelArr: 训练标签集数组 |
| 100 | :param D: 算法8.1中的D |
| 101 | :return: 创建的单层提升树 |
| 102 | ''' |
| 103 | |
| 104 | #获得样本数目及特征数量 |
| 105 | m, n = np.shape(trainDataArr) |
| 106 | #单层树的字典,用于存放当前层提升树的参数 |
| 107 | #也可以认为该字典代表了一层提升树 |
| 108 | sigleBoostTree = {} |
| 109 | #初始化分类误差率,分类误差率在算法8.1步骤(2)(b)有提到 |
| 110 | #误差率最高也只能100%,因此初始化为1 |
| 111 | sigleBoostTree['e'] = 1 |
| 112 | |
| 113 | #对每一个特征进行遍历,寻找用于划分的最合适的特征 |
| 114 | for i in range(n): |
| 115 | #因为特征已经经过二值化,只能为0和1,因此分切分时分为-0.5, 0.5, 1.5三挡进行切割 |
| 116 | for div in [-0.5, 0.5, 1.5]: |
| 117 | #在单个特征内对正反例进行划分时,有两种情况: |
| 118 | #可能是小于某值的为1,大于某值得为-1,也可能小于某值得是-1,反之为1 |
| 119 | #因此在寻找最佳提升树的同时对于两种情况也需要遍历运行 |
| 120 | #LisOne:Low is one:小于某值得是1 |
| 121 | #HisOne:High is one:大于某值得是1 |
| 122 | for rule in ['LisOne', 'HisOne']: |
| 123 | #按照第i个特征,以值div进行切割,进行当前设置得到的预测和分类错误率 |
| 124 | Gx, e = calc_e_Gx(trainDataArr, trainLabelArr, i, div, rule, D) |
| 125 | #如果分类错误率e小于当前最小的e,那么将它作为最小的分类错误率保存 |
| 126 | if e < sigleBoostTree['e']: |
| 127 | sigleBoostTree['e'] = e |
| 128 | #同时也需要存储最优划分点、划分规则、预测结果、特征索引 |
| 129 | #以便进行D更新和后续预测使用 |
| 130 | sigleBoostTree['div'] = div |
| 131 | sigleBoostTree['rule'] = rule |
| 132 | sigleBoostTree['Gx'] = Gx |
| 133 | sigleBoostTree['feature'] = i |
| 134 | #返回单层的提升树 |
| 135 | return sigleBoostTree |
| 136 | |
| 137 | def createBosstingTree(trainDataList, trainLabelList, treeNum = 50): |
| 138 | ''' |
no test coverage detected