热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算gini随机森林_随机森林

一、简介随机森林是利用多棵树对样本进行训练并预测的一种分类器。随机选择特征数目,随机选择训练数据,对同一个预测数据取出现次数最多的预测标签为最终预测标签

一 、简介

随机森林是利用多棵树对样本进行训练并预测的一种分类器。

随机选择特征数目,随机选择训练数据,对同一个预测数据取出现次数最多的预测标签为最终预测标签。

随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。首先,用bootstrap方法生成m个训练集,然后,对于每个训练集,构造一颗决策树,在节点找特征进行分裂的时候,并不是对所有特征找到能使得指标(如信息增益)最大的,而是在特征中随机抽取一部分特征,在抽到的特征中间找到最优解,应用于节点,进行分裂。随机森林的方法由于有了bagging,也就是集成的思想在,实际上相当于对于样本和特征都进行了采样(如果把训练数据看成矩阵,就像实际中常见的那样,那么就是一个行和列都进行采样的过程),所以可以避免过拟合。

prediction阶段的方法就是bagging的策略,分类投票,回归均值。

二、算法

  1. N来表示训练用例(样本)的个数,M表示特征数目。
  2. 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M
  3. N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
  4. 对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
  5. 每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。

三、优点

1)对于很多种资料,它可以产生高准确度的分类器;

2)它可以处理大量的输入变数;

3)它可以在决定类别时,评估变数的重要性;

4)在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计;

5)它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;

6)它提供一个实验方法,可以去侦测variable interactions;

7)对于不平衡的分类资料集来说,它可以平衡误差;

8)它计算各例中的亲近度,对于数据挖掘、侦测离群点(outlier)和将资料视觉化非常有用;

9)使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;

10)学习过程是很快速的。

四、代码实现

决策树构建等

参考决策树算法

import csv
import numpy as np
import random
import copy
import operatordef loadDataset(filename):with open(filename, &#39;r&#39;) as f:lines &#61; csv.reader(f)data_set &#61; list(lines)if filename !&#61; &#39;titanic.csv&#39;:for i in range(len(data_set)):del(data_set[i][0])# 整理数据for i in range(len(data_set)):del(data_set[i][0])del(data_set[i][2])data_set[i][4] &#43;&#61; data_set[i][5]del(data_set[i][5])del(data_set[i][5])del(data_set[i][6])del(data_set[i][-1])category &#61; data_set[0]del (data_set[0])# 转换数据格式for data in data_set:data[0] &#61; int(data[0])data[1] &#61; int(data[1])if data[3] !&#61; &#39;&#39;:data[3] &#61; float(data[3])else:data[3] &#61; Nonedata[4] &#61; float(data[4])data[5] &#61; float(data[5])# 补全缺失值 转换记录方式 分类for data in data_set:if data[3] is None:data[3] &#61; 28# male : 1, female : 0if data[2] &#61;&#61; &#39;male&#39;:data[2] &#61; 1else:data[2] &#61; 0# age <25 为0, 25<&#61;age<31为1&#xff0c;age>&#61;31为2if data[3] <60: # 但是测试得60分界准确率最高&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff01;&#xff01;data[3] &#61; 0else:data[3] &#61; 1# sibsp&parcg以2为界限&#xff0c;小于为0&#xff0c;大于为1if data[4] <2:data[4] &#61; 0else:data[4] &#61; 1# fare以64为界限if data[-1] <64:data[-1] &#61; 0else:data[-1] &#61; 1return data_set, categorydef gini(data, i):num &#61; len(data)label_counts &#61; [0, 0, 0, 0]p_count &#61; [0, 0, 0, 0]gini_count &#61; [0, 0, 0, 0]for d in data:label_counts[d[i]] &#43;&#61; 1for l in range(len(label_counts)):for d in data:if label_counts[l] !&#61; 0 and d[0] &#61;&#61; 1 and d[i] &#61;&#61; l:p_count[l] &#43;&#61; 1print(label_counts)print(p_count)for l in range(len(label_counts)):if label_counts[l] !&#61; 0:gini_count[l] &#61; 2*(p_count[l]/label_counts[l])*(1 - p_count[l]/label_counts[l])gini_p &#61; 0for l in range(len(gini_count)):gini_p &#43;&#61; (label_counts[l]/num)*gini_count[l]print(gini_p)return gini_pdef get_best_feature(data, category):if len(category) &#61;&#61; 2:return 1, category[1]feature_num &#61; len(category) - 1data_num &#61; len(data)feature_gini &#61; []for i in range(1, feature_num&#43;1):feature_gini.append(gini(data, i))min &#61; 0for i in range(len(feature_gini)):if feature_gini[i] # 三种结束情况# 取分类标签(survivor or death)class_list &#61; [exampel[0] for exampel in data]if class_list &#61;&#61; []:return Node(0)# 如果类别完全相同则停止分类if class_list.count(class_list[0]) &#61;&#61; len(class_list):return Node(class_list[0])# 遍历完所有特征时返回出现次数最多的类标签if len(data[0]) &#61;&#61; 1:return Node(majority_cnt(class_list))# 最优特征的标签best_feature_num, best_feature_label &#61; get_best_feature(data, labels)feature_labels.append(best_feature_label)node &#61; Node(best_feature_label)ldata &#61; []rdata &#61; []for d in data:if d[best_feature_num] &#61;&#61; 1:del(d[best_feature_num])ldata.append(d)else:del(d[best_feature_num])rdata.append(d)labels2 &#61; copy.deepcopy(labels)del(labels2[best_feature_num])tree &#61; nodetree.lchild &#61; creat_tree(ldata, labels2, feature_labels)tree.rchild &#61; creat_tree(rdata, labels2, feature_labels)return treedef breadth_travel(tree):"""广度遍历"""queue &#61; [tree]while queue:cur_node &#61; queue.pop(0)print(cur_node.name, end&#61;" ")if cur_node.lchild is not None:queue.append(cur_node.lchild)if cur_node.rchild is not None:queue.append(cur_node.rchild)print()def prediction(t_tree, test, labels):result &#61; []for data in test:l &#61; []l &#61; copy.deepcopy(labels)tree &#61; t_treefor i in range(len(labels)):if tree.name &#61;&#61; 1 or tree.name &#61;&#61; 0:result.append(tree.name)breakj &#61; 1while j:if tree.name &#61;&#61; l[j]:breakj &#43;&#61; 1if data[j] &#61;&#61; 1:tree &#61; tree.lchildelse:tree &#61; tree.rchilddel(l[j])del(data[j])return result

随机森林的预测代码

def new_pre(t_test, labels, tree):result &#61; []r &#61; []for i in range(len(t_test)):label &#61; []label &#61; copy.deepcopy(labels[i])print(label)breadth_travel(tree[i])r.append(prediction(tree[i], t_test[i], label))rr &#61; []for i in range(len(r[0])):rr.append([])for i in range(len(rr)):for j in range(len(r)):rr[i].append(r[j][i])print(rr)for i in range(len(rr)):result.append(majority_cnt(rr[i]))return result

读取数据

test_set, category &#61; loadDataset(&#39;titanic_test.csv&#39;)data_set, category &#61; loadDataset(&#39;titanic.csv&#39;)

生成

随机选取三个特征&#xff0c;生成十棵树

tree_num &#61; 10bootstrapping &#61; []b_category &#61; []b_test &#61; []for i in range(tree_num):b_category.append(copy.deepcopy(category))b_test.append(copy.deepcopy(test_set))bootstrapping.append([])for j in range(len(data_set)):bootstrapping[i].append(copy.deepcopy(data_set[int(np.floor(np.random.random() * len(data_set)))]))print(test_set)print(b_test)# m &#61; 3,此处选取随机去掉的两个特征n &#61; 2n_num_category &#61; []for i in range(tree_num):n_num_category.append(random.sample(range(1, 5), n))print(n_num_category)print(b_category)for i in range(len(b_category)):for j in range(n):b_category[i][n_num_category[i][j]] &#61; 0for j in range(n):b_category[i].remove(0)for k in range(len(b_test[i])):for j in range(2):b_test[i][k][n_num_category[i][j]] &#61; -1for k in range(len(b_test[i])):for j in range(2):b_test[i][k].remove(-1)for k in range(len(bootstrapping[i])):for j in range(2):bootstrapping[i][k][n_num_category[i][j]] &#61; -1for k in range(len(bootstrapping[i])):for j in range(2):bootstrapping[i][k].remove(-1)print(b_category)print(b_test)print(bootstrapping)b2_category &#61; copy.deepcopy(b_category)my_tree &#61; []for i in range(tree_num):my_tree.append(creat_tree(bootstrapping[i], b2_category[i]))for i in range(tree_num):print(b_category[i])breadth_travel(my_tree[i])

计算准确率

result &#61; new_pre(b_test, b_category, my_tree)print(result)counts &#61; 0for i in range(len(test_set)):if test_set[i][0] &#61;&#61; result[i]:counts &#43;&#61; 1print(counts)print(counts/len(test_set))

五、结果展示及分析

准确率&#xff1a;63.7%

低于其他方法的结果&#xff0c;考虑是由于本身特征较少&#xff0c;再随机选取特征之后生成的决策树效果较差&#xff0c;导致最后集成的效果也变差了。



推荐阅读
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文详细介绍了如何使用 Python 进行主成分分析(PCA),包括数据导入、预处理、模型训练和结果可视化等步骤。通过具体的代码示例,帮助读者理解和应用 PCA 技术。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有