Bank będzie musiał wyjaśnić… czyli o wyjaśnialnych modelach predykcyjnych

Czym są wyjaśnialne modele predykcyjne?

Interpretowalne uczenie maszynowe (IML od Interpretable Machine Learning) czy wyjaśnialna syntetyczna inteligencja (XAI od eXplainable Artificial Intelligence) to względnie nowa, a ostatnio bardzo szybko rozwijająca się, gałąź uczenia maszynowego.

W skrócie chodzi o to, by konstruować takie modele, dla których człowiek możne zrozumieć skąd biorą się decyzje modelu. Złożone modele typu lasy losowe czy głębokie sieci są ok, o ile potrafimy w jakiś sposób wyjaśnić co wpłynęło na konkretną decyzję modelu.

Po co?

W ostatnich latach często uczenie maszynowe było uprawiane ,,w stylu Kaggle”. Jedynym kryterium oceny modelu była skuteczność modelu na jakimś ustalonym zbiorze testowym. Takie postawienie sprawie często zamienia się w bezsensowne żyłowanie ostatnich 0.00001% accuracy na zbiorze testowym.

Tak wyżyłowane modele najczęściej epicko upadają w zderzeniu z rzeczywistością. Ja na prezentacjach lubię wymieniać przykłady Google Flu, Watson for Oncology, Amazon CV, COMPAS i recydywizm czy przykłady z książki ,,Broń matematycznej zagłady”. Ale lista jest znacznie dłuższa.

Dlaczego to takie ważne?

W lutym fundacja Panoptykon pisała Koniec z „czarną skrzynką” przy udzielaniu kredytów. W ostatni czwartek (21 marca) w gazecie Bankier można było znaleźć ciekawy artykuł Bank będzie musiał wyjaśnić, dlaczego odmówił kredytu, w której opisuje niektóre konsekwencje ustawy przyjętej przez Senat.

Przykładowy cytat:
,,Ustawa wprowadza także m.in. przepis nakazujący bankom przedstawienie klientowi wyjaśnienia dotyczącego tego, które dane osobowe miały wpływ na ostatecznie dokonaną ocenę zdolności kredytowej. Obowiązek ten będzie dotyczył zarówno sytuacji, w której decyzja ta została podjęta w pełni zautomatyzowanym procesie, na podstawie tzw. algorytmów, jak i sytuacji, w której w podejmowaniu decyzji brał udział także człowiek”.

Wygląda więc na to, że niedługo wyjaśnialne uczenie maszynowe spotka nas w okienkach bankowych przy okazji decyzji kredytowych.

Nie tylko banki

Okazuje się, że temat wyjaśnialności w czwartek omawiany był nie tylko w Senacie. Akurat byłem tego dnia na bardzo ciekawej konferencji Polish Business Analytics Summit, na której dr Andrey Sharapov opowiadał o tym jak Lidl wykorzystuje techniki XAI i IML do lepszego wspomagania decyzji.

Zbudować model jest prosto, ale pokazać wyniki modelu biznesowi, tak by ten wiedział jak na ich podstawie podejmować lepsze decyzje – to jest wyzwanie dla XAI. Andrey Sharapov prowadzi na LinkedIn ciekawą grupę na którą wrzuca materiały o wyjaśnialnym uczeniu maszynowym. Sporo pozycji można też naleźć na tej liście.

Na poniższym zdjęciu jest akurat przykład wykorzystania techniki Break Down (made in MI2 Data Lab!!!) do wspomagania decyzji dotyczących kampanii marketingowych.

Warszawa po raz trzeci

Aż trudno uwierzyć w ten zbieg okoliczności, ale tego samego dnia (tak, wciąż piszę o 21 marca) na Spotkaniach Entuzjastów R profesor Marco Robnik omawiał różne techniki wyjaśnialności opartej o permutacje.

Skupił się na technika EXPLAIN i IME, ale było też o LIME i SHAP a na niektórych slajdach pojawiał się nasz DALEX i live (choć pewnie my byśmy już reklamowani nowsze rozwiązanie Mateusza Staniaka, czyli pakiet localModels).

Btw, spotkanie było nagrywane, więc niedługo powinno być dostępne na youtube.

Gdzie mogę dowiedzieć się więcej?

Wyjaśnialne uczenie maszynowe to przedmiot badań znacznej części osób z MI2DataLab. Rozwijamy platformę do automatycznej analizy, eksploracji i wyjaśnień dla modeli predykcyjnych DrWhy.AI.

Niedługo napisze więcej o materiałach i okazjach podczas których można dowiedzieć się więcej o ciekawych zastosowaniach technik wyjaśnialnego uczenia maszynowego w finansach, medycynie spersonalizowanej czy innych ciekawych miejscach.

To już 5 lat! Gość specjalny na najbliższym SERze opowie o wyjaśnialnym ML

W najbliższy czwartek o godzinie 18:00 startujemy z 38. spotkaniem Entuzjastów R.
Aż trudno uwierzyć, że minęło już 5 lat od naszego pierwszego spotkania w ICMie. Przez te 5 lat gościliśmy ponad 70 prelegentów, często osoby, które znaliśmy z ciekawych blogów, pakietów czy książek. Większość prelegentów pracuje w Warszawie, ale też byli ciekawi goście z innych miast, krajów czy nawet spoza Europy. Społeczność sympatyków na meetupie przekroczyła niedawno 2000 osób. W kontynentalnej Europie większa jest tylko grupa użytkowników R w Madrycie (niewiele większa, więc kto wie).

Na najbliższym – jubileuszowym – spotkaniu będziemy gościć profesora Marko Robnik-Šikonja z uniwersytetu w Ljubljanie. Autor kilkudziesięciu znanych prac naukowych z obszaru uczenia maszynowego, autor pakietu ExplainPrediction dla programu R. Na SERze opowie o technikach permutacyjnego wyjaśniania złożonych modeli, w szczególności EXPLAIN, IME, LIME czy SHAP.
Super gorący temat opowiedziany przez światowej sławy specjalistę.
Czegóż chcieć więcej na urodziny?

Ach oczywiście.
Będzie też tort!

Zapraszamy wszystkich sympatyków R, SERów czy wyjaśnialnego uczenia maszynowego. Spotykamy się w sali 107 na wydziale MiNI PW (Koszykowa 75, Warszawa).
Najlepiej zaznaczyć obecność przez stronę na meetupe, ułatwi nam to planowanie wielkości tortu. Do zobaczenia!

DALEX has a new skin! Learn how it was designed at gdansk2019.satRdays

DALEX is an R package for visual explanation, exploration, diagnostic and debugging of predictive ML models (aka XAI – eXplainable Artificial Intelligence). It has a bunch of visual explainers for different aspects of predictive models. Some of them are useful during model development some for fine tuning, model diagnostic or model explanations.

Recently Hanna Dyrcz designed a new beautiful theme for these explainers. It’s implemented in the `DALEX::theme_drwhy()` function.
Find some teaser plots below. A nice Interpretable Machine Learning story for the Titanic data is presented here.

Hanna is a very talented designer. So I’m super happy that at the next satRdays @ gdansk2019 we will have a joint talk ,,Machine Learning meets Design. Design meets Machine Learning”.

New plots are available in the GitHub version of DALEX 0.2.8 (please star if you like it/use it. This helps to attract new developers). Will get to the CRAN soon (I hope).

Instance level explainers, like Break Down or SHAP

Instance level profiles, like Ceteris Paribus or Partial Dependency

Global explainers, like Variable Importance Plots

See you at satRdays!

Mat-korzenie MiNI PW

Dzisiaj będzie o ciekawym projekcie z Technik Wizualizacji Danych.
Ale najpierw historyjka.

Od studiów jestem fanem hackerspaceów. Miejsc w których ludzie razem robią szalone projekty. Więc i przedmioty projektowe na studiach staram się też tak organizować, by kurs był czasem robienia jakiegoś interesującego projektu (przynajmniej dla prowadzącego ;-)).
Gdy na wydziale statystyki UCDavis zobaczyłem takie drzewo genealogiczne pracowników, pomyślałem, WOW, to jest pomysł na kolejny projekt dla studentów z TWD.

O co chodzi z tą genealogią?
Mathematics Genealogy Project to projekt wspierany przez American Mathematical Society. Otwarta baza danych linkująca matematyków i promotorów ich pracy doktorskiej. Podobny pomysł co baza współautorów publikacji czy współautorów pakietów oprogramowania czy połączenia znajomych na facebooku, tyle że w wersji mat.

W ramach ostatniego projektu z TWD studenci szukali sposobu na przedstawienie związki lwowskiej i warszawskiej szkoły matematycznej z pracownikami wydziału MiNI PW.

Poniżej dwie wizualizacje, które najbardziej przypadły mi do gustu.

Wersja interaktywna tutaj (uwaga, zabawa z grafami uzależnia).

Pełna wersja tutaj.

A jak wyglądałoby drzewo Twojego wydziału?
😉

shapper is on CRAN, it’s an R wrapper over SHAP explainer for black-box models

Written by: Alicja Gosiewska

In applied machine learning, there are opinions that we need to choose between interpretability and accuracy. However in field of the Interpretable Machine Learning, there are more and more new ideas for explaining black-box models. One of the best known method for local explanations is SHapley Additive exPlanations (SHAP).

The SHAP method is used to calculate influences of variables on the particular observation. This method is based on Shapley values, a technique borrowed from the game theory. SHAP was introduced by Scott M. Lundberg and Su-In Lee in A Unified Approach to Interpreting Model Predictions NIPS paper. Originally it was implemented in the Python library shap.

The R package shapper is a port of the Python library shap. In this post we show the functionalities of shapper. The examples are provided on titanic_train data set for classification.

While shapper is a port for Python library shap, there are also pure R implementations of the SHAP method, e.g. iml or shapleyR.

Installation

The shapper wraps up the Python library, therefore installation requires a bit more effort than installation of an ordinary R package.

Install the R package shapper

First of all we need to install shapper, this may be the stable release from CRAN

install.packages("shapper")

or the developer version form GitHub.

devtools::install_github("ModelOriented/shapper")

Install the Python library shap

Before you run shapper, make sure that you have installed Python.

Python library shap is required to use shapper. The shap can be installed both by Python or R. To install it through R, you an use function install_shap() from the shapper package.

library("shapper")
install_shap()

If you experience any problems related to the installation of Python libraries or evaluation of Python code, see the reticulate documentation. The shapper access Python within reticulate, therefore the solution to the problem is likely to be in there ;-).

Would you survive sinking of the RMS Titanic?

The example usage is presented on the titanic_train dataset from the R package titanic. We will predict the Survived status. The other variables used by the model are: Pclass, Sex, Age, SibSp, Parch, Fare and Embarked.

library("titanic")
titanic <- titanic_train[,c("Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked")]
titanic$Survived <- factor(titanic$Survived)
titanic$Sex <- factor(titanic$Sex)
titanic$Embarked <- factor(titanic$Embarked)
titanic <- na.omit(titanic)
head(titanic)
##   Survived Pclass    Sex Age SibSp Parch    Fare Embarked
## 1        0      3   male  22     1     0  7.2500        S
## 2        1      1 female  38     1     0 71.2833        C
## 3        1      3 female  26     0     0  7.9250        S
## 4        1      1 female  35     1     0 53.1000        S
## 5        0      3   male  35     0     0  8.0500        S
## 7        0      1   male  54     0     0 51.8625        S

Let’s build a model

Let’s see what are our chances assessed by the random forest model.

library("randomForest")
set.seed(123)
model_rf <- randomForest(Survived ~ . , data = titanic)
model_rf
## 
## Call:
##  randomForest(formula = Survived ~ ., data = titanic) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 18.63%
## Confusion matrix:
##     0   1 class.error
## 0 384  40  0.09433962
## 1  93 197  0.32068966

Prediction to be explained

Let’s assume that we want to explain the prediction of a particular observation (male, 8 years old, traveling 1-st class embarked at C, without parents and siblings.

new_passanger <- data.frame(
            Pclass = 1,
            Sex = factor("male", levels = c("female", "male")),
            Age = 8,
            SibSp = 0,
            Parch = 0,
            Fare = 72,
            Embarked = factor("C", levels = c("","C","Q","S"))
)

Model prediction for this observation is .558 for survival.

predict(model_rf, new_passanger, type = "prob")
##       0     1
## 1 0.442 0.558
## attr(,"class")
## [1] "matrix" "votes"

Here shapper starts

To use the function shap() function (alias for individual_variable_effect()) we need four elements

  • a model,
  • a data set,
  • a function that calculated scores (predict function),
  • an instance (or instances) to be explained.

The shap() function can be used directly with these four arguments, but for the simplicity here we are using the DALEX package with preimplemented predict functions.

library("DALEX")
exp_rf <- explain(model_rf, data = titanic[,-1])

The explainer is an object that wraps up a model and meta-data. Meta data consists of, at least, the data set used to fit model and observations to explain.

And now it’s enough to generate SHAP attributions with explainer for RF model.

library("shapper")
ive_rf <- shap(exp_rf, new_observation = new_passanger)
ive_rf
##     Pclass  Sex Age SibSp Parch Fare Embarked _id_ _ylevel_ _yhat_
## 1        1 male   8     0     0   72        C    1           0.558
## 1.1      1 male   8     0     0   72        C    1           0.558
## 1.2      1 male   8     0     0   72        C    1           0.558
## 1.3      1 male   8     0     0   72        C    1           0.558
## 1.4      1 male   8     0     0   72        C    1           0.558
## 1.5      1 male   8     0     0   72        C    1           0.558
##     _yhat_mean_ _vname_ _attribution_ _sign_      _label_
## 1     0.3672941  Pclass   0.070047752      + randomForest
## 1.1   0.3672941     Sex  -0.154519708      - randomForest
## 1.2   0.3672941     Age   0.143046212      + randomForest
## 1.3   0.3672941   SibSp   0.003154522      + randomForest
## 1.4   0.3672941   Parch  -0.018111585      - randomForest
## 1.5   0.3672941    Fare   0.086728705      + randomForest

Plotting results

To generate a plot of Shapley values you can simply pass an object of class importance_variable_effect to a plot() function. Since we are interested in the class Survived = 1 we may add additional parameter that filter only selected classes.

plot(ive_rf)

Labels on y-axis show values of variables for this particular observation. Black arrows show predictions of model, in this case, probabilities of each status. Other arrows show effect of each variable on this prediction. Effects may be positive or negative and they sum up to the value of prediction.

On this plot we can see that model predicts that the passenger will survive. Changes are higher due to young age and 1st class, only the Sex = male decreases chances of survival for this observation.

More models

It is useful to contrast prediction of two models. Here we will show how to use shapper for such contrastive explanations.

We will compare randomForest with svm implemented in the e1071.

library("e1071")
model_svm <- svm(Survived~. , data = titanic, probability = TRUE)
model_svm
## 
## Call:
## svm(formula = Survived ~ ., data = titanic, probability = TRUE)
## 
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  radial 
##        cost:  1 
##       gamma:  0.1 
## 
## Number of Support Vectors:  338

This model predict 32.5% chances of survival.

attr(predict(model_svm, newdata = new_passanger, probability = TRUE), "probabilities")
##           0         1
## 1 0.6748768 0.3251232

Again, we create an explainer that wraps model, data and the predict function.

exp_svm <- explain(model_svm, data = titanic[,-1])
ive_svm <- shap(exp_svm, new_passanger)

Shapley values plot may be modified. To show more than one model you can pass more individual_variable_plot objects.

plot(ive_rf, ive_svm)

To see only attributions use option show_predcited = FALSE.

plot(ive_rf, show_predcited = FALSE)

More

Documentation and more examples are available at https://modeloriented.github.io/shapper/. The stable version of the package is on CRAN, the development version is on GitHub (https://github.com/ModelOriented/shapper). Shapper is a part of the DALEX universe.

DWUMiAN – przyjdź, posłuchaj, opowiedz!


Niewiele jest imprez tak bliskich mojemu sercu jak studencka konferencja DWUMiAN.

Konferencja organizowana przez dwa największe wydziały matematyczno-informatyczne w Warszawie (MiNI PW i MIM UW).

Pierwsza edycja miała miejsce na wydziale MiNI PW, a wykład otwierający miał dziekan MIM UW, prof. Paweł Strzelecki.
W tym roku konferencja ma miejsce na wydziale MIM UW, a wykład otwierający ma dziekan MiNI PW, prof. Wojciech Domitrz.

W programie wiele ciekawych referatów, też o analizie danych (lista zaproszonych gości).

Najważniejsze: do 10 marca można się jeszcze rejestrować. Można też zgłaszać propozycje prezentacji i plakatów! Zawsze warto opowiedzieć o zrealizowanych ciekawych projektach braci studenckiej (ciekawe staże wakacyjne, prace dyplomowe, projekty uczelniane i poza uczelniane są mile widziane).

Oby było więcej takich inicjatyw. Inicjatyw, które łączą i budują pomosty.
Wśród organizatorów są oczywiście osoby z MI2DataLab (wiwat Alicja!), a SmarterPoland jest organizacją wspierającą.

Zarejestruj się tutaj!