Внедряване на път на решение в Gradient Boosting, което доказва локална обяснимост без XAI метод.

Автори: Беа Ернандес @chucheria, Анхел Делгадо @thinbaker

1. Мотивация

В машинното обучение ансамбълът от дървовидни модели като случайна гора (RF) и градиентно усилване (GB) дадоха страхотни резултати при проблеми с класификацията и регресията, като например прогнозирането на цените на жилищата.

Един приятел и аз работихме в проект за прогнозиране на цените на жилищата и разбрахме, че въпреки страхотните резултати на GB, хората продължават да използват модели на линейна регресия (LR) за този вид проблеми. Това се дължи на една важна характеристика, която LR притежава: не само обяснимостта на модела, но и приносът на функцията към прогнозирането на модела.

RF и GB са примери за тези модели на черна кутия. Те обаче са изградени върху дървета на решения, които са напълно обясними, така че можем да изградим алгоритъм за обяснение за ансамбъла въз основа на обяснимостта на неговите дървета.

2. Обяснимост

Казва се, че един модел е обясним, ако можем да отговорим на въпроса „защо този модел е направил тази прогноза?“. Зависи главно от алгоритъма на модела и някои модели не поддържат този въпрос.

Моделите с по-голям капацитет могат да научат по-сложни модели, за да направят прогноза, отколкото LR. Цената обаче е, че прогнозата не може да се обясни, това означава, че не можем да кажем нито причината за такава прогноза, нито колко допринася всяка функция. Тези видове модели, които не могат да бъдат обяснени, се наричат ​​модели на черна кутия.

В същото време има много начини за обяснение на прогнозите.

  • Глобална обяснимост: опитваме се да отговорим на въпроса „Колко дадена функция допринася за прогнозите като цяло?“. Например, в проблема с цените на жилищата бихме искали да разберем дали „характерните квадратни метри имат по-голям ефект върху прогнозите от броя на баните“.
  • Локална обяснимост: Опитваме се да отговорим кои стойности на характеристиките са ни дали конкретна прогноза. Например „В тази извадка прогнозираната стойност е определена, тъй като броят на стаите е 4 и къщата се намира на тази конкретна улица“.

В момента има огромно мнозинство модели за машинно обучение, които се представят много по-добре от LR. Причината, поради която все още е популярен модел, е, че LR е много обясним. С LR можете не само да разберете прогноза, но и да определите количествено колко всяка характеристика допринася за прогнозата поради естеството на формулата на LR.

Прогнозата в LR се дава от:

което може да се обясни като

където c_i е приносът на i-тата функция.

Освен това има и интерпретируеми модели без приноса на всяка функция в крайното решение. Например дървета на решенията. Дърветата на решенията изпълняват набор от йерархични решения за постигане на решение (напр. брой стаи › 3), като получават крайния резултат. Всяко решение се взема върху една функция наведнъж, но всяко решение няма принос (поне пряко, ние ще предложим едно решение) за крайния резултат.

В дървото на решенията прогнозата е:

където leaf(x) е листовият възел на дървото, където извадката x попада

GB (както и RF) е ансамбъл от модели на дървото на решенията. Съвкупността означава, че GB е набор от дървета на решения, които извършват прогноза, работейки заедно. Ансамбълът от дървета се представя много по-добре от всяко от неговите дървета самостоятелно, но проблемът е, че ансамбълът не е локално обясним, тъй като всяко дърво има свой собствен път на вземане на решение, напълно независим от другите, и ние може да знае само кои характеристики са по-важни като цяло (глобално обяснение).

По-конкретно алгоритъмът на GB ансамбъл се състои от нещо, наречено остатъчна адитивност. Това означава, че всяко дърво от ансамбъла научава разликата от прогнозата на предишните дървета и реалната стойност (остатък), така че крайната прогноза е сумата (адитивността) на прогнозите (приносите) на всички дървета.

Може би се чудите защо обяснимостта ни притеснява толкова много. Причината е, че при някои задачи обяснението е толкова важно, колкото и прогнозата. При прогнозирането на цените на жилищата вие искате да знаете какво прави определена къща толкова евтина/скъпа или колко би се променила цената, ако определена стойност на характеристика е различна.

Имайки предвид цялата тази информация и отчитайки страхотните резултати, които GB дава за регресионни проблеми, ние разработихме алгоритъм, който агрегира приноса на всички дървета на модела по начин, който да разбере прогнозата.

3. GB Път на вземане на решение

Вече споменахме, че обяснимостта на един модел зависи само от неговия алгоритъм, има обясними модели и такива, които не са по отношение на неговия алгоритъм, но статистически винаги можем да анализираме резултатите, върнати от моделите, за да ги разберем.

Тези статистически методи позволяват моделен агностичен обяснителен анализ. Например, един общ анализ е методът на разбивка. Разбивката ни позволява да измерим колко се променя една прогноза, ако променим само една функция. Разликата в прогнозата дава оценка за приноса на конкретна характеристика в крайния резултат.

Принос на разбивката на функциятаX_i:

Важно е да се отбележи, че тази мярка за Важност не е напълно точна, а е статистическа оценка.

Въпреки че естеството на GB не дава обяснение на неговите прогнози, прогнозата на дървовидния алгоритъм изпълнява всяка стойност на решение наведнъж. Това естество, заедно с остатъчната активност ни позволява да включим естествено идеята за приноса на функцията Breakdown в алгоритъма за градиентно усилване.

Алгоритъм

1. Принос на възел

За всяко дърво прогнозата се прави чрез набор от разделения на решения за функции (напр. брой_бани ›3) и всеки от тях съответства на възел в дървото. Всеки от тези възли има присвоена прогнозна стойност. Прогнозата на дървото е стойността на последния възел.

Аналогично на анализа на разбивката, можем да оценим приноса на всяко решение като разликата между стойността на възела и стойността на предходния възел:

където c_i е приносът на решението i.

2. Принос на дърво

Поради остатъчното добавяне от ансамбъла Gradient Boosting. Крайната прогноза е сумата от прогнозите на всички дървета, така че приносът на всяко дърво е неговата прогноза:

където treePred_i е предсказанието на i-то дърво.

3. Принос за решение

Нашата цел е да знаем колко допринася всяко решение за крайния резултат, така че следвайки предходните две стъпки, можем да напишем прогнозата по отношение на приноса от решенията:

където value(node_i)_j е стойността на възел i на дървото j.

4. Принос на функция

Ако осъзнаем, че всяко решение има характеристика, свързана с него, можем не само да получим приноса на всяко решение, но и да ги групираме по характеристики и да ги сумираме, така че да можем да получим приноса на характеристиките и локалната обяснимост.

Така че обяснението би било

  • Decision_1(Feature_j) — Възел на принос 1
  • Decision_2(Feature_k) — Възел на принос 2

Поради факта, че работим с GB от ScikitLearn, ние внедрихме нашия подход вътре в библиотеката. ScikitLearn е една от най-популярните библиотеки за машинно обучение, така че внедряването на обяснимостта в нея може да бъде много полезно за много хора (все още чакаме нашият PR да бъде приет).

4. Примери за кодове

За да обясним целия алгоритъм на практика, ще покажем как той може да се използва за обяснение на прогнозите на набора от данни за ценообразуването на Boston House с помощта на класа ScikitLearn GB (както споменахме, отворихме проблем където сме внедрили нашето решение в метода decision_path).

а. Пример за обяснение на решението

import numpy as np
from sklearn.datasets import load_boston
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
X, y = load_boston(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
reg = GradientBoostingRegressor(random_state=0, n_estimators=5)
reg.fit(X_train, y_train)
init, values, explanations = reg.decision_path(X[0:1])
print("Prediction for X_i: ", reg.predict(X[0:1]))
print("init: ", init)
print("values: ", np.nansum(values), "\\n")
print("Breakdown:")
for val, exp in zip(values.tolist()[0],explanations):
    if ~np.isnan(val) and val!=0:
        print("contribution of ", round(val,5),
                "\\t because column ", round(exp[0])," ", exp[1], " ", round(exp[2],2))
Prediction for X_i:  23.48966781
Init:    22.608707124010557 
values:  0.8809606811142934
Breakdown:
contribution of   0.85498 	 because column  12  <   8.13
contribution of  -0.27826 	 because column  5   <   7.43
contribution of  -0.36345 	 because column  5   <   6.66
contribution of   0.67168 	 because column  12  <   9.63
contribution of  -0.36681 	 because column  5   <   7.01
contribution of  -0.04358 	 because column  7   >   1.48
contribution of  -0.24703 	 because column  5   <   6.84
contribution of   0.2979 	 because column  12  <   14.4
contribution of  -0.02668 	 because column  7   >   1.47
contribution of   0.63668        because column  12  <   8.13
contribution of  -0.325 	 because column  5   <   7.01
contribution of  -0.04324 	 because column  7   >   1.48
contribution of   0.48953	 because column  12  <   9.71
contribution of  -0.33782 	 because column  5   <   6.8
contribution of  -0.03794 	 because column  0   <   4.73

Както виждаме, прогнозата (23,48) е сумата от първоначалната средна стойност (22,60) плюс сумата от приноса на характеристиките (0,88), който може да се види в Разбивката.

b. Пример за обяснение на функцията

Както споменахме преди, с предишните резултати можем да групираме решенията по функция, за да получим приноса на функцията

from collections import defaultdict
counter = defaultdict(float)
cols = [i[0] if i else None for i in explanations]
for col,val in zip(cols, values.tolist()[0]):
    if ~np.isnan(val) and val!=0:
        counter[col]+=val
for col, val in counter.items():
    print("column ", col, "\\tcontributed ", val)
column  12 	contributed   2.9507737309447437
column  5 	contributed  -1.918373871627328
column  7 	contributed  -0.11350035836622434
column  0 	contributed  -0.03793881983689874

Можем не само да видим, че най-важните характеристики за това решение са колони 12,5,7,0, но също така и доколко всяка от тях е допринесла за крайния резултат.

5. Изводи

  1. Обяснимостта е ключова концепция в някои проблеми не само за разбиране на прогнозата, но и за измерване на въздействието на всяка характеристика върху крайния резултат. Обяснимостта на един модел е нещо присъщо за него.
  2. Освен възможността за обяснение на модела, има статистически инструменти, които ни позволяват да разберем и оценим ефекта, който всяка стойност има върху крайната прогноза от модела, като разбивката.
  3. Природата на GB (т.е. остатъчно обучение и път на вземане на решения от дърветата) позволява да се оцени присъщият принос на всяко решение и всяка характеристика към прогнозата, така че те могат да бъдат обясними, въпреки че не са.

Препратки

Благодаря, че прочетохте! 💖