随机森林(Random Forest,简称RF)时Bagging集成的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体地说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有
d
d
d个属性)中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含
k
k
k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
k
k
k控制了随机性的引入程度,一般情况下,
k
=
l
o
g
2
d
k=log_{2}d
k=log2d。
Sklearn中提供了专门的类来实现随机森林分类(RandomForestClassifier)和随机森林回归(RandomForestRegressor),这两个类中的参数及其取值与决策树分类和决策树回归基本相同,不再赘述。
下面以一组生成的分类数据来对比以决策树分类器为基学习器的Bagging模型和随机森林算法的效果:
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn import tree
import pydotplus
from IPython.display import Image
X,y=make_classification(n_samples=2000,n_features=15,
n_informative=2,n_redundant=0,
random_state=0,shuffle=False)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)
#基于决策树的传统Bagging型
clf=BaggingClassifier(n_estimators=50,random_state=0,oob_score=True)
clf.fit(X_train,y_train)
y_train_pred_bag=clf.predict(X_train)
y_test_pred_bag=clf.predict(X_test)
##随机森林
rf=RandomForestClassifier(n_estimators=50,max_depth=5,oob_score=True,
max_features='log2')
rf.fit(X_train,y_train)
y_train_pred_rf=rf.predict(X_train)
y_test_pred_rf=rf.predict(X_test)
print("Bagging方法-训练集准确率:",accuracy_score(y_train, y_train_pred_bag))
print("Bagging方法-测试集准确率:",accuracy_score(y_test, y_test_pred_bag))
print("RF算法-训练集准确率:",accuracy_score(y_train, y_train_pred_rf))
print("RF算法-测试集准确率:",accuracy_score(y_test, y_test_pred_rf))
其结果如下:
Bagging方法-训练集准确率: 1.0
Bagging方法-测试集准确率: 0.9875
RF算法-训练集准确率: 0.9925
RF算法-测试集准确率: 0.99
TIP:RF中可以通过相应参数的设置控制每个基决策树的生长,而Bagging中对于基决策树的生长限制较少。。
算法总结
- 随机森林简单、容易实现、计算开销小。
- 随机森林的训练可以并行进行,训练速度较快。
- 随机森林可以处理高维特征,且不用做特征选择。
- 随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动。随机森林的训练效率常优于Bagging。
参考资料
- 《机器学习》