随机森林Random Forest

代码

在完成Kaggle竞赛(一)预测泰坦尼克号幸存者 数据导入和预处理后,我们首先使用了分类里最基本的算法决策树来完成第一个分类模型,现在来看下一个模型随机森林Random Forest。

1
2
3
4
5
# 载入准确度检验函数
shuffle_validator = cross_validation.ShuffleSplit(len(X), n_iter=20, test_size=0.2, random_state=0)
def test_classifier(clf):
scores = cross_validation.cross_val_score(clf, X, y, cv=shuffle_validator)
print("Accuracy: %0.4f (+/- %0.2f)" % (scores.mean(), scores.std()))

1
2
3
4
5
import sklearn.ensemble as ske
# Random forest
clf_rf = ske.RandomForestClassifier(n_estimators=100)
clf_rf.fit (X_train, y_train)
test_classifier(clf_rf)

Accuracy: 0.8101 (+/- 0.03)

和上篇类似,如果只对代码感兴趣,可以在此停住。下面会是一些原理部分。

原理

classification tree非常简单,但是经常会有noisy classifiers. 于是引入ensemble classifiers: bagging, random forest(决策树和bagging的结合), 和boosting。

一般的,用团体学习会比不用的算法准确度高, Boosting > Bagging > Classification tree(single tree)。

Bagging装袋算法

Bagging算法 (英语:Bootstrap aggregating,引导聚集算法),又称装袋算法,是机器学习领域的一种团体学习ensemble算法。最初由Leo Breiman于1994年提出。 Bagging算法可与其他分类、回归算法结合,提高其准确率、稳定性的同时,通过降低结果的方差,避免过拟合的发生。

Bagging的策略:

  • 从样本集中用Bootstrap采样选出n个样本
  • 在所有属性上,对这n个样本建立分类器(CART or SVM or ...)
  • 重复以上两步m次,i.e.build m个分类器(CART or SVM or ...)
  • 将数据放在这m个分类器上跑,最后vote看到底分到哪一类

下图是Bagging的选择策略,每次从N个数据中采样n次得到n个数据的一个bag,总共选择B次得到B个bags,也就是B个bootstrap samples.

Random forest随机森林

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

  • 从样本集中用Bootstrap采样选出n个样本,预建立CART
  • 在树的每个节点上,从所有属性中随机选择k个属性,选择出一个最佳分割属性作为节点
  • 重复以上两步m次,i.e.build m棵CART
  • 这m个CART形成Random Forest

这里的random就是指

  1. Bootstrap中的随机选择子样本
  2. Random subspace的算法从属性集中随机选择k个属性,每个树节点分裂时,从这随机的k个属性,选择最优的

参考文献

[1].统计学习方法——CART, Bagging, Random Forest, Boosting http://blog.csdn.net/abcjennifer/article/details/8164315