随机森林

    随机森林的思想:随机取样,创建M棵决策树,并对决策树的结果进行投票,选出最多的类别作为最后的分类结果。这里在创建决策树的时候引入了基尼指数的概念,基尼指数和信息增益的作用一样,都是选出数据集的最佳分界点,不过这里选择的是最小的基尼指数,每一个划分好的数据集就是一颗决策树,计算每棵决策树的基尼指数选出最小的基尼指数的树的特征,索引等信息。这里有一个剪枝的处理,取出左右子集,如果左右子树为空,就强制产生叶节点,或者树的深度超过最大深度,就对树进行剪枝,忽略超过最大深度的结点。如果左右子集中的样本数太少,就强制产生叶节点。否则就对左右子树进行划分,保证树的生成。我们随机取出一部分数据,在这个数据的基础上进行建树,组成森林,找到最大的预测值。

       随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。

这里的树是一个CART树。

代码:

# -*- coding: utf-8 -*-
# Random Forest Algorithm on Sonar Dataset
from random import seed     
from random import randrange
from csv import reader
from math import sqrt
import numpy as np
# 加载数据
def load_csv(filename):dataset = list()     #建立空列表with open(filename, 'r') as file:csv_reader = reader(file)if not row:continuedataset.append(row)return dataset# 转化成浮点类型
def str_column_to_float(dataset, column):for row in dataset:row[column] = float(row[column].strip())# 字符串转化成整数类型
#def str_column_to_int(dataset, column):
#    class_values = [row[column] for row in dataset]
#    unique = set(class_values)
#    lookup = dict()
#    for i, value in enumerate(unique):
#        lookup[value] = i
#    for row in dataset:
#        row[column] = lookup[row[column]]
#    return lookup#将数据集分成K折叠  将数据分为n_folds份,继续存在列表中
def cross_validation_split(dataset, n_folds):dataset_split = list()dataset_copy = list(dataset)fold_size = int(len(dataset) / n_folds)for i in range(n_folds):fold = list()while len(fold) < fold_size:index = randrange(len(dataset_copy))fold.append(dataset_copy.pop(index))dataset_split.append(fold)return dataset_split# Calculate accuracy percentage
#计算准确性百分比
def accuracy_metric(actual, predicted):correct = 0for i in range(len(actual)):if actual[i] == predicted[i]:correct += 1return correct / float(len(actual)) * 100.0#使用交叉验证来评估算法
def evaluate_algorithm(dataset, algorithm, n_folds, *args):folds = cross_validation_split(dataset, n_folds)scores = list()for fold in folds:train_set = list(folds)train_set.remove(fold)train_set = sum(train_set, [])test_set = list()for row in fold:row_copy = list(row)test_set.append(row_copy)row_copy[-1] = Nonepredicted = algorithm(train_set, test_set, *args)  #random_forest随机森林 返回的是最大的预测值actual = [row[-1] for row in fold]#真实值accuracy = accuracy_metric(actual, predicted)scores.append(accuracy)return scores  #基于属性值拆分数据集
def test_split(index, value, dataset):left, right = list(), list()for row in dataset:if row[index] < value:left.append(row)else:right.append(row)return left, right# Calculate the Gini index for a split dataset
#计算分割数据集的Gini索引
def gini_index(groups, classes):# count all samples at split point  在分离点清点所有样本n_instances = float(sum([len(group) for group in groups]))# sum weighted Gini index for each group    每组加权Gini指数gini = 0.0for group in groups:size = float(len(group))# avoid divide by zero    避免以零为除if size == 0:continuescore = 0.0# score the group based on the score for each class  每组评分for class_val in classes:p = [row[-1] for row in group].count(class_val) / sizescore += p * p# weight the group score by its relative size   基尼指数计算gini += (1.0 - score) * (size / n_instances)return gini# Select the best split point for a dataset
#选择数据集的最佳分界点
def get_split(dataset, n_features):class_values = list(set(row[-1] for row in dataset))    #取出样本类别标签b_index, b_value, b_score, b_groups = 999, 999, 999, Nonefeatures = list()while len(features) < n_features:index = randrange(len(dataset[0])-1)     #随机获取n_features个特征用于创建决策树if index not in features:features.append(index)for index in features:    #对某一个特征进行操作for row in dataset:    #尝试逐个样本的值作为划分左右子集的标准groups = test_split(index, row[index], dataset)    #按照样本row的index特征值将样本集合dataset分为两个子集gini = gini_index(groups, class_values)    #左右子集的gini之和,取最小值来选取测试属性if gini < b_score:b_index, b_value, b_score, b_groups = index, row[index], gini, groups  #更新最佳特征的相关信息return {'index':b_index, 'value':b_value, 'groups':b_groups}    #返回测试属性和左右子集和划分左右子集的标准# Create a terminal node value
#创建终端节点值
def to_terminal(group):  #强制产生叶节点,并标记节点为类别样本数目最多的类别outcomes = [row[-1] for row in group]return max(set(outcomes), key=outcomes.count)#为节点创建子拆分或创建终端
def split(node, max_depth, min_size, n_features, depth):left, right = node['groups']   #取出左右子集del(node['groups'])# check for a no splitif not left or not right:   #左右子集为空,强制产生叶节点,并标记节点为类别样本数目最多的类别node['left'] = node['right'] = to_terminal(left + right)  return# check for max depthif depth >= max_depth:   #决策树层数过多,强制产生叶节点,并标记节点为类别样本数目最多的类别;depth一般默认设置为1表示当前在根节点分支node['left'], node['right'] = to_terminal(left), to_terminal(right)return# process left childif len(left) <= min_size: #左子集中样本数过少,强制产生叶节点,并标记节点为类别样本数目最多的类别   node['left'] = to_terminal(left)else:node['left'] = get_split(left, n_features)  #对左子集进行分支,即决策树的递归操作split(node['left'], max_depth, min_size, n_features, depth+1)# process right child    if len(right) <= min_size: #右子集中样本数过少,强制产生叶节点,并标记节点为类别样本数目最多的类别node['right'] = to_terminal(right)else:node['right'] = get_split(right, n_features)  #对右子集进行分支,决策树递归split(node['right'], max_depth, min_size, n_features, depth+1)# Build a decision tree    建立决策树
def build_tree(train, max_depth, min_size, n_features):root = get_split(train, n_features)split(root, max_depth, min_size, n_features, 1)return root# Make a prediction with a decision tree
#用决策树做预测
def predict(node, row):if row[node['index']] < node['value']:if isinstance(node['left'], dict):return predict(node['left'], row)else:return node['left']else:if isinstance(node['right'], dict):return predict(node['right'], row)else:return node['right']# Create a random subsample from the dataset with replacement
#创建数据集中的随机子示例,并进行替换
def subsample(dataset, ratio):sample = list()n_sample = round(len(dataset) * ratio)  #round() 方法返回浮点数x的四舍五入值。while len(sample) < n_sample:index = randrange(len(dataset))sample.append(dataset[index])return sample# Make a prediction with a list of bagged trees
#利用随机森林预测类别
def bagging_predict(trees, row):predictions = [predict(tree, row) for tree in trees]return max(set(predictions), key=predictions.count)#随机森林算法
def random_forest(train, test, max_depth, min_size, sample_size, n_trees, n_features):trees = list()for i in range(n_trees):sample = subsample(train, sample_size)tree = build_tree(sample, max_depth, min_size, n_features)trees.append(tree)predictions = [bagging_predict(trees, row) for row in test]return(predictions)#测试随机森林算法
seed(2)
#装载和准备数据
filename = 'sonar-all-data.csv'
dataset = load_csv(filename)for i in range(0, len(dataset[0])-1):str_column_to_float(dataset, i)
#将类列转换为整数
#str_column_to_int(dataset, len(dataset[0])-1)
# evaluate algorithm   评估算法
n_folds = 5
max_depth = 10
min_size = 1
sample_size = 1.0
n_features = int(sqrt(len(dataset[0])-1))
for n_trees in [1, 5, 10]:scores = evaluate_algorithm(dataset, random_forest, n_folds, max_depth, min_size, sample_size, n_trees, n_features)print('Trees: %d' % n_trees)print('Scores: %s' % scores) #准确性百分比print('Mean Accuracy: %.3f%%' % (sum(scores)/float(len(scores))))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux静态库和动态库的设计

静态库和动态库的设计 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供 Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下&#xff0c;其中采用*.so.*方式命名的是动态函数库…

操作excel

static void create(String path) throws Exception {//读取文件FileInputStream in new FileInputStream(path);XSSFWorkbook wb new XSSFWorkbook(in);// 获得该工作区的第一个sheetXSSFSheet sheet wb.getSheetAt(0);int rowNum sheet.getLastRowNum();//行int columnNu…

无法安装软件之解决其一 (windows installer服务篇)

早上接到兄弟求助&#xff0c;无法安装软件&#xff0c;于是把最直接方法告诉他&#xff0c;还原啊。但ghost 进程到一半就当了&#xff0c;真是对不起他。。挂了电话后查了一下&#xff0c;现将方法总结如下&#xff1a;两种环境1 windows 2000系统 中&#xff1a;第一步&…

决策树——CART和模型树

CART树 理解&#xff1a; 如果CART树处理离散型数据&#xff0c;叫做分类决策树&#xff0c;那么&#xff0c;引入基尼指数作为寻找最好的数据划分的依据&#xff0c;基尼指数越小&#xff0c;说明数据的“纯度越高”&#xff0c;随机森林的代码里边就运用到了基尼指数。如…

宏比较值,坑的一B

昨晚上&#xff0c;我准备睡觉&#xff0c;连总给我发了一段代码#include "stdio.h"#define MAX_MACRO(a, b) ((a) > (b) ? (a) : (b)) int MAX_FUNC(int a, int b) {return ((a) > (b) ? (a) : (b)); }int main() {unsigned int a 1;int b -1;printf(&quo…

Linux下Samba服务器搭建

linux文件共享之samba服务器 ——ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 关闭LINUX防火墙命令&#xff1a; #ufwdisable 然后就在windows下ping一下linux的IP&#xff0c;如果能ping通&#xff0c;就可以继续下面的内容&#xff0c;如果p…

日志分析linux命令

1、查看文件内容&#xff1a;cat 。-n显示行号。 2. more&#xff1a;全屏幕分页显示文件的内容。下一页&#xff1a;space键&#xff1b;上一页&#xff1a;B&#xff1b;停止&#xff1a;Q&#xff1b;显示下一行&#xff1a;Enter&#xff1b; 3. less&#xff1a;在文件最…

C#比较两时间大小

1。比较时间大小的实验 string st1"12:13"; string st2"14:14"; DateTime dt1Convert.ToDateTime(st1); DateTime dt2Convert.ToDateTime(st2); DateTime dt3DateTime.Now; if(DateTime.Compare(dt1,dt2)>0) msg.Textst1">…

搞懂C++为什么难学,看这篇就够了!

学C能干什么&#xff1f; 往细了说&#xff0c;后端、客户端、游戏引擎开发以及人工智能领域都需要它。往大了说&#xff0c;构成一个工程师核心能力的东西&#xff0c;都在C里。跟面向对象型的语言相比&#xff0c;C是一门非常考验技术想象力的编程语言&#xff0c;因此学习起…

2017 实习面试问题总结(阿里、头条、美团、cvte、乐视、华为)

2017 实习面试问题总结&#xff08;阿里、头条、美团、cvte、乐视、华为&#xff09; Java后台面试 常见问题转载于:https://www.cnblogs.com/straybirds/p/8319566.html

SAP BC417 课程中文自学笔记

BC417: BAPI Development for Accessing SAP Components开发自定义 BAPI 的方法http://files.cnblogs.com/qiangsheng/SAP_BC417.rarhttp://files.cnblogs.com/qiangsheng/SAP_BC417_appendix.rar

看图学源码之FutureTask

RunnableFuture 源码学习&#xff1a; 成员变量 任务的运行状态的转化 package java.util.concurrent; import java.util.concurrent.locks.LockSupport;/**可取消的异步计算。该类提供了Future的基本实现&#xff0c;包括启动和取消计算的方法&#xff0c;查询计算是否完成以…

单片机的引脚,你都清楚吗?

第1课&#xff1a;单片机简叙1.单片机可以做什么&#xff1f;目前单片机渗透到我们生活的各个领域&#xff0c;几乎很难找到哪个领域没有单片机的踪迹。小到电话&#xff0c;玩具&#xff0c;手机&#xff0c;各类刷卡机&#xff0c;电脑键盘&#xff0c;彩电&#xff0c;冰箱&…

Graphviz的安装及纠错

在Anaconda Prompt里边输入conda install graphviz 安装成功之后输入pip install graphviz 它会提示成功安装。 启动 Jupyter Notebook &#xff0c;在文件里边输入 import graphviz 测试&#xff0c;如果没有报错证明&#xff0c;模块安装成功&#xff0c;但是在运行程序…

基于ubuntu13.04搜狗输入法安装方法

基于ubuntu13.04搜狗输入法安装方法 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 sudo gedit etcaptsources.list 在打开的文件中加入以下两行&#xff1a; deb http ppa.launchpad.netfcitx-teamnightlyubuntu quantal main deb-src http ppa.lau…

给磁盘加个背景

给你的磁盘加上漂亮的背景先看下效果&#xff1a;具体方法&#xff1a;很简单的方法&#xff0c;新建一个文本文档输入以下内容&#xff1a;[ExtShellFolderViews]{BE098140-A513-11D0-A3A4-00C04FD706EC}{BE098140-A513-11D0-A3A4-00C04FD706EC}[{BE098140-A513-11D0-A3A4-00C…

/etc/fstab 参数详解及如何设置开机自动挂载

某些时候当Linux系统下划分了新的分区后&#xff0c;需要将这些分区设置为开机自动挂载&#xff0c;否则&#xff0c;Linux是无法使用新建的分区的。 /etc/fstab 文件负责配置Linux开机时自动挂载的分区。 Windows的文件结构是多个并列的树状结构&#xff0c;最顶部的是不同的磁…

sklearn——决策树

总结sklearn决策树的使用&#xff0c;方便以后查阅。1.分类决策树 &#xff08;基于CART树&#xff09; 原型&#xff1a;参数&#xff1a;2、回归分类树 原型&#xff1a;参数&#xff1a;3、export_graphviz 当训练完毕一颗决策树时&#xff0c;可以通过sklearn.tree.expor…

Linux下SVN服务器的搭建

Linux下SVN服务器的搭建 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、下载工具&#xff08;下载地址&#xff1a;&#xff09; subversion-1.6.1.tar.gz subversion-deps-1.6.1.tar.gz 2、解压两个包&#xff1a; a) tar -xzvf subvers…

记一次解决问题的掉坑过程

这两天在调试一个音频ADC 芯片&#xff0c;也是之前的项目&#xff0c;但是一直调不出来&#xff0c;我发现我总是在这样的问题上纠结很久&#xff0c;以前踩过的坑后面照样会踩&#xff0c;只不过踩完会迅速把脚拉出来继续前进&#xff0c;我经常听到有人说「做嵌入式真的太容…