Построение леса на наборе данных iris

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом практическом занятии показано, как построить поверхности принятия решений лесов случайных деревьев на наборе данных iris с использованием библиотеки scikit-learn для Python. Набор данных iris - это часто используемый набор данных для задач классификации. В этом практическом занятии мы сравним поверхности принятия решений, изученные классификатором дерева решений, случайным лесом, классификатором "экстра-деревьев" и классификатором AdaBoost.

Советы по использованию ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импорт библиотек

В этом шаге мы импортируем необходимые библиотеки для построения поверхностей принятия решений на наборе данных iris.

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

Определение параметров

В этом шаге мы определим параметры, необходимые для построения поверхностей принятия решений на наборе данных iris.

## 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

Загрузка данных

В этом шаге мы загрузим набор данных iris.

## Load data
iris = load_iris()

Определение моделей

В этом шаге мы определим модели, которые будут использоваться для построения поверхностей принятия решений на наборе данных iris.

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

Построение поверхностей принятия решений

В этом шаге мы построим поверхности принятия решений определенных моделей на наборе данных iris.

plot_idx = 1

for pair in ([0, 1], [0, 2], [2, 3]):
    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(3, 4, 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()

Резюме

В этом практическом занятии мы узнали, как построить поверхности принятия решений лесов случайных деревьев на наборе данных iris с использованием библиотеки scikit - learn для Python. Мы сравнили поверхности принятия решений, полученные классификатором дерева решений, случайным лесом, лесом из дополнительных деревьев и классификатором AdaBoost. Мы также узнали, как определить модели, построить поверхности принятия решений и загрузить данные в Python.