绘制随机森林每棵树的决策边界
首先导入必要的库函数:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
import mglearn
使用make_moons数据集构造一个有5棵树的随机森林模型,观察每棵树的决策边界。
X, y = make_moons(n_samples=100,noise=0.25,random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)forest = RandomForestClassifier(n_estimators=5,random_state=2)
forest.fit(X_train,y_train)
随机森林用到了ensemble集成的思想,即使用多棵决策树集成一个随机森林模型,并通过自助采样(从n_samples个数据点中有放回地重复随机抽取一个样本,并抽取n_samples次),并对每个结点使用的特征(单棵决策树使用特征进行决策:if/else)进行随机选择,保证随机森林中每一棵树都是随机的(两两不同),这样保证了每棵树都是随机的,优化了决策树过拟合的缺点。
加下来查看随机森林中五棵树的决策边界:
fig, axes = plt.subplots(2,3,figsize=(20,10))
for i, (ax, tree) in enumerate(zip(axes.ravel(),forest.estimators_)):ax.set_title("Tree {}".format(i))mglearn.plots.plot_tree_partition(X_train, y_train, tree, ax=ax)mglearn.plots.plot_2d_separator(forest, X_train, fill=True, ax=axes[-1,-1],alpha=.4)
axes[-1,-1].set_title("Random Forest")
mglearn.discrete_scatter(X_train[:,0],X_train[:,1],y_train)
输出如下:
可以看到每棵树的决策边界差异都不小,最终集成的随机森林模型的决策边界会变得非常平滑。
使用随即森林进行特征选择
由于决策树自身就可以进行特征选择,因此对于其集成的随机森林,进行特征选择更不在话下。此外,其特征选择的能力往往比单棵决策树好。使用乳腺癌数据集训练一个由100棵决策树集成的随机森林模型,并进行特征选择。
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, random_state=66)
forest.fit(X_train,y_train)print("Acc on training set:{:.2f}".format(forest.score(X_train,y_train)))
print("Acc on test set:{:.2f}".format(forest.score(X_test,y_test)))
Acc on training set:0.99
Acc on test set:0.95
def plot_feature_importances_cancer(model):n_features = cancer.data.shape[1]plt.barh(range(n_features), model.feature_importances_, align="center")plt.yticks(np.arange(n_features), cancer.feature_names)plt.xlabel("Feature importance")plt.ylabel("Feature")plot_feature_importances_cancer(forest)
显然,相较于决策树的特征选择结果,随机森林能够选择更多的特征。下面是使用单棵决策树在乳腺癌数据集上的特征选择结果。