上篇文章介绍了集成学习
的相关概念以及基于 Boosting的 AdaBoost,这篇文章将介绍基于模型融合的另外一种方式 Bagging 的算法,随机森林(Random Forest)。(上篇公式敲的太累了这篇就来个简单的缓解缓解)html
咱们先来看看这个算法的名字,能够拆分开为两部分,随机和森林。森林咱们很容易能够想到,就是有不少棵树,即由多颗决策树组成。那么随机指的是什么呢?这里咱们来看看 Bagging
的思想了。python
首先先说说自助采样
(Bootstrap Sanpling)算法
指任何一种有放回的均匀抽样,也就是说,每当选中一个样本,它等可能地被再次选中并被再次添加到训练集中。app
而 Bagging 则是利用自助采样获得 T 组训练样本集,分别利用这些训练样本集训练 T 个分类器,最后进行集成的方法。从 Bias-Variance 分解的角度看, Bagging 主要关注下降方差。dom
那么,咱们大概就能知道这个随机大概是什么意思了,就是随机抽取训练集。学习
那么,问题又来了,究竟是随机抽取必定量的样本呢仍是抽取部分特征呢?答案是都有,随机在这两方面都有所体现。spa
因此能够列出这么一个等式—— Random Forest = Bagging + Fully-Grown CART with Random Subspace。rest
其特色为:code
知道了随机森林的算法思想后,知道了最后是须要将全部决策树的预测结果进行集成,那咱们采用什么方法进行集成呢?htm
大概有如下几种方法:
emmmmmmmmmmm。。。。忽然发现竟然没有什么数学推导????惊了
下面的代码是基于投票法策略写的
def bagging(X, y, T, size, seed=0, max_depth=None): """ Bagging算法,分类器为CART,用于二分类 参数: X: 训练集 y: 样本标签 T: T组 size: 每组训练集的大小 seed: 随机种子 max_depth: 基学习器CART决策树的最大深度 返回: F: 生成的模型 """ classifiers = [] m, n = X.shape np.random.seed(seed) for i in range(T): # 使用np.random.choice选择size个序号,注意replace参数的设置,以知足有放回的均匀抽样。 index = np.random.choice(m,size) X_group = X[index] y_group = y[index] # 使用tree.DecisionTreeClassifier,设置max_depth=None, min_samples_split=2(生成彻底树),random_state=0 t = DecisionTreeClassifier(max_depth=max_depth, min_samples_split=2, random_state=0) # 开始训练 # print(y_group.shape) t.fit(X_group, y_group) classifiers.append(t) def F(X): # 计算全部分类器的预测结果 result = [] for t in classifiers: result.append(t.predict(X)) # 把预测结果组成 num_X * T 的矩阵 pred = np.vstack(result).T # 计算"0"有多少投票 vote_0 = T - np.sum(pred, axis=1) # 计算"1"有多少投票 vote_1 = np.sum(pred, axis=1) # 选择投票数最多的一个标签 pred = (vote_1 > vote_0).astype(int) return pred return F
上篇的 AdaBoost 一堆公式推导,这就来了篇简单的缓解缓解,写着写着发现就写完了并且尚未公式的时候瞬间惊了,下篇该系列文章就来说讲数据挖掘竞赛中熟知的 GBDT
。