Представленный Джеромом Фридманом в 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, чтобы узнать больше. Это отличное кардио для 👏 И поможет другим людям увидеть историю.
Если вы хотите и дальше получать статьи этого типа, вы можете поддержать меня, став Средним подписчиком.