Алгоритм случайного леса
Алгоритм случайного леса представляет собой совокупность алгоритмов деревьев решений. Модель дерева решений обычно обучается с использованием классификатора упаковки. Если вы не хотите использовать алгоритм классификатора упаковки для его передачи через модель классификации дерева решений, вы можете использовать алгоритм случайного леса, поскольку он более удобен и лучше оптимизирован для классификации дерева решений. В этой статье я познакомлю вас с алгоритмом случайного леса в машинном обучении.
Я буду использовать все ядра ЦП для обучения алгоритма 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()

Алгоритм случайного леса приводит к более высокой диверсификации деревьев, что позволяет торговать с очень высоким уровнем смещения для более низкой дисперсии. В целом это приводит к лучшей модели прогнозирования. Надеюсь, вам понравилась эта статья,



