- Модели для классификации: Случайный лес (Random Forest)
- Что такое Random Forest?
- Машинное обучение на Python
- Реализация Random Forest на Python
- Что такое алгоритм случайного леса в Apache Spark
- Как работает алгоритм случайного леса: особенности классификации
- Алгоритм случайного леса в Spark: несколько практических примеров
Модели для классификации: Случайный лес (Random Forest)
В прошлой статье мы рассматривали и даже реализовывали собственноручно такой метод классификации как дерево решений, сегодня будем разбираться с алгоритмом который базируется на деревьях решений– случайный лес (Random Forest).
Что такое Random Forest?
Random Forest (случайный лес) – это алгоритм машинного обучения, который используется для решения задач классификации и регрессии. Он является расширением алгоритма решающих деревьев, который использует ансамбль деревьев для улучшения качества классификации или регрессии.
Суть алгоритма заключается в том, что он создает множество решающих деревьев и использует их для предсказания классов объектов. Каждое дерево строится на случайном подмножестве обучающих данных и случайном подмножестве признаков. В результате, каждое дерево в ансамбле получается немного разным, что позволяет уменьшить эффект переобучения и повысить качество предсказаний.
Для построения каждого дерева случайного леса происходит следующее:
- Случайным образом выбирается подмножество обучающих объектов (bootstrap sample) из всего набора данных. Этот подмножество может содержать повторяющиеся объекты.
- Случайным образом выбирается подмножество признаков (обычно корень квадратный от общего числа признаков). Это позволяет уменьшить корреляцию между деревьями в ансамбле и улучшить их разнообразие.
- Строится дерево решений на выбранном подмножестве данных и признаков. При построении дерева используется критерий информативности (например, энтропийный критерий), который позволяет выбрать наилучший признак для разбиения данных на каждом уровне дерева.
- Повторяем шаги 1-3 для каждого дерева в ансамбле.
После построения всех деревьев в ансамбле, для каждого объекта данных происходит голосование по всем деревьям, и наиболее популярный класс становится предсказанным классом. В случае задачи регрессии, результаты всех деревьев усредняются, и это усредненное значение становится предсказанием.
Одно из главных преимуществ Random Forest заключается в том, что он позволяет оценить важность каждого признака для классификации объектов. Это можно сделать, используя атрибут feature_importances_ модели, который возвращает массив значений, отражающих важность каждого признака. Более важные признаки будут иметь более высокие значения.
Важно заметить, что Random Forest менее подвержен проблеме переобучения (overfitting) , что является одной из основных проблем в задачах машинного обучения. Это связано с тем, что каждое дерево строится на случайном подмножестве данных и признаков, что позволяет уменьшить корреляцию между деревьями и повысить их разнообразие.
Еще одним преимуществом Random Forest является его способность обрабатывать большое количество признаков и работать с данными различных типов (например, числовые, категориальные, текстовые). Кроме того, модель не требует сложной предобработки данных и может работать с пропущенными значениями.
Существует несколько параметров, которые можно настраивать при использовании Random Forest, например, количество деревьев в ансамбле, количество объектов и признаков в каждом подмножестве, критерий информативности, максимальную глубину деревьев и т.д. Настройка этих параметров может помочь улучшить качество модели и снизить вероятность переобучения.
Машинное обучение на Python
Код курса
PYML
Ближайшая дата курса
Длительность обучения
24 ак.часов
Стоимость обучения
49 500 руб.
Реализация Random Forest на Python
Так как Random Forest, это ансамбль деревьев решений, воспользуемся классом который реализует дерево решений, который мы реализовали в прошлой статье. Для начала импортируем всё библиотеки, которые нам пригодятся. Дерево решений я так же запаковал в .py файл и буду использовать здесь как библиотеку:
import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets from sklearn.metrics import accuracy_score from sklearn.datasets import make_classification from sklearn.metrics import classification_report from My_DecisionTree import DecisionTree # Класс реализованный в прошлой статье
Далее реализуем класс для обучения алгоритма леса решений:
class RandomForestClassifier: def __init__(self, n_estimators=100, max_depth=None, random_state=None): # Конструктор класса, устанавливающий параметры модели self.n_estimators = n_estimators # количество деревьев в лесу self.max_depth = max_depth # максимальная глубина деревьев self.random_state = random_state # случайное начальное состояние для генератора случайных чисел self.estimators = [] # список для хранения деревьев def fit(self, X, y): # Метод для обучения модели на тренировочных данных X и метках y rng = np.random.default_rng(self.random_state) # инициализация генератора случайных чисел for i in range(self.n_estimators): # Использование Bootstrap Aggregating для случайного выбора объектов для текущего дерева idxs = rng.choice(X.shape[0], X.shape[0]) X_subset, y_subset = X[idxs], y[idxs] # Создание и обучение дерева решений с заданными параметрами clf = DecisionTree(max_depth=self.max_depth) clf.fit(X_subset, y_subset) self.estimators.append(clf) # Добавление обученного дерева в список def predict(self, X): # Метод для предсказания меток на новых данных X y_pred = [] for i in range(len(X)): votes = <> # Словарь для подсчета голосов деревьев за каждый класс for clf in self.estimators: pred = clf.predict([X[i]])[0] # Предсказание метки на текущем дереве if pred not in votes: votes[pred] = 1 else: votes[pred] += 1 y_pred.append(max(votes, key=votes.get)) # Выбор метки с наибольшим количеством голосов return np.array(y_pred) # Возвращение предсказанных меток в виде массива numpy Далее обучим и оценим точность нашего алгоритма: # Генерируем данные для обучения X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1) clf = RandomForestClassifier(n_estimators=100, max_depth=3) clf.fit(X, y) # Прогнозируем метки классов y_pred = clf.predict(X) print(classification_report(y, y_pred)) OUT: precision recall f1-score support 0 0.91 0.94 0.93 500 1 0.94 0.91 0.92 500 accuracy 0.93 1000 macro avg 0.93 0.93 0.92 1000 weighted avg 0.93 0.93 0.92 1000
Как видим, если сравнивать с результатами классификации одним деревом, которые мы получили в прошлой статье, лес решений справляется лучше.
Далее визуально оценим как принимает решение наш алгоритм:
Источник
Что такое алгоритм случайного леса в Apache Spark
В прошлый раз мы говорили про архитектуру распределенной среды в Spark. Сегодня поговорим про особенности работы такого алгоритма машинного обучения, как случайный лес. Читайте далее про особенности работы со случайными лесами в Spark, благодаря которому Apache Spark имеет возможность Big Data анализа и классификации в распределенной среде.
Как работает алгоритм случайного леса: особенности классификации
Случайный лес (random forest) – это алгоритм машинного обучения, который заключается в использовании ансамбля (совокупности) деревьев решений (decision trees). Ключевая идея заключается в том, что качество классификации в случайном лесу повышается за счет большого количества ансамблей деревьев решений. Классификация проводится путем голосования деревьев, где каждое дерево относит классифицируемый объект к одному из классов. Побеждает тот класс, за который проголосовало наибольшее число деревьев. Оптимальное число деревьев подбирается таким образом, чтобы минимизировать ошибку классификации на тестовой выборке. В случае отсутствия ошибки, минимизируется оценка ошибки на образцах, не вошедших в набор [1].
Алгоритм случайного леса в Spark: несколько практических примеров
Для того, чтобы начать работу со случайным лесом, необходимо настроить базовую конфигурацию, импортировав некоторые классы ml-библитоеки Spark [2]:
# библиотека векторизации признаков from pyspark.ml.feature import VectorAssembler # библиотека оценки регресии from pyspark.ml.evaluation import RegressionEvaluator # библиотека алгортима случайного леса from pyspark.ml.regression import RandomForestRegressor
В качестве датасета будем использовать данные о кредитовании, в котором каждая запись представляет хорошего ( creditability=1 ) и плохого ( creditability=0. ) заемщика на основании его личных данных (например, возраст, кредитная история, сумма кредита и т.д.) Датасет можно сказать из источника здесь.
В первую очередь необходимо прочитать датасет с помощью pyspark [2]:
inputData = spark.read.csv("credit.csv", inferSchema=True, header=True)
Далее необходимо сформировать вектор признаков путем их векторизации с помощью класса VectorAssembler . Векторизованные признаки назовем features [2]:
assembler = VectorAssembler( inputCols=["amount", "savings", "assets", "age", "credits"], outputCol="features") output = assembler.transform(inputData)
После векторизации необходимо разбить выборку на обучающую и тестовую (стандартно, 70:30 соответстсвенно) [2]:
train, test = output.randomSplit([0.7, 0.3])
Далее применим модель случайного леса (за это отвечает класс RandomForestRegressor() и обучим ее на обучающей выборке данных с помощью метода fit() [2]:
rf = RandomForestRegressor(featuresCol="features", labelCol='creditability', numTrees=10) rfModel = rf.fit(train)
В качестве параметров конструктора класса у экземпляра RandomForestRegressor() используются следующие:
- featuresCol – колонка, содержащая вектор признаков, на основе которых ведется предсказание или классификация;
- labelCol – колонка целевой переменной, для которой идет предсказание (классификация)
- numTrees – количество деревьев, участвующих в классификации.
Для предсказания (или классификации) используется метод transform() . Следующий код на языке Python отвечает за формирование датасета с предсказаниями:
predictions = rfModel.transform(test)
Для оценки модели будем использовать регрессионный оценщик (класс RegressionEvaluator ), который включает в себя следующие свойства:
- labelCol – колонка, по которой велось предсказание или классификация;
- predictionCol – колонка, содержащая набор с предсказаниями;
- metricName – название метрики для оценки модели (в нашем случае для оценки используется среднеквадратичная ошибка (Root Mean Squared Error, RMSE)).
Следующий код на движке pyspark отвечает за формирование оценки модели [2]:
evaluator = RegressionEvaluator( labelCol="creditability", predictionCol="prediction", metricName="rmse") rmse = evaluator.evaluate(predictions) print("Root Mean Squared Error (RMSE) on test data = %g" % rmse)
Таким образом, благодаря поддержке алгоритма случайных лесов, Spark имеет возможность проводить классификацию в распределенной среде, используя огромные массивы данных для обучения, что может способствовать обучению весьма эффективных моделей. Все это делает фреймворк Apache Spark весьма полезным средством для Data Scientist’а и разработчика Big Data приложений.
Больше подробностей про применение Apache Spark в проектах анализа больших данных, разработки Big Data приложений и прочих прикладных областях Data Science вы узнаете на практических курсах по Spark в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:
Источник