机器学习实战笔记8—随机森林

注:此系列文章里的部分算法和深度学习笔记系列里的内容有重合的地方,深度学习笔记里是看教学视频做的笔记,此处文章是看《机器学习实战》这本书所做的笔记,虽然算法相同,但示例代码有所不同,多敲一遍没有坏处,哈哈。(里面用到的数据集、代码可以到网上搜索,很容易找到。)。Python版本3.6

机器学习十大算法系列文章:

机器学习实战笔记1—k-近邻算法

机器学习实战笔记2—决策树

机器学习实战笔记3—朴素贝叶斯

机器学习实战笔记4—Logistic回归

机器学习实战笔记5—支持向量机

机器学习实战笔记6—AdaBoost

机器学习实战笔记7—K-Means

机器学习实战笔记8—随机森林

机器学习实战笔记9—人工神经网络

此系列源码在我的GitHub里:https://github.com/yeyujujishou19/Machine-Learning-In-Action-Codes

一,算法原理:

随机森林属于集成学习(Ensemble Learning)中的bagging算法。在集成学习中,主要分为bagging算法boosting算法。我们先看看这两种方法的特点和区别。

Bagging(套袋法)

bagging的算法过程如下:

1)从原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k个训练集。(k个训练集之间相互独立,元素可以有重复)
2)对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等)
3)对于分类问题:由投票表决产生分类结果;对于回归问题:由k个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同)

Boosting(提升法)

boosting的算法过程如下:

1)对于训练集中的每个样本建立权值wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值。
2)进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型。(例如AdaBoost给每个弱分类器一个权值,将其线性组合最为最终分类器。误差越小的弱分类器,权值越大)

Bagging,Boosting的主要区别

样本选择上: Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。
样本权重 Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
预测函数:
Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。
并行计算: Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。


下面是将决策树与这些算法框架进行结合所得到的新的算法:

1)Bagging + 决策树 = 随机森林

2)AdaBoost + 决策树 = 提升树

3)Gradient Boosting + 决策树 = GBDT

决策树(Decision Tree)

机器学习实战笔记2—决策树

随机森林(Random Forests)

随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。

与上面介绍的Bagging过程相似,随机森林的构建过程大致如下:

1)从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
2)对于n_tree个训练集,我们分别训练n_tree个决策树模型
3)对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
4)每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
5)将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

二,算法的优缺点:

优点:

1)具有极高的准确率
2)随机性的引入,使得随机森林不容易过拟合
3)随机性的引入,使得随机森林有很好的抗噪声能力
4)能处理很高维度的数据,并且不用做特征选择
5)既能处理离散型数据,也能处理连续型数据,数据集无需规范化
6)训练速度快,可以得到变量重要性排序
7)容易实现并行化

缺点:

1)当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
2)随机森林模型还有许多不好解释的地方,有点算个黑盒模型

三,实例代码:

代码一:对IRIS数据集训练测试

#随机森林

from sklearn.tree import DecisionTreeRegressor  #DecisionTreeClassifier 能够对数据进行多分类的类。
from sklearn.ensemble import RandomForestRegressor  
import numpy as np  

from sklearn.datasets import load_iris  
iris=load_iris()  
#print iris#iris的4个属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度 
## 标签是花的种类:setosa versicolour virginica
print(iris['target'].shape)
rf=RandomForestRegressor()#这里使用了默认的参数设置  
rf.fit(iris.data[:150],iris.target[:150])#进行模型的训练  
#    

#随机挑选两个预测不相同的样本  
instance=iris.data[[100,109]]
print("打印测试数据")
print(instance)
rf.predict(instance[[0]])
print('instance 0 prediction;',rf.predict(instance[[0]]))   #预测结果
print( 'instance 1 prediction;',rf.predict(instance[[1]]))  #预测结果
print(iris.target[100],iris.target[109])   #实际结果

代码结果:

机器学习实战笔记8—随机森林_第1张图片

代码二:随机森林分类器、决策树、extra树分类器的比较

相关函数介绍:

1,make_blobs聚类数据生成器

2,cross_val_score()函数介绍

3,DecisionTreeClassifier参数详解

4,RandomForestClassifier参数详解

#随机森林分类器、决策树、extra树分类器的比较

#random forest test
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.tree import DecisionTreeClassifier

#make_blobs聚类数据生成器
'''
n_samples是待生成的样本的总数。
n_features是每个样本的特征数。
centers表示类别数。
cluster_std表示每个类别的方差,例如我们希望生成2类数据,其中一类比另一类具有更大的方差,可以将cluster_std设置为[1.0,3.0]。
'''
X, y = make_blobs(n_samples=10000, n_features=10, centers=100,random_state=0)

#决策树分类器
clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)
scores = cross_val_score(clf, X, y) #验证某个模型在某个训练集上的稳定性,输出k个预测精度
print("决策树分类器:",scores.mean())

#随机森林分类器
clf = RandomForestClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)#验证某个模型在某个训练集上的稳定性,输出k个预测精度
print("随机森林分类器:",scores.mean())

#extra树分类器
clf = ExtraTreesClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores = cross_val_score(clf, X, y)#验证某个模型在某个训练集上的稳定性,输出k个预测精度
print("extra树分类器:",scores.mean())

代码结果:

机器学习实战笔记8—随机森林_第2张图片

 

欢迎扫码关注我的微信公众号

你可能感兴趣的:(ML)