随机森林
集成学习
集成学习是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。一般情况下,集成学习中的多个学习器都是同质的"弱学习器"。
Boosting Bagging
Boosting和Bagging都是将弱分类器组装成强分类器的算法。
- Bagging:
1.从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
2.每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
3.对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
- Boosting:
其主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。(其实这个也就是一个数学上的解释,一切方法即使它效果再好,大家也一定会在数学上严格证明它的正确性)
关于Boosting的两个核心问题:
1.在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮那些分对样例的权值,来使得分类器对误分的数据有较好的效果。
2.通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。
而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
- Bagging,Boosting二者之间的区别
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
其实这两种方法就是两种不同思想的体现而已,一个相当于圆桌会议,大家互相独立进行投票得出结论,一种相当于一个会进步的人,每次做出的结论都与正确结论进行比较,每次都会有进步,向正确的结论靠拢。
随机森林
接下来我们要讲的随机森林其实就是Bagging + Decision Tree 的组合,跟Boosting没什么关系,所以说随机森林首先是可以并行的,各棵树都独立。
-
简单提一下 Decision Tree:主要有ID3 C4.5 CART三种算法来建树,其中ID3和C4.5(多叉树)都是基于信息熵,ID3是根据信息增益,C4.5是根据信息增益率,CART(二叉树)则是根据GINI指数,其实GINI指数在本质上和信息熵代表的是一个东西,都是越小则代表相应的属性中各类别越集中,可以理解为信息量比较少,比如性别这个属性下,某个节点全是男性,则表明这个节点很“纯”。
-
与上面介绍的Bagging过程相似,随机森林的构建过程大致如下:
从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
对于n_tree个训练集,我们分别训练n_tree个决策树模型
对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
怎么样,是不是感觉贼简单?对的,如果感觉随机森林很简单,那说明它肯定有很多不足的地方。
- 优点:
1、 在当前的很多数据集上,相对其他算法有着很大的优势,表现良好
2、它能够处理很高维度的数据,并且不用做特征选择,因为特征子集是随机选择的
3、在训练完后,它能够得出特征重要性
4、在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强
5、随机森林有oob,不需要单独换分交叉验证集
6、训练时树与树之间是相互独立的,训练速度快,容易做成并行化方法
7、对缺失值不敏感,如果有很大一部分的特征遗失,仍可以维持准确度。
- 缺点:
1、随机森林在某些噪音较大的分类或回归问题上会过拟合
2、对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响
sklearn参数
RandomForestClassifier(n_estimators=10,criterion=’gini’, max_depth=None,min_samples_split=2,min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None,
verbose=0, warm_start=False, class_weight=None)
其中最重要的是n_estimators
代表了随机森林中决策树的个数,一般我们建数百棵树是比较好的选择。
max_depth
代表树的最大深度,max_features
代表寻求最优分裂时考虑的最大特征数,'auto'即代表sqrt(n_features)
- 属性:
estimators_:决策树列表
拟合好的字分类器列表,也就是单个决策树
classes_:array of shape = [n_features]
类别标签列表
n_classes_:int or list
类别数量
n_features:int
拟合过程中使用的特征的数量
n_outputs:int
拟合过程中输出的数量
featrue_importances:特征重要程度列表
值越大,说明越重要
oob_score:array of shape = [n_features]
使用oob数据集测试得到的得分数
oob_decision_funtion_:array of shape = [n_features, n_classes]
oob样本预测结果,每一个样本及相应结果对列表
- 方法:
行为样本第几个样本,列为每棵树预测的叶子节点。
参数:
X : 类似数组或稀疏矩阵,shape = [n_samples,n_features]
输入样本。在内部,它的dtype将被转换为 dtype=np.float32。如果提供稀疏矩阵,则将其转换为稀疏矩阵csr_matrix。
返回:
X_leaves : array_like,shape = [n_samples,n_estimators]
对于X中的每个数据点x和林中的每个树,返回叶子x的索引。
decision_path(X):返回森林中的决策路径
fit(X, y[, sample_weight]):用训练数据集(x, y)来构造森林
get_params([deep]):获得分类器的参数
predict(X):预测X的类别
predict_log_proba(X):预测X的类的对数概率,和predict_proba类似,只是取了对数
predict_proba(X):预测X的类别的概率。输入样本的预测类别概率被计算为森林中树木的平均预测类别概率。
单个树的类概率是叶中同一类的样本的比率。因为叶子节点并不是完全纯净的,它也有杂质,
不同种类所占恶比率是不一样的,但肯定有一类纯度很高。返回值是array of shape = [n_samples, n_classes]
score(X, y[,sample_weight]):返回给定的数据集(数据集指定了类别)的预测准确度
set_params(**params):设置决策树的参数
第一篇技术博客介绍RF就到这里,下次应该会讲讲GBDT和XGB。
网友评论