随机森林属于集成学习(Ensemble Learning)中的bagging算法。在集成学习中,主要分为bagging算法和boosting算法。我们先看看这两种方法的特点和区别。
bagging的算法过程如下:
1)从原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k个训练集。(k个训练集之间相互独立,元素可以有重复)
2)对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等)
3)对于分类问题:由投票表决产生分类结果;对于回归问题:由k个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同)
boosting的算法过程如下:
1)对于训练集中的每个样本建立权值wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值。
2)进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型。(例如AdaBoost给每个弱分类器一个权值,将其线性组合最为最终分类器。误差越小的弱分类器,权值越大)
样本选择上: | Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。 |
样本权重: | Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。 |
预测函数: | Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。 |
并行计算: | Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。 |
下面是将决策树与这些算法框架进行结合所得到的新的算法:
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT
机器学习实战笔记2—决策树
随机森林是一种重要的基于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)随机森林模型还有许多不好解释的地方,有点算个黑盒模型
#随机森林
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]) #实际结果
代码结果:
相关函数介绍:
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())
代码结果: