Алгоритм случайного леса
Алгоритм случайного леса представляет собой совокупность алгоритмов деревьев решений. Модель дерева решений обычно обучается с использованием классификатора упаковки. Если вы не хотите использовать алгоритм классификатора упаковки для его передачи через модель классификации дерева решений, вы можете использовать алгоритм случайного леса, поскольку он более удобен и лучше оптимизирован для классификации дерева решений. В этой статье я познакомлю вас с алгоритмом случайного леса в машинном обучении.
Я буду использовать все ядра ЦП для обучения алгоритма RandomForestClassifier с 500 деревьями. Но сначала давайте начнем с импорта необходимых библиотек и подготовки данных, чтобы они соответствовали алгоритму RandomForestClassifier:
import sys assert sys.version_info >= (3, 5) # Scikit-Learn ≥0.20 is required import sklearn assert sklearn.__version__ >= "0.20" # Common imports import numpy as np import os # to make this notebook's output stable across runs np.random.seed(42) # To plot pretty figures %matplotlib inline import matplotlib as mpl import matplotlib.pyplot as plt mpl.rc('axes', labelsize=14) mpl.rc('xtick', labelsize=12) mpl.rc('ytick', labelsize=12)
Подготовка данных
Теперь я загружу данные и разделю их на обучающий и тестовый наборы:
from sklearn.model_selection import train_test_split from sklearn.datasets import make_moons X, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
А сейчас я подготовлю данные с помощью классификатора упаковки и модели классификации дерева решений:
from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier bag_clf = BaggingClassifier( DecisionTreeClassifier(splitter="random", max_leaf_nodes=16, random_state=42), n_estimators=500, max_samples=1.0, bootstrap=True, random_state=42) bag_clf.fit(X_train, y_train) y_pred = bag_clf.predict(X_test)
Алгоритм случайного леса в машинном обучении
С очень небольшим количеством параметров RandomForestClassifier использует все гиперпараметры модели классификации дерева решений и алгоритма классификатора упаковки. Теперь давайте посмотрим, как мы можем реализовать это:
from sklearn.ensemble import RandomForestClassifier rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, random_state=42) rnd_clf.fit(X_train, y_train) y_pred_rf = rnd_clf.predict(X_test) np.sum(y_pred == y_pred_rf) / len(y_pred)
Результат:
0.976
Алгоритм RandomForestClassifier работает, вводя дополнительную случайность при создании деревьев решений. Вместо поиска лучших функций он работает путем поиска лучших функций среди случайных наборов функций.
from sklearn.datasets import load_iris iris = load_iris() rnd_clf = RandomForestClassifier(n_estimators=500, random_state=42) rnd_clf.fit(iris["data"], iris["target"]) for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_): print(name, score)
Результат:
sepal length (cm) 0.11249225099876375
sepal width (cm) 0.02311928828251033
petal length (cm) 0.4410304643639577
petal width (cm) 0.4233579963547682
rnd_clf.feature_importances_
Результат:
array([0.11249225, 0.02311929, 0.44103046, 0.423358 ])
Граница решения для случайного леса
Теперь я построю границу решения на нашей модели. Для этого я сначала создам функцию для построения границы решения. Теперь давайте создадим функцию:
from matplotlib.colors import ListedColormap def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.45, -1, 1.5], alpha=0.5, contour=True): x1s = np.linspace(axes[0], axes[1], 100) x2s = np.linspace(axes[2], axes[3], 100) x1, x2 = np.meshgrid(x1s, x2s) X_new = np.c_[x1.ravel(), x2.ravel()] y_pred = clf.predict(X_new).reshape(x1.shape) custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0']) plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap) if contour: custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50']) plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8) plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha) plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha) plt.axis(axes) plt.xlabel(r"$x_1$", fontsize=18) plt.ylabel(r"$x_2$", fontsize=18, rotation=0) plt.figure(figsize=(6, 4)) for i in range(15): tree_clf = DecisionTreeClassifier(max_leaf_nodes=16, random_state=42 + i) indices_with_replacement = np.random.randint(0, len(X_train), len(X_train)) tree_clf.fit(X[indices_with_replacement], y[indices_with_replacement]) plot_decision_boundary(tree_clf, X, y, axes=[-1.5, 2.45, -1, 1.5], alpha=0.02, contour=False) plt.show()
Алгоритм случайного леса приводит к более высокой диверсификации деревьев, что позволяет торговать с очень высоким уровнем смещения для более низкой дисперсии. В целом это приводит к лучшей модели прогнозирования. Надеюсь, вам понравилась эта статья,