Изучение данных о студенческих ссудах с помощью SHAP

Вступление

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

В этом сообщении блога мы построим модель нейронной сети, используя Keras API из TensorFlow, среды машинного обучения с открытым исходным кодом. После обучения нашей модели мы интегрируем ее с SHAP, библиотекой интерпретируемости. Мы будем использовать SHAP, чтобы узнать, какие факторы коррелируют с прогнозами модели.

О модели

Наша модель будет прогнозировать задолженность выпускников университета по сравнению с их будущими доходами. Это отношение долга к прибыли должно быть приблизительным индикатором рентабельности инвестиций (ROI) университета. Данные поступают с интерактивного веб-сайта College Scorecard Министерства образования США, который делает свои данные общедоступными.

Характеристики модели перечислены в таблице ниже. Более подробную информацию о наборе данных можно найти в документации по данным.

+-------------------------+--------------------------------------+
|         Feature         |             Description              |
+-------------------------+--------------------------------------+
| ADM_RATE                | Admission rate                       |
| SAT_AVG                 | SAT average                          |
| TRANS_4                 | Transfer rate                        |
| NPT4                    | Net price (list price - average aid) |
| INC_N                   | Family income                        |
| PUBLIC                  | Public institution                   |
| UGDS                    | Number of undergraduate students     |
| PPTUG_EF                | % part-time students                 |
| FIRST_GEN               | % first-generation students          |
| MD_INC_COMP_ORIG_YR4_RT | % completed within 4 years           |
+-------------------------+--------------------------------------+

Мы выводим целевую переменную (отношение долга к прибыли) из данных о долге и прибыли, имеющихся в наборе данных. В частности, это средний долг, накопленный при выпуске (MD_INC_DEBT_MDN), деленный на средний заработок через 6 лет после выпуска (MN_EARN_WNE_INC2_P6).

Диаграммы разброса были созданы для визуализации корреляции каждой функции с нашей целевой переменной. Каждая диаграмма ниже показывает функцию на оси X и соотношение долга к прибыли на оси Y.

Мы будем использовать Sequential модель с двумя плотно связанными скрытыми слоями и функцией активации ReLU:

model = keras.Sequential([
    layers.Dense(16, activation=tf.nn.relu, input_shape=[len(df.keys())]),
    layers.Dense(16, activation=tf.nn.relu),
    layers.Dense(1)

Ниже мы видим сюжет тренировочного процесса. Увеличивающийся разрыв между ошибкой обучения и проверки указывает на некоторую чрезмерную подгонку. Чрезмерная подгонка, скорее всего, связана с ограниченным количеством выборок (1117) в наборе данных со всеми необходимыми функциями. Тем не менее, учитывая, что среднее отношение долга к прибыли составляет примерно 0,45, средняя абсолютная ошибка 0,1 демонстрирует значимый прогноз.

Чтобы запустить блокнот прямо в браузере, вы можете использовать Colab. Он также доступен в Github.

Несколько слов о справедливости машинного обучения

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

По возможности, значения данных были отфильтрованы для студентов со средним уровнем дохода, чтобы обеспечить согласованный анализ по университетам со студентами с разным уровнем дохода семьи. Данные College Scorecard определяют сегмент среднего дохода как студентов с семейным доходом от 30 000 до 75 000 долларов США. Не все доступные данные содержат этот фильтр, но он доступен для ключевых функций, таких как чистая цена, прибыль, задолженность и процент завершения.

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

Введение в SHAP

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

Входит SHAP. SHAP или SHAPley Additive exPlanations - это библиотека Python, созданная Скоттом Лундбергом, которая может объяснить результаты работы многих фреймворков машинного обучения. Это может помочь объяснить индивидуальный прогноз или суммировать прогнозы для большей совокупности.

SHAP работает, изменяя входные данные, чтобы оценить влияние каждой функции. Вклад каждой функции усредняется по всем возможным взаимодействиям функций. Этот подход основан на концепции ценностей Шепли из теории игр. Он обеспечивает надежное приближение, которое может быть более затратным с точки зрения вычислений по сравнению с другими подходами, такими как LIME. Более подробную информацию о теории SHAP можно найти в статье автора библиотеки NeurIPS 2017.

Использование SHAP с моделями TensorFlow Keras

SHAP предоставляет несколько классов Explainer, которые используют разные реализации, но все используют подход, основанный на значениях Shapley. В этом сообщении блога мы продемонстрируем, как использовать классы KernelExplainer и DeepExplainer. KernelExplainer не зависит от модели, поскольку он принимает прогнозы модели и обучающие данные в качестве входных данных. DeepExplainer оптимизирован для фреймворков глубокого обучения (TensorFlow / Keras).

SHAP DeepExplainer в настоящее время не поддерживает режим активного выполнения или TensorFlow 2.0. Однако KernelExplainer будет работать нормально, хотя и значительно медленнее.

Начнем с использования KernelExplainer, чтобы нарисовать сводный график модели. Сначала мы сгруппируем обучающие данные в n кластеров. Это необязательный, но полезный шаг, потому что время для генерации значений Шепли экспоненциально увеличивается с размером набора данных.

# Summarize the training set to accelerate analysis
df_train_normed_summary = shap.kmeans(df_train_normed.values, 25)
# Instantiate an explainer with the model predictions and training data summary
explainer = shap.KernelExplainer(model.predict, df_train_normed_summary)
# Extract Shapley values from the explainer
shap_values = explainer.shap_values(df_train_normed.values)
# Summarize the Shapley values in a plot
shap.summary_plot(shap_values[0], df_train_normed)

Сводный график отображает распределение значений Шепли для каждой функции. Цвет каждой точки находится в спектре, где самые высокие значения для этой функции - красный, а самые низкие - синие. Характеристики ранжируются по сумме абсолютных значений значений Шепли.

Давайте посмотрим на некоторые отношения из сюжета. Первые три функции с наибольшим вкладом - это средний балл за SAT, % студентов первого поколения и % зачисленных на неполный рабочий день. Обратите внимание, что каждая из этих функций имеет преимущественно синие точки (низкие значения функций) с правой стороны, где есть положительные значения SHAP. Это говорит нам о том, что низкие значения этих функций приводят к тому, что наша модель предсказывает высокий коэффициент DTE. Четвертая функция в списке, чистая цена, имеет противоположную зависимость, где более высокая чистая цена связана с более высоким коэффициентом DTE.

Также можно объяснить один конкретный случай, используя функцию force_plot():

# Plot the SHAP values for one instance
INSTANCE_NUM = 0
shap.force_plot(explainer.expected_value[0], shap_values[0][INSTANCE_NUM], df_train.iloc[INSTANCE_NUM,:])

В этом конкретном примере средний показатель SAT колледжа больше всего повлиял на прогноз DTE на уровне 0,53, что повысило его значение. Показатель завершения (MD_INC_COMP_ORIG_YR4_RT) был вторым по важности параметром, что привело к снижению прогноза. Значения, показанные сериями значений SHAP, также можно просматривать по всему набору данных или по части n экземпляров, как показано здесь:

# Plot the SHAP values for multiple instances
NUM_ROWS = 10
shap.force_plot(explainer.expected_value[0], shap_values[0][0:NUM_ROWS], df_train.iloc[0:NUM_ROWS])

Остерегайтесь коррелированных функций

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

corr = df.corr()
sns.heatmap(corr)

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

  • Средний показатель SAT коррелирует с показателем завершения и обратно коррелирует с процентом приема и показателем первого поколения.
  • Коэффициент первого поколения коррелирует с коэффициентом неполного рабочего дня и обратно коррелирует с коэффициентом завершения.

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

SHAP имеет dependence_plot() функцию, которая может помочь раскрыть более подробную информацию. Например, давайте посмотрим на взаимосвязь между коэффициентом первого поколения и коэффициентом неполного рабочего времени. Как мы наблюдали на сводном графике, мы видим, что коэффициент первого поколения обратно коррелирует со своими значениями Шепли. График зависимости также показывает нам, что корреляция сильнее, когда в университете меньше студентов-заочников.

shap.dependence_plot('FIRST_GEN', shap_values[0], df_train, interaction_index='PPTUG_EF')

Заключение

В этом сообщении блога мы продемонстрировали, как интерпретировать модель tf.keras с помощью SHAP. Мы также рассмотрели, как использовать API SHAP и несколько типов графиков SHAP. Наконец, для получения полной и точной картины мы обсудили соображения о справедливости и коррелированных переменных. Теперь у вас есть инструменты, чтобы лучше понять, что происходит в ваших моделях TensorFlow Keras!

Для получения дополнительной информации о том, что я здесь рассмотрел, ознакомьтесь с этими ресурсами:

Дайте мне знать, что вы думаете в Твиттере!