实验思路: 首先训练10个基分类器,每个基分类器为一个决策树;在预测时对每个基分类器投票结果进行统计倒排,选取票数最多的结果;其中每棵树的生长情况如下: 如果培训集中的案例数为 N,则随机取样 N 案例 - 但从原始数据中替换。此示例将是种植树的培训集。 如果有 M 输入变量,则指定一个数字 m<<M,以便在每个节点中随机从 M 中选择 m 变量,并且这些 m 上的最佳拆分用于拆分节点。在森林生长过程中,m 值保持不变。 每棵树都尽可能的生长。没有修剪。 查看随机森林官网描述 fit训练
for model in self.models: # 获取模型使用的训练特征 modelFeatures = list(model.keys())[0].split('000')[:-1] # 提取出模型预测需要的标签 test_data = features[modelFeatures] # 基分类器进行预测 r = list(model.values())[0].predict(test_data) vote.append(r) # 将数组转换为矩阵 10行45列 vote = np.array(vote) # print(vote.shape) # print(vote)
for i inrange(len(features)): # 对每棵树的投票结果进行排序选取最大的 v = sorted(Counter(vote[:, i]).items(), key=lambda x: x[1], reverse=True) # 查看投票情况和实际标签对比 print(v, "---",list(target)[i]) result.append(v[0][0]) return result # ************* End **************# defconnect(self, ls): s = '' for i in ls: s += i + '000' return s
主函数
1 2 3 4 5 6 7 8 9 10 11
if __name__ == '__main__': Bcf = BaggingClassifier() featureAndTarget = Bcf.dataset() Bcf.fit(featureAndTarget[0],featureAndTarget[2]) res = Bcf.predict(features=featureAndTarget[1], target=featureAndTarget[3]['target_names']) right = 0 for i, j inzip(featureAndTarget[3]['target_names'], res): if i == j: right += 1 #print(i + '\t' + j) print('准确率为' + str(right / len(res) * 100) + "%")