Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn

Введение

Ассоциация Случайный Лес Алгоритм — это древовидный алгоритм обучения с учителем, который использует ансамбль предсказаний многих деревьев решений либо для классификации точки данных, либо для определения ее приблизительного значения. Это означает, что его можно использовать либо для классификации, либо для регрессии.

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

При использовании Random Forests важно помнить, что количество деревьев — это гиперпараметр, и он будет определен перед запуском модели.

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

Принимая во внимание алгоритмы, основанные на деревьях, попытка объяснить модель может быть выполнена несколькими способами, путем отображения и просмотра каждого дерева (это может быть сложно, если в модели 200 деревьев или более), с использованием Значения Шепли (или SHAP), глядя на функции, которые были наиболее учтены в модели, используя LIME исследовать взаимосвязь между входом и выходом модели и т. д. Обычно используется комбинация всех методов.

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

Для этого давайте импортируем необходимые библиотеки, загрузим набор данных Palmer Penguins, разделим данные, создадим модель, получим значения характеристик и используем Seaborn для их построения! Мы не будем углубляться в данные, EDA или саму модель — это тема специального руководства.

Примечание: Вы можете скачать набор данных из GitHub или непосредственно из кода.

Импорт библиотек

Начнем с импорта нескольких библиотек, которые мы будем использовать:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

Разделение данных

Разделим данные для обучения и тестирования:


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

Получение важности функций

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


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

Это выводит:

array([0.41267633, 0.30107056, 0.28625311])

Это значения функций, чтобы увидеть имена функций, запустите:


rf.feature_names_in_

Это приводит к соответствующему имени каждой функции:

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

Это означает, что наиболее важной характеристикой для определения классов пегуинов для этой конкретной модели была bill_length_mm!

Важность зависит от меры того, насколько хорошо данные разделены в каждом разделении узла — в этом случае мера определяется Индекс Джини – затем значение Джини взвешивается в зависимости от того, сколько строк было разделено при использовании bill_length_mm особенность и усреднены по 100 деревьям в ансамбле. Результат этих шагов составляет 0.41267633, или более 40% в этом случае.

Визуализация важности функций

Обычный способ представления значений важности — использование барных чатов. Давайте сначала создадим фрейм данных с именами функций и их соответствующими значениями, а затем визуализируем их с помощью Seaborn. barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

Совет: Хорошей практикой при представлении информации является упорядочивание значений в порядке возрастания или убывания. В этом случае данные уже упорядочены, и первое значение будет первым, которое мы хотим узнать. Если это не так, вы можете заказать фрейм данных с помощью sort_values. Это можно сделать для любого столбца в порядке возрастания или убывания: importances_df.sort_values(by="importances", ascending=False).

Глядя на этот первый график, сложнее интерпретировать значение важности каждой функции. Очевидно, что длина купюры больше, чем у двух других баров, но это не совсем так. bill_depth_mm эквивалентна 0.30107056и что flipper_length_mm составляет 0.28625311. Итак, этот первый график можно улучшить, отображая значение каждого бара. Это можно сделать, зайдя на сайт Seaborn. containers объект. Он хранит информацию о каждом баре и передает значения в виде меток бара:

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Теперь мы можем ясно или почти ясно видеть каждое значение важности, потому что bill_length_mm значение обрезается вертикальной линией, которая является частью внешней границы графика. Границы используются для ограждения области, чтобы привлечь к ней больше внимания, но в этом случае нам не нужно ограждать, потому что есть только один граф. Удалим границу и улучшим читаемость чисел:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Диаграмма кажется легче читаемой, но галочки на оси X кажутся плавающими, и у нас уже есть значения вместе с полосами, поэтому мы можем удалить xticks:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Обратите внимание, что после удаления галочек метки Y и X немного трудно читать. Y-метка, feature_names, является вертикальным и по оси X имеется только importances. Поскольку в заголовке уже указано, что диаграмма Особенности важности, мы также можем удалить метки осей:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Если вы хотите сделать результаты еще более прямыми, вы можете изменить заголовок и добавить заключение. Что известно, так это то, что длина купюры считалась наиболее важной характеристикой в ​​соответствии с критериями, которые мы обсуждали ранее. Это может быть первая информация для тех, кто смотрит на сюжет, можно сказать, что длина клюва пингвина была наиболее важной характеристикой для классификации видов в базовой модели Random Forest (RF). :

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

Это окончательный результат диаграммы важности функций:

Узнайте о важности функций для случайных лесов с помощью Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Заключение

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

Отметка времени:

Больше от Стекабьюс