рекомендации

суббота, 21 декабря 2019 г.

Введение в классификаторы Random Forest в Python

Перевод. Оригинал: Understanding Random Forests Classifiers in Python

Random forests - это алгоритм обучения с учителем. Может использоваться как для классификации, так и для регрессии. Это также самый гибкий и простой в использовании алгоритм. Лес состоит из деревьев. Говорят, что чем больше у него деревьев, тем крепче лес. Случайные леса создают деревья решений для случайно выбранных выборок данных, получают прогнозы по каждому дереву и выбирают лучшее решение с помощью голосования. Это также обеспечивает довольно хороший показатель важности признака.

Случайные леса имеют множество применений, таких как рекомендательные системы, классификация изображений и выбор признаков. Он может быть использован для классификации соискателей, выявления мошеннической деятельности и прогнозирования заболеваний. Он лежит в основе алгоритма Boruta, который выбирает важные признаки в наборе данных.

Алгоритм Random Forests

Давайте разберем алгоритм с точки зрения неспециалистов. Предположим, вы хотите отправиться в путешествие, и вы хотели бы отправиться в место, которое вам понравится.

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

Предположим, вы решили спросить своих друзей и поговорили с ними об их прошлом опыте путешествий по разным местам. Вы получите некоторые рекомендации от каждого друга. Теперь вы должны составить список этих рекомендуемых мест. Затем вы просите их проголосовать (или выбрать одно лучшее место для поездки) из списка рекомендованных вами мест. Место с наибольшим количеством голосов будет вашим окончательным выбором для поездки.

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

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

Технически это ансамблевый метод (основанный на подходе «разделяй и властвуй») деревьев решений, сгенерированных на случайно разбитом наборе данных. Эта коллекция классификаторов дерева решений также известна как лес. Отдельные деревья решений генерируются с использованием индикатора выбора атрибута, такого как прирост информации, коэффициент усиления и индекс Джини для каждого атрибута. Каждое дерево зависит от независимой случайной выборки. В задаче классификации голосует каждое дерево, и в качестве конечного результата выбирается самый популярный класс. В случае регрессии среднее значение всех выходных данных дерева считается конечным результатом. Это проще и мощнее по сравнению с другими алгоритмами нелинейной классификации.

Как работает алгоритм?

Он работает в четыре этапа:

1. Выбирает случайные выборки из данного набора данных.
2. Создает дерево решений для каждой выборки и получает результат прогноза из каждого дерева решений.
3. Проводит голосование за каждый прогнозируемый результат.
4. Выбирает результат прогноза с наибольшим количеством голосов в качестве окончательного прогноза.




Преимущества:

1. Случайные леса рассматриваются как высокоточный и надежный метод из-за количества деревьев решений, участвующих в процессе.
2. Он не страдает от проблемы переоснащения. Основная причина в том, что он принимает среднее значение всех прогнозов, что устраняет отклонения.
3. Алгоритм может использоваться как в задачах классификации, так и в регрессии.
4. Случайные леса также могут обрабатывать пропущенные значения. Есть два способа справиться с ними: использование медианных значений для замены непрерывных переменных и вычисление взвешенного по близости значения пропущенных значений.
5. Вы можете получить относительную важность признака, которая помогает в выборе наиболее полезных признаков для классификатора.

Недостатки:

1. Random forests медленно генерируют прогнозы, потому что у него много деревьев решений. Всякий раз, когда он делает прогноз, все деревья в лесу должны сделать прогноз для одного и того же заданного ввода и затем выполнить голосование по нему. Весь этот процесс занимает много времени.
2. Модель трудно интерпретировать по сравнению с деревом решений, где вы можете легко принять решение, следуя пути в дереве.

Нахождение важных признаков

Random forests также предлагает хороший индикатор выбора признаков. Scikit-learn обеспечивает дополнительную переменную в модели, которая показывает относительную важность или вклад каждого признака в прогнозе. Он автоматически вычисляет оценку релевантности каждого признака на этапе обучения. Затем он уменьшает релевантность, так что сумма всех баллов равна 1.

Эта оценка поможет вам выбрать наиболее важные признаки и отбросить наименее важные для построения модели.

Случайный лес использует значение gini importance или mean decrease in impurity (MDI) для расчета важности каждого признака. Gini importance также известна как total decrease in node impurity. Этот параметр показывает, насколько уменьшается подгонка или точность модели при отбрасывании переменной. Чем больше уменьшение, тем значительнее переменная. Здесь среднее уменьшение (mean decrease) является важным параметром для выбора переменной. Gini index может описывать общую объяснительную силу переменных.

Случайные леса против деревьев решений

1. Случайные леса - это множество деревьев решений.
2. Деревья с глубоким обучением могут страдать от переобучения, но случайные леса предотвращают переобучение, создавая деревья на случайных подмножествах.
3. Деревья решений в вычислительном отношении быстрее.
4. Случайные леса трудно интерпретировать, а дерево решений легко интерпретируется и может быть преобразовано в правила.

Создание классификатора с использованием Scikit-learn

Вы будете строить модель на наборе данных ирисов, который является очень известным набором классификации. Он включает длину чашелистика, ширину чашелистика, длину лепестка, ширину лепестка и тип цветов. Есть три вида или класса цветов: setosa, versicolor и virginia. Вы построите модель для классификации типа цветка. Набор данных доступен в библиотеке scikit-learn или вы можете скачать его из репозитория машинного обучения UCI.

Начните с импорта библиотеки наборов данных из scikit-learn и загрузите набор данных iris с помощью load_iris().

# импорт набора данных библиотеки scikit-learn
from sklearn import datasets
 
#Загрузка набора данных
iris = datasets.load_iris()

Вы можете напечатать имена цели и признаков, чтобы убедиться, что у вас правильный набор данных:

# выводим названия видов (setosa, versicolor,virginica)
print(iris.target_names)

# выводим названия четырех признаков
print(iris.feature_names)

['setosa' 'versicolor' 'virginica']
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

Это хорошая идея, всегда немного изучить ваши данные, чтобы вы знали, с чем работаете. Здесь вы можете видеть первые пять строк набора данных, а также целевую переменную для всего набора данных.

# выводим данные iris (верхние 5 записей)
print(iris.data[0:5])

# выводим имена iris (0:setosa, 1:versicolor, 2:virginica)
print(iris.target)

[[ 5.1  3.5  1.4  0.2]

 [ 4.9  3.   1.4  0.2]

 [ 4.7  3.2  1.3  0.2]

 [ 4.6  3.1  1.5  0.2]

 [ 5.   3.6  1.4  0.2]]

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2

 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

 2 2]

Здесь вы можете создать DataFrame набора данных iris следующим образом:

# Создаем DataFrame для набора данных iris.
import pandas as pd
data=pd.DataFrame({
    'sepal length':iris.data[:,0],
    'sepal width':iris.data[:,1],
    'petal length':iris.data[:,2],
    'petal width':iris.data[:,3],
    'species':iris.target
})

data.head()

petal length petal width sepal length sepal width species

0 1.4 0.2 5.1 3.5 0

1 1.4 0.2 4.9 3.0 0

2 1.3 0.2 4.7 3.2 0

3 1.5 0.2 4.6 3.1 0

4 1.4 0.2 5.0 3.6 0

Сначала вы разделяете столбцы на зависимые и независимые переменные (или признаки и метки). Затем вы разбиваете эти переменные на обучающий и тестовый наборы.


# импорт функции train_test_split
from sklearn.model_selection import train_test_split

X=data[['sepal length', 'sepal width', 'petal length', 'petal width']]  

y=data['species']  

# разбиваем набор данных на обучающий и тестовый наборы 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) 


После разделения вы будете обучать модель на обучающем наборе и выполнять прогнозы на тестовом наборе.


#Импортируем Random Forest
from sklearn.ensemble import RandomForestClassifier

#Создаем гауссовский классификатор
clf=RandomForestClassifier(n_estimators=100)

# Обучаем модель с использованием обучающего набора y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)

y_pred=clf.predict(X_test)

После тренировки проверьте точность, используя фактические и прогнозируемые значения.

# Импортируем модуль scikit-learn metrics для расчета точности
from sklearn import metrics

#Точность модели, как часто верен классификатор?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

('Accuracy:', 0.93333333333333335)

Вы также можете сделать прогноз для одного элемента, например:

    sepal length = 3
    sepal width = 5
    petal length = 4
    petal width = 2

Теперь вы можете предсказать, какой это цветок.

clf.predict([[3, 5, 4, 2]])

array([2])

Здесь 2 цветка указываются как тип Virginica.

Определение важности признаков в Scikit-learn

Здесь вы находите важные признаки или выбираете признаки в наборе данных IRIS. В scikit-learn вы можете выполнить эту задачу следующим образом:

Во-первых, вам нужно создать модель случайных лесов.
Во-вторых, используйте переменную feature importance, чтобы увидеть оценки важности признаков.
В-третьих, визуализируйте эти оценки, используя библиотеку Seaborn.

#Создаем гауссовский классификатор
clf=RandomForestClassifier(n_estimators=100)

#Обучаем модель с использованием обучающего набора y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)

import pandas as pd
feature_imp = pd.Series(clf.feature_importances_,index=iris.feature_names)
.sort_values(ascending=False)
feature_imp

petal width (cm)     0.458607
petal length (cm)    0.413859
sepal length (cm)    0.103600
sepal width (cm)     0.023933
dtype: float64

Вы также можете визуализировать важность признаков. Визуализации легко понять и интерпретировать.

Для визуализации вы можете использовать комбинацию matplotlib и seaborn. Поскольку seaborn построен поверх matplotlib, он предлагает ряд настраиваемых тем и предоставляет дополнительные типы сюжетов. Matplotlib - это расширенный набор seaborn, и оба одинаково важны для хорошей визуализации.

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# Создаем диаграмму
sns.barplot(x=feature_imp, y=feature_imp.index)
# Добавляем подписи к графику
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
plt.legend()
plt.show()



Генерация модели на выбранных признаках

Здесь вы можете удалить признак «sepal width», поскольку он имеет очень низкое значение, и выбрать 3 оставшиеся признака.

# Импорт функции train_test_split 
from sklearn.cross_validation import train_test_split

# Разделяем набор данных на признаки и метки
X=data[['petal length', 'petal width','sepal length']]  
# удалили признак "sepal length"
y=data['species']                                       

# Разделяем набор данных на обучающий и тестовый наборы 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.70, 
random_state=5) # 70% training and 30% test

После разделения вы сгенерируете модель для выбранных элементов обучающего набора, выполните прогнозы для выбранных признаках тестового набора и сравните фактические и прогнозируемые значения.

from sklearn.ensemble import RandomForestClassifier

#Создаем гауссовский классификатор
clf=RandomForestClassifier(n_estimators=100)

#Обучаем модель с использованием обучающего набора y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)

# прогноз на тестовом наборе
y_pred=clf.predict(X_test)
#импорт модуля scikit-learn metrics для расчета точности

from sklearn import metrics
# Точность модели, как часто верен классификатор?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

('Accuracy:', 0.95238095238095233)

Вы можете видеть, что после удаления наименее важных признаков (sepal length) точность увеличивается. Это потому, что вы удалили вводящие в заблуждение данные и шум, что привело к повышению точности. Меньшее количество функций также сокращает время обучения.

Заключение

Поздравляем, вы дошли до конца этого урока!

В этом уроке вы узнали, что такое случайные леса, как они работают, поиск важных признаков, сравнение между случайными лесами и деревьями решений, преимущества и недостатки. Вы также научились строить модели, оценивать и находить важные признаки в scikit-learn.

Комментариев нет:

Отправить комментарий