Автор Ом Батия, стажер по машинному обучению в Eightfold.ai

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

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

Настройка эксперимента

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

Вот код, который используется для генерации данных:

data = []

for i in range(NUM_SAMPLES):
    temp = randint(60, 110)
    windspeed = randint(5, 50)
    unrelated_feature = randint(90,100)
    
    if temp < 90 and windspeed < 20: 
        # ideal conditions for tennis! 
        # let's play 
        label = 1
    else: 
        label = 0
    
    # as you can see, the unrelated feature has (true to it's name)
    # not been used to calculate the label 

    # let's mislabel data ~20% of the time, just to make it more interesting 
    mislabel = randint(0,10)
    if mislabel >= 2:
        # flip the label 
        label = 0 if label else 1 
        
    data.append([temp, windspeed, unrelated_feature, label])

data = np.array(data)

Обучение нашего классификатора

Это достигается с помощью пары строк кода с помощью sklearn. Начнем с обучения DecisionTreeClassifier:

features = data[:, :-1]
labels = data[:, :-1].reshape(-1)
clf = DecisionTreeClassifier(max_depth=3).fit(features, labels)

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

Важность функции

Вероятно, это первое, что вы должны проверить, обучив древовидную модель. Большинство древовидных моделей используют некоторую метрику, такую ​​как Gini, чтобы определить, какие функции следует использовать для разделения набора данных. Классификаторы Sklearn на основе дерева предоставляют массив feature_importances, который эффективно сообщает вам, насколько сильно он полагался на каждую функцию при построении дерева.

К нему легко получить доступ через атрибут clf.feature_importances_:

print pd.Series(clf.feature_importances_, index=[‘temp’, ‘windspeed’, ‘unrelated_feature’])

>> temp 0.529555
>> windspeed 0.467440
>> unrelated_feature 0.003006

Это показывает нам, что unrelated_feature — наименее важная функция, которую мы и ожидали увидеть.

Правила принятия решений

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

Если вам нужно визуальное представление вашего дерева, его легко создать благодаря функции export_graphviz, предоставляемой sklearn.

tree.export_graphviz(clf, feature_names=[‘temp’, ‘windspeed’, ‘unrelated_feature’])

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

Простой способ преобразовать эти ценные данные в более удобный формат — преобразовать их в отображение (правило) => (количество затронутых выборок). Это позволяет сосредоточиться на наиболее важных путях в дереве.

На самом деле у нас есть доступ ко всему объекту дерева, созданному sklearn, поэтому есть много разных способов построить это сопоставление.

# left and right children
clf.tree_.children_left
clf.tree_.children_right

# feature used to split at each node
clf.tree_.feature

# threshold used for each split
clf.tree_.threshold

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

Как мы видим, судя по всему, при принятии решений он очень сильно полагается на скорость ветра. Почти 7000 из 10000 образцов классифицируются без учета температуры! Это кажется нелогичным, поскольку, глядя на важность признаков, можно предположить, что температура и скорость ветра используются одинаково. Однако, поскольку атрибут feature_importances_ зависит не от общего количества выборок, затронутых конкретной функцией, а от уменьшения средней примеси, всегда рекомендуется проверять правила.

Еще одно понимание, предоставляемое правилами принятия решений, — это выбираемые пороги. Как видно здесь, искусственные пороги, которые мы использовали (скорость ветра ‹ 20 и температура ‹ 90), действительно нашли довольно эффективными. Конечно, мы редко знаем лежащее в основе распределение, которое привело к нашему набору данных, но поиск выбросов в этих пороговых значениях — отличный способ выявить проблемы в данных или в модели.

Поэтому в следующий раз, когда вы будете тренировать древовидную модель, не смотрите только на результат F1. Интерпретируемость деревьев решений — одна из их самых мощных функций, поэтому обязательно воспользуйтесь ею!

О Eightfold.ai

Eightfold.ai предоставляет платформу Talent Intelligence Platform™, наиболее эффективный способ для компаний выявлять перспективных кандидатов, достигать целей разнообразия найма, удерживать лучших исполнителей и удовлетворять свои потребности в наборе персонала с меньшими общими затратами. Запатентованная Eightfold платформа на основе искусственного интеллекта позволяет более чем 100 предприятиям превратить управление талантами в конкурентное преимущество. Компания Eightfold, созданная ведущими инженерами из Facebook, Google и других ведущих технологических компаний, базируется в Маунтин-Вью, штат Калифорния.