代码
在完成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
5import 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就是指
- Bootstrap中的随机选择子样本
- Random subspace的算法从属性集中随机选择k个属性,每个树节点分裂时,从这随机的k个属性,选择最优的
参考文献
[1].统计学习方法——CART, Bagging, Random Forest, Boosting http://blog.csdn.net/abcjennifer/article/details/8164315