Представленный Джеромом Фридманом в 2001 году график частичной зависимости (PDP) показывает предельное влияние одной или двух функций на прогнозируемый результат модели машинного обучения. PDP может показать, является ли взаимосвязь между целью и элементом линейной, монотонной или более сложной. Например, при применении к модели линейной регрессии графики частичной зависимости всегда показывают линейную зависимость.

Функция частичной зависимости для регрессии определяется как:

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

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

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

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

У Kaggle есть очень хорошее описание частичных графиков в учебнике Объяснение машинного обучения. Kaggle привел пример, основанный на статистике FIFA:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier

data = pd.read_csv('../input/fifa-2018-match-statistics/FIFA 2018 Statistics.csv')
y = (data['Man of the Match'] == "Yes")  # Convert from string "Yes"/"No" to binary
feature_names = [i for i in data.columns if data[i].dtype in [np.int64]]
X = data[feature_names]
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
tree_model = DecisionTreeClassifier(random_state=0, max_depth=5, min_samples_split=5).fit(train_X, train_y)

Затем он использует библиотеку PDPBox и показывает важность функций «Достигнутая цель» и «Пройденное расстояние (км)». Обратите внимание, что:

  • Ось y интерпретируется как изменение прогноза по сравнению с тем, что было бы предсказано при базовом или крайнем левом значении.
  • синяя заштрихованная область указывает уровень уверенности
from matplotlib import pyplot as plt
from pdpbox import pdp, get_dataset, info_plots

# Create the data that we will plot
pdp_goals = pdp.pdp_isolate(model=tree_model, dataset=val_X, model_features=feature_names, feature='Goal Scored')

# plot it
pdp.pdp_plot(pdp_goals, 'Goal Scored')
plt.show()

# Build Random Forest model
rf_model = RandomForestClassifier(random_state=0).fit(train_X, train_y)

pdp_dist = pdp.pdp_isolate(model=rf_model, dataset=val_X, model_features=feature_names, feature=feature_to_plot)

pdp.pdp_plot(pdp_dist, feature_to_plot)
plt.show()

Если мы применим двухмерный PDP к двум функциям, мы сможем показать взаимодействие между «забитой целью» и «пройденным расстоянием (км)».

# Similar to previous PDP plot except we use pdp_interact instead of pdp_isolate and pdp_interact_plot instead of pdp_isolate_plot
features_to_plot = ['Goal Scored', 'Distance Covered (Kms)']
inter1  =  pdp.pdp_interact(model=tree_model, dataset=val_X, model_features=feature_names, features=features_to_plot)

pdp.pdp_interact_plot(pdp_interact_out=inter1, feature_names=features_to_plot, plot_type='contour')
plt.show()

Более подробную информацию читатели могут найти по ссылке ниже:



Спасибо за прочтение!

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

Если вы хотите и дальше получать статьи этого типа, вы можете поддержать меня, став Средним подписчиком.