您的位置:首页 > 编程语言 > Python开发

机器学习算法原理总结系列---算法基础之(3)随机森林(Random Forest)

2017-12-25 16:43 633 查看
刚接触这次词的同学们肯定又感觉,又是一个高上大的算法,其实不然。大家可以想象,随机森林,是一片森林吧。森林又是由树组成的吧,而树的本质其实就是分类器,广义的来说,什么SVM,又都是分类器,当然也包括决策树。所以从广义上它们都可以叫做树,堆积起来就是随机森林。但怎么很好地设计整个架构,那就看看第一部分的讲解吧。

一、原理详解

首先,上一节我讲述了决策树的原理,决策树对训练属于有很好的分类能力,但对未知的测试数据未必有很好的分类能力,泛化能力弱,即可能发生过拟合的现象。

之后我们会经常能听到过拟合这个词,因为在FNN,CNN,RNN中都会有相应的策略去防止过拟合。

对于决策树来说,我们可以通过

剪枝

随机森林

来尽量防止过拟合的现象出现。

接下来尝试理解几个概念:

Bootstraping:

Bootstrapping(拔靴法)算法,指的就是利用有限的样本资料经由多次重复抽样,重新建立起足以代表母体样本分布之新样本。bootstrapping的运用基于很多统计学假设,因此假设的成立与否会影响采样的准确性。

Bagging策略:

bootstrap aggregation

从样本集中重采样(有重复的)选出n个样本

在所有属性上,对这个n个样本建立分类器(ID3,C4.5,CART, SVM, Logistic回归等)

重复以上两步m次,即获得m个分类器

将数据放在这m个分类器上,最后根据这m个分类器的投票结果,决定数据属于哪一类

所以随机森林在bagging基础上做了修改。

从样本集中用Bootstrap采样选出n个样本;

从所有属性中随机选择k个属性,选择最佳分割属性作为节点建立CART决策树;

重复以上两步m次,即建立了m棵CART决策树

这m个CART形成随机森林,通过投票决定结果,决定数据属于哪一类。

简单来说,随机森林就是对决策树的集成,但有两点不同:

采样的差异性:从含m个样本的数据集中有放回的采样,得到含m个样本的采样集,用于训练。这样能保证每个决策树的训练样本不完全一样。

特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)

随机森林需要调整的参数有:

(1) 决策树的个数

(2) 特征属性的个数

(3) 递归次数(即决策树的深度)

代码实现流程:

导入文件并将所有特征转换为float形式

将数据集分成n份,方便交叉验证

构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征

构造决策树

创建随机森林(多个决策树的结合)

输入测试集并进行测试,输出预测结果

二、简单的scikit-learn代码实现

Iris数据集很重要,基本后面很多算法都是基于这个数据集进行训练和测试。

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。

其它比较流行的数据集还有Adult,Wine,Car Evaluation等。

iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。

该数据集包含了5个属性:

& Sepal.Length(花萼长度),单位是cm;

& Sepal.Width(花萼宽度),单位是cm;

& Petal.Length(花瓣长度),单位是cm;

& Petal.Width(花瓣宽度),单位是cm;

& 种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
# print(iris)
# print(iris.shape)

rf = RandomForestClassifier()  # 这里使用了默认的参数设置
rf.fit(iris.data[:150], iris.target[:150])  # 进行模型的训练

# 随机挑选两个预测不相同的样本
instance = iris.data[[40, 79]]
# print(instance)

print('instance 0 prediction:', rf.predict(np.array(instance[0]).reshape(1, -1)))
print('instance 1 prediction: ', rf.predict(np.array(instance[1]).reshape(1, -1)))
print(iris.target[40], iris.target[79])




这里可以简单的看出预测值和真实值完全一样。具体的算法识别成功率我就不去写测试逻辑了。众所周知,随机森林的识别率在iris数据及上表现是十分优秀的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 python 算法
相关文章推荐