Алгоритм случайного леса с Python и Scikit-Learn
Случайный лес-это тип контролируемого алгоритма машинного обучения, основанного на ансамблевом обучении . Ансамблевое обучение-это тип обучения, при котором вы объединяете различные типы алгоритмов или один и тот же алгоритм несколько раз, чтобы сформировать более мощную модель прогнозирования. Алгоритм random forest объединяет несколько алгоритмов одного и того же типа , т. е. несколько решений деревьев , в результате чего получается лес деревьев , отсюда и название “Случайный лес”. Алгоритм случайного леса может быть использован как для регрессионных, так и для классификационных задач.
Как работает алгоритм Случайного леса
Ниже приведены основные шаги, связанные с выполнением алгоритма случайного леса:
- Выберите N случайных записей из набора данных.
- Постройте дерево решений на основе этих N записей.
- Выберите нужное количество деревьев в вашем алгоритме и повторите шаги 1 и 2.
- В случае регрессионной задачи для новой записи каждое дерево в лесу предсказывает значение Y (выход). Конечное значение можно вычислить, взяв среднее значение всех значений, предсказанных всеми деревьями в лесу. Или, в случае проблемы классификации, каждое дерево в лесу предсказывает категорию, к которой принадлежит новая запись. Наконец, новый рекорд присваивается той категории, которая получает большинство голосов.
Преимущества использования случайного леса
Как и в любом алгоритме, в его использовании есть свои преимущества и недостатки. В следующих двух разделах мы рассмотрим плюсы и минусы использования случайного леса для классификации и регрессии.
- Алгоритм случайного леса не является предвзятым, поскольку существует несколько деревьев, и каждое дерево обучается на подмножестве данных. В принципе, алгоритм случайного леса опирается на силу “толпы”, поэтому общая предвзятость алгоритма уменьшается.
- Этот алгоритм очень стабилен. Даже если новая точка данных введена в набор данных, общий алгоритм не сильно пострадает, так как новые данные могут повлиять на одно дерево, но ему очень трудно повлиять на все деревья.
- Алгоритм случайного леса хорошо работает, когда у вас есть как категориальные, так и числовые признаки.
- Алгоритм случайного леса также хорошо работает, когда данные имеют пропущенные значения или они не были хорошо масштабированы (хотя мы выполнили масштабирование объектов в этой статье только для демонстрации).
Недостатки использования случайного леса
- Основным недостатком случайных лесов является их сложность. Они требовали гораздо больше вычислительных ресурсов из-за большого количества деревьев решений, соединенных вместе.
- Из-за своей сложности они требуют гораздо больше времени для обучения, чем другие сопоставимые алгоритмы.
На протяжении всей остальной части этой статьи мы увидим, как библиотека Python Scikit-Learn может быть использована для реализации алгоритма случайного леса для решения задач регрессии, а также классификации.
Часть 1: Использование случайного леса для регрессии
В этом разделе мы рассмотрим, как случайные леса могут быть использованы для решения регрессионных задач с помощью Scikit-Learn. В следующем разделе мы решим задачу классификации с помощью случайных лесов.
Определение проблемы
Проблема здесь заключается в том, чтобы спрогнозировать потребление газа (в миллионах галлонов) в 48 штатах США на основе налога на бензин (в центах), дохода на душу населения (в долларах), мощеных автомагистралей (в милях) и доли населения с водительскими правами.
Решение
Для решения этой регрессионной задачи мы будем использовать алгоритм случайного леса с помощью библиотеки Scikit-Learn Python. Мы будем следовать традиционному конвейеру машинного обучения, чтобы решить эту проблему. Выполните следующие действия:
1. Импорт библиотек
Выполните следующий код для импорта необходимых библиотек:
import pandas as pd import numpy as np
2. Импорт набора данных
Набор данных для этой задачи доступен по адресу:
Набор данных для этой задачи доступен по адресу:
Для этого урока набор данных был загружен в папку “Datasets” диска “D”. Вам нужно будет изменить путь к файлу в соответствии с вашими собственными настройками.
Выполните следующую команду для импорта набора данных:
dataset = pd.read_csv('D:\Datasets\petrol_consumption.csv')
Чтобы получить высокоуровневое представление о том, как выглядит набор данных, выполните следующую команду:
dataset.head()
9.0 | 0 | 3571 | 1976 | 541 | 0.525 |
9.0 | 1 | 4092 | 1250 | 524 | 0.572 |
9.0 | 2 | 3865 | 1586 | 561 | 0.580 |
7.5 | 3 | 4870 | 2351 | 414 | 0.529 |
8.0 | 4 | 4399 | 431 | 410 | 0.544 |
Мы видим, что значения в нашем наборе данных не очень хорошо масштабируются. Мы уменьшим их масштаб перед обучением алгоритма.
3. Подготовка Данных Для Обучения
В этом разделе будут выполнены две задачи. Первая задача состоит в том, чтобы разделить данные на наборы “атрибутов” и “меток”. Полученные данные затем делятся на обучающие и тестовые наборы.
Следующий скрипт делит данные на атрибуты и метки:
X = dataset.iloc[:, 0:4].values y = dataset.iloc[:, 4].values
Наконец, давайте разделим данные на обучающие и тестовые наборы:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
4. Масштабирование функций
Мы знаем, что наш набор данных еще не является масштабируемым значением, например, поле Average_Income имеет значения в диапазоне тысяч, в то время как Petrol_tax имеет значения в диапазоне десятков. Поэтому было бы полезно масштабировать наши данные (хотя, как упоминалось ранее, этот шаг не так важен для алгоритма случайных лесов). Для этого мы будем использовать класс Scikit-Learn StandardScaler
. Для этого выполните следующий код:
# Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
5. Обучение алгоритму
Теперь, когда мы масштабировали наш набор данных, пришло время обучить наш алгоритм случайного леса решению этой регрессионной задачи. Выполните следующий код:
from sklearn.ensemble import RandomForestRegressor regressor = RandomForestRegressor(n_estimators=20, random_state=0) regressor.fit(X_train, y_train) y_pred = regressor.predict(X_test)
Класс RandomForestRegressor
библиотеки sklearn.ensemble
используется для решения регрессионных задач с помощью случайного леса. Наиболее важным параметром класса RandomForestRegressor
является параметр n_estimators
. Этот параметр определяет количество деревьев в случайном лесу. Мы начнем с n_estimator=20
, чтобы увидеть, как работает наш алгоритм. Вы можете найти подробную информацию обо всех параметрах RandomForestRegressor
| здесь .
6. Оценка алгоритма
Последним и завершающим шагом решения задачи машинного обучения является оценка производительности алгоритма. Для регрессионных задач метриками, используемыми для оценки алгоритма, являются средняя абсолютная ошибка, средняя квадратическая ошибка и среднеквадратичная ошибка. Выполните следующий код, чтобы найти эти значения:
from sklearn import metrics print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred)) print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred)) print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
Вывод будет выглядеть примерно так:
Mean Absolute Error: 51.765 Mean Squared Error: 4216.16675 Root Mean Squared Error: 64.932016371
При 20 деревьях среднеквадратичная ошибка составляет 64,93, что больше 10 процентов от среднего расхода бензина, то есть 576,77. Это может указывать, среди прочего, на то, что мы недостаточно использовали оценки (деревья).
Если число оценщиков изменить на 200, то результаты будут следующими:
Mean Absolute Error: 47.9825 Mean Squared Error: 3469.7007375 Root Mean Squared Error: 58.9041657058
На следующей диаграмме показано уменьшение значения среднеквадратичной ошибки (RMSE) по отношению к числу оценок. Здесь ось X содержит число оценок , а ось Y-значение среднеквадратичной ошибки .
Вы можете видеть, что значения ошибок уменьшаются с увеличением числа оценщиков. После 200 скорость уменьшения ошибки уменьшается, поэтому 200-это хорошее число для n_estimators
. Вы можете поиграть с количеством деревьев и другими параметрами, чтобы увидеть, сможете ли вы получить лучшие результаты самостоятельно.
Часть 2: Использование случайного леса для классификации
Определение проблемы
Задача здесь состоит в том, чтобы предсказать, является ли банкнота подлинной или нет, основываясь на четырех атрибутах: дисперсии изображения, преобразованного вейвлетом, асимметрии, энтропии и куртозе изображения.
Решение
Это проблема бинарной классификации, и для ее решения мы будем использовать классификатор случайных лесов. Шаги, выполняемые для решения этой проблемы, будут аналогичны шагам, выполняемым для регрессии.
1. Импорт библиотек
import pandas as pd import numpy as np
2. Импорт набора данных
Набор данных можно загрузить по следующей ссылке:
Набор данных можно загрузить по следующей ссылке:
Подробная информация о данных доступна по следующей ссылке:
Подробная информация о данных доступна по следующей ссылке:
Следующий код импортирует набор данных:
dataset = pd.read_csv("D:/Datasets/bill_authentication.csv")
Чтобы получить высокоуровневое представление набора данных, выполните следующую команду:
dataset.head()
0 | -0.44699 | -2.8073 | 8.6661 | 3.62160 | 0 |
0 | -1.46210 | -2.4586 | 8.1674 | 4.54590 | 1 |
0 | 0.10645 | 1.9242 | -2.6383 | 3.86600 | 2 |
0 | -3.59440 | -4.0112 | 9.5228 | 3.45660 | 3 |
0 | -0.98880 | 4.5718 | -4.4552 | 0.32924 | 4 |
Как и в случае с регрессионным набором данных, значения в этом наборе данных не очень хорошо масштабируются. Набор данных будет масштабироваться перед обучением алгоритма.
3. Подготовка Данных Для Обучения
Следующий код делит данные на атрибуты и метки:
X = dataset.iloc[:, 0:4].values y = dataset.iloc[:, 4].values
Следующий код делит данные на обучающие и тестовые наборы:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
4. Масштабирование функций
Как и раньше, масштабирование объектов работает точно так же:
# Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
5. Обучение алгоритму
И опять же, теперь, когда мы масштабировали наш набор данных, мы можем обучить наши случайные леса решению этой проблемы классификации. Для этого выполните следующий код:
from sklearn.ensemble import RandomForestRegressor regressor = RandomForestRegressor(n_estimators=20, random_state=0) regressor.fit(X_train, y_train) y_pred = regressor.predict(X_test)
В случае регрессии мы использовали класс RandomForestRegressor
библиотеки sklearn.ensemble. Для классификации мы будем использовать Классификатор случайных лесов
класс библиотеки sklearn.ensemble. RandomForestClassifier
класс также принимает n_estimators
в качестве параметра. Как и раньше, этот параметр определяет количество деревьев в нашем случайном лесу. Мы снова начнем с 20 деревьев. Вы можете найти подробную информацию обо всех параметрах Random Forest Classifier
| здесь .
6. Оценка алгоритма
Для задач классификации метриками, используемыми для оценки алгоритма, являются точность, матрица путаницы, точность отзыва и значения F1. Выполните следующий сценарий, чтобы найти эти значения:
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score print(confusion_matrix(y_test,y_pred)) print(classification_report(y_test,y_pred)) print(accuracy_score(y_test, y_pred))
Вывод будет выглядеть примерно так:
[[155 2] 1 117]] precision recall f1-score support 0 0.99 0.99 0.99 157 1 0.98 0.99 0.99 118 avg / total 0.99 0.99 0.99 275 0.989090909091
Точность, достигаемая нашим классификатором случайных лесов с 20 деревьями, составляет 98,90%. В отличие от предыдущего, изменение количества оценок для этой задачи не привело к значительному улучшению результатов, как показано на следующей диаграмме. Здесь ось X содержит количество оценок, а ось Y показывает точность.
98,90% – это довольно хорошая точность, так что в любом случае нет особого смысла увеличивать количество наших оценок. Мы видим, что увеличение числа оценок не привело к дальнейшему повышению точности.
Чтобы повысить точность, я бы предложил вам поиграть с другими параметрами класса Random Forest Classifier
и посмотреть, сможете ли вы улучшить наши результаты.
Ресурсы
Хотите узнать больше о Scikit-Learn и других полезных алгоритмах машинного обучения, таких как случайные леса? Вы можете ознакомиться с некоторыми более подробными ресурсами, такими как онлайн-курс:
Такие курсы дают вам ресурсы и качество обучения, которые вы получили бы в университетской среде, но в своем собственном темпе, что отлично подходит для таких сложных тем, как машинное обучение.