随机森林本质上是许多以不同方式过拟合的决策树的集合,我们可以对这些互不相同的树的结果取平均值来降低过拟合,这样既能减少过拟合又能保持树的预测能力。随机森林可用于回归或分类,通过sklearn.ensemble的RandomForestRegressor模块(回归)或RandomForestClassifier模块(分类)调用。
构造随机森林的步骤:
①确定用于构造的树的个数
②对数据进行自助采样
③基于新数据集构造决策树
要构造一个随机森林模型,第一步是确定森林中树的数目,通过模型的 进行调节。n_estimators越大越好,但占用的内存与训练和预测的时间也会相应增长,且边际效益是递减的,所以要在可承受的内存/时间内选取尽可能大的n_estimators。而在sklearn中,n_estimators默认为10。
随机森林之所以称为随机森林,是因为构造时添加了随机性,②与③正是随机性的体现。第二步是对数据进行自助采样,也就是说,从n_sample个数据点中有放回地重复随机抽取一个样本,共抽取n_sample次。新数据集的容量与原数据集相等,但抽取的采样往往与原数据集不同。注意,构建的n_estimators棵树采用的数据集都是独立自助采样的,这样才能保证所有树都互不相同。
接下来第三步就是基于这个新数据集来构造决策树。由于加入了随机性,故构造时与一般的决策树不同。构造时,在每个结点处选取特征的一个子集,并对其中一个特征寻找最佳测试。选取的特征子集中特征的个数通过max_features参数来控制,max_features越小,随机森林中的树就越不相同,但过小(取1时)会导致在划分时无法选择对哪个特征进行测试。而在sklearn中,max_features有以下几种选取方法:"auto", "sqrt", "log2", None。auto与sqrt都是取特征总数的开方,log2取特征总数的对数,None则是令max_features直接等于特征总数,而max_features的默认值是"auto"。
随机森林还有一个重要参数是n_jobs,决定了使用的CPU内核个数,使用更多的内核能使速度增快,而令n_jobs=-1可以调用所有内核。当然,构造时同样可以使用max_depth,min_samples_leaf和max_leaf_nodes来进行预剪枝,以减小内存占用与时间消耗。
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target,
stratify=cancer.target, random_state=4)
forest5 = RandomForestClassifier(n_estimators=5, random_state=0).fit(X_train, y_train)
print("n_estimators=5")
print("Accuracy on training set: {:.3f}".format(forest5.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}\n".format(forest5.score(X_test, y_test)))
forest100 = RandomForestClassifier(n_estimators=100, random_state=0).fit(X_train, y_train)
print("n_estimators=100")
print("Accuracy on training set: {:.3f}".format(forest100.score(X_train, y_train)))
print("Accuracy on test set: {:.3f}".format(forest100.score(X_test, y_test)))
n_estimators=5 Accuracy on training set: 0.998 Accuracy on test set: 0.923 n_estimators=100 Accuracy on training set: 1.000 Accuracy on test set: 0.972
预测时,若是回归任务,则对森林中的每棵树进行预测,对结果取平均值作为预测值;若是分类任务,则对森林中每棵树进行预测,每棵树给出每个可能输出的标签的概率,对每个标签取每棵树给出的概率的平均值,取概率最大的标签作为预测结果,称为软投票。
随机森林拥有决策树的所有优点,且给出的特征重要性比单棵树给出的更为可靠。但随机森林对维度较高的稀疏数据表现不好,且训练和预测的速度比线性模型要慢。
梯度提升回归树(gradient boosted decision tree, GBDT),也称为梯度提升机,采用连续的方式构造树,每棵树都试图纠正前一棵树的错误。与随机森林不同,梯度提升回归树没有使用随机化,而是用到了强预剪枝,从而使得梯度提升树往往深度很小,这样模型占用的内存少,预测的速度也快。梯度提升回归树同样可用于回归或分类,通过sklearn.ensemble的GradientBoostingRegressor模块(回归)或GradientBoostingClassifier模块(分类)调用。