在Iris數據集上繪制樹集成的決策曲面?

使用Iris數據集的一對特征訓練隨機樹的森林, 并繪制決策界面。

此圖比較了決策樹分類器(第一列)、隨機森林分類器(第二列)、極端樹分類器(第三列)和AdaBoost分類器(第四列)學習的決策面。

在第一行中,分類器只使用萼片寬度和萼片長度特征,第二行僅使用花瓣長度和萼片長度,第三行僅使用花瓣寬度和花瓣長度。

按照得分的降序,當使用30個估計器對所有4個特性進行訓練(在本示例之外)并使用10倍交叉驗證得分時,我們看到:

ExtraTreesClassifier()  # 0.95 score
RandomForestClassifier()  # 0.94 score
AdaBoost(DecisionTree(max_depth=3))  # 0.94 score
DecisionTree(max_depth=None)  # 0.94 score

增加AdaBoost的 max_depth會降低分數的標準差(但平均分數沒有提高)。

有關每個模型的更多細節,請參見控制臺的輸出。

在本例中,您可以嘗試:

  1. 對于 DecisionTreeClassifierAdaBoostClassifier, 可以改變 max_depth , 或許可以嘗試對于 DecisionTreeClassifier max_depth=3, 而對于AdaBoostClassifier可以是 max_depth=None
  2. 改變 n_estimators

值得注意的是,RandomForests和ExtraTrees可以在許多內核上并行訓練,因為每棵樹都是獨立于其他樹構建的。AdaBoost的樹是按順序構建的,因此不要使用多個核。

DecisionTree with features [01] has a score of 0.9266666666666666
RandomForest with 30 estimators with features [01] has a score of 0.9266666666666666
ExtraTrees with 30 estimators with features [01] has a score of 0.9266666666666666
AdaBoost with 30 estimators with features [01] has a score of 0.8533333333333334
DecisionTree with features [02] has a score of 0.9933333333333333
RandomForest with 30 estimators with features [02] has a score of 0.9933333333333333
ExtraTrees with 30 estimators with features [02] has a score of 0.9933333333333333
AdaBoost with 30 estimators with features [02] has a score of 0.9933333333333333
DecisionTree with features [23] has a score of 0.9933333333333333
RandomForest with 30 estimators with features [23] has a score of 0.9933333333333333
ExtraTrees with 30 estimators with features [23] has a score of 0.9933333333333333
AdaBoost with 30 estimators with features [23] has a score of 0.9933333333333333
print(__doc__)

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

from sklearn.datasets import load_iris
from sklearn.ensemble import (RandomForestClassifier, ExtraTreesClassifier,
                              AdaBoostClassifier)
from sklearn.tree import DecisionTreeClassifier

# Parameters
n_classes = 3
n_estimators = 30
cmap = plt.cm.RdYlBu
plot_step = 0.02  # fine step width for decision surface contours
plot_step_coarser = 0.5  # step widths for coarse classifier guesses
RANDOM_SEED = 13  # fix the seed on each iteration

# Load data
iris = load_iris()

plot_idx = 1

models = [DecisionTreeClassifier(max_depth=None),
          RandomForestClassifier(n_estimators=n_estimators),
          ExtraTreesClassifier(n_estimators=n_estimators),
          AdaBoostClassifier(DecisionTreeClassifier(max_depth=3),
                             n_estimators=n_estimators)]

for pair in ([01], [02], [23]):
    for model in models:
        # We only take the two corresponding features
        X = iris.data[:, pair]
        y = iris.target

        # Shuffle
        idx = np.arange(X.shape[0])
        np.random.seed(RANDOM_SEED)
        np.random.shuffle(idx)
        X = X[idx]
        y = y[idx]

        # Standardize
        mean = X.mean(axis=0)
        std = X.std(axis=0)
        X = (X - mean) / std

        # Train
        model.fit(X, y)

        scores = model.score(X, y)
        # Create a title for each column and the console by using str() and
        # slicing away useless parts of the string
        model_title = str(type(model)).split(
            ".")[-1][:-2][:-len("Classifier")]

        model_details = model_title
        if hasattr(model, "estimators_"):
            model_details += " with {} estimators".format(
                len(model.estimators_))
        print(model_details + " with features", pair,
              "has a score of", scores)

        plt.subplot(34, plot_idx)
        if plot_idx <= len(models):
            # Add a title at the top of each column
            plt.title(model_title, fontsize=9)

        # Now plot the decision boundary using a fine mesh as input to a
        # filled contour plot
        x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
        y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
        xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                             np.arange(y_min, y_max, plot_step))

        # Plot either a single DecisionTreeClassifier or alpha blend the
        # decision surfaces of the ensemble of classifiers
        if isinstance(model, DecisionTreeClassifier):
            Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
            Z = Z.reshape(xx.shape)
            cs = plt.contourf(xx, yy, Z, cmap=cmap)
        else:
            # Choose alpha blend level with respect to the number
            # of estimators
            # that are in use (noting that AdaBoost can use fewer estimators
            # than its maximum if it achieves a good enough fit early on)
            estimator_alpha = 1.0 / len(model.estimators_)
            for tree in model.estimators_:
                Z = tree.predict(np.c_[xx.ravel(), yy.ravel()])
                Z = Z.reshape(xx.shape)
                cs = plt.contourf(xx, yy, Z, alpha=estimator_alpha, cmap=cmap)

        # Build a coarser grid to plot a set of ensemble classifications
        # to show how these are different to what we see in the decision
        # surfaces. These points are regularly space and do not have a
        # black outline
        xx_coarser, yy_coarser = np.meshgrid(
            np.arange(x_min, x_max, plot_step_coarser),
            np.arange(y_min, y_max, plot_step_coarser))
        Z_points_coarser = model.predict(np.c_[xx_coarser.ravel(),
                                         yy_coarser.ravel()]
                                         ).reshape(xx_coarser.shape)
        cs_points = plt.scatter(xx_coarser, yy_coarser, s=15,
                                c=Z_points_coarser, cmap=cmap,
                                edgecolors="none")

        # Plot the training points, these are clustered together and have a
        # black outline
        plt.scatter(X[:, 0], X[:, 1], c=y,
                    cmap=ListedColormap(['r''y''b']),
                    edgecolor='k', s=20)
        plot_idx += 1  # move on to the next plot in sequence

plt.suptitle("Classifiers on feature subsets of the Iris dataset", fontsize=12)
plt.axis("tight")
plt.tight_layout(h_pad=0.2, w_pad=0.2, pad=2.5)
plt.show()

腳本的總運行時間:(0分9.465秒)

Download Python source code: plot_forest_iris.py

Download Jupyter notebook: plot_forest_iris.ipynb