0:00:00: Olá pessoal, hoje nós vamos falar sobre um assunto muito importante.

0:00:05: Esse mês tem esse evento que é o outubro rosa e para dar alguma contribuição para esse movimento

0:00:12: eu decidi fazer um vídeo sobre interpretação de machine learning usando um data set clássico

0:00:20: sobre o diagnóstico de câncer de mama.

0:00:24: Como vocês podem ver aqui, a gente vai prever se um câncer é benigno ou maligno.

0:00:32: Nesse vídeo eu quero mostrar como é que a gente pode fazer quando a gente tem esses data sets tabulares

0:00:39: mais comuns que a gente encontra, como é que a gente faz para tentar entender e que o modelo de machine learning

0:00:45: está enxergando, quais são os padrões que ele está capturando, como é que… como cada variável afeta

0:00:51: a previsão que a gente está tentando fazer.

0:00:54: Isso é importante não só para a gente entender o modelo, mas também pode nos dar conhecimento

0:00:59: sobre a área que a gente está tentando modelar.

0:01:02: Existem padrões que a gente pode tirar de um modelo.

0:01:07: O modelo de machine learning não é só para prever, ele pode ser mais do que simplesmente uma caixa preta de previsão.

0:01:13: Ele pode ser uma ferramenta de descoberta para a gente entender melhor o problema que a gente está tentando modelar

0:01:19: e às vezes até vale a pena você treinar um modelo que você nem vai usar para prever com ele mesmo,

0:01:25: mas efetivamente para explorar, para entender os seus dados, se os seus dados fazem sentido,

0:01:31: se as variáveis têm influência naquilo que você quer prever, então é muito importante.

0:01:37: Essa área de interpretação de machine learning tem crescido bastante.

0:01:41: Para a gente entender melhor o que a gente vai modelar aqui, são variáveis computadas de uma imagem,

0:01:48: de um tipo de exame, imagino eu, que descrevem características do núcleo da célula presente na imagem.

0:01:56: Vamos ver aqui quais são essas variáveis. São 10 variáveis, nós temos um ID,

0:02:03: pode ser de cada paciente, pode ser de cada imagem, pode ser que sejam mais de uma imagem por paciente,

0:02:11: é uma classificação binária que a gente vai fazer aqui entre um tumor maligno ou benigno.

0:02:16: Para cada núcleo a gente tem o raio, a textura, o perímetro, nós temos aqui várias métricas

0:02:24: que a gente vai conseguir entender como afetam o diagnóstico entre maligno e benigno.

0:02:29: Aqueles computados pegaram de vários núcleos de célula que tem na imagem e aí eles computaram a média,

0:02:37: o erro padrão e o pior valor dentre as células que estavam na imagem para cada um desses campos.

0:02:45: Então aqui eles dão um exemplo, para o raio da célula, para o raio do núcleo da célula nós temos a média do raio,

0:02:53: imagino eu se você tiver 10 núcleos na tua imagem, a média desses 10 raios, o erro padrão e aqui o pior dos raios.

0:03:04: E a distribuição aqui são 357 peninos, 212 malignos.

0:03:10: Para a gente realmente vai importar mais a média aqui, eu acho que para a gente interpretar uma primeira vez esse modelo,

0:03:17: a média é o que a gente consegue pensar melhor, pelo menos eu não sou especialista nessa área.

0:03:23: Eu imagino que o especialista consiga encontrar, consiga enxergar de uma forma diferente essas informações,

0:03:30: mas como não especialista fazendo um primeiro modelo para essa tarefa, eu vou pegar as features que se referem à média

0:03:37: desses campos que eles decidiram medir dos núcleos das células.

0:03:41: Já aqui no nosso conhecido JupyterLab, com os dados devidamente descomprimidos, nós vamos importar o pandas numpy

0:03:52: e fazer aquele comando do matplotlib inline.

0:03:56: Vamos carregar os dados e dar uma olhada no que a gente tem aqui.

0:04:00: Nós temos aqueles campos que já eram esperados, eu já vou filtrar aqui as features para serem só features de média.

0:04:10: Vamos pegar features igual data.filter.

0:04:15: Você pode selecionar colunas por uma expressão regular, eu vou pegar todas aquelas que tiverem min no nome.

0:04:25: Vamos dar uma olhada aqui no resultado, temos aqui 10 colunas, só as colunas de média.

0:04:32: Como y, vamos pegar a coluna diagnosis e já vou fazer o mapa para ela de 0 e 1.

0:04:45: Então o que for m, que é maligno, vai ser 0 e o que for b, que é benigno, vai ser 1.

0:04:52: Vamos dar uma olhada aqui nos valores, igualzinho a gente viu lá no site do Cable.

0:04:58: Tem uma coisa interessante aqui, normalmente a gente precisa dividir entre treino e validação para a gente ver se o modelo está bom.

0:05:08: Se for só para você interpretar o modelo, se você só estiver fazendo o modelo de descoberta, você não necessariamente precisa fazer essa divisão.

0:05:18: Na verdade você está interessado no que o modelo aprendeu internamente, então essa divisão se torna um pouco menos importante.

0:05:26: É interessante fazer ainda essa divisão porque também você não quer interpretar um modelo que não generalize,

0:05:33: então eu sempre gosto de ver se o modelo generaliza bem, tem um modelo legalzinho nas métricas tradicionais do machine learning,

0:05:42: e aí eu interpreto esse modelo, eu passo esse modelo para a biblioteca de interpretação.

0:05:48: Vamos pegar aqui a função para dividir os nossos dados, aí nós vamos ter xtren, xval, ytren, yval igual trainTestSplit,

0:06:02: features y e vamos fazer um split 5050, só verificar aqui que eu coloquei as coisas na ordem certa, então nós temos as features como xtren, xval e ytren, yval.

0:06:20: São efetivamente os mesmos números só que só uma coluna que é o nosso y.

0:06:27: Vamos pegar uma random forest, é um modelo muito bom para isso porque você acaba conseguindo criar de forma rápida um modelo que já vai ser bem preciso,

0:06:43: aqui colocando a nossa seed para ter certeza que nós vamos ter resultados que a gente possa reproduzir com o mínimo de ruído possível,

0:06:51: e aí a gente faz o nosso fit, eu vou pegar aqui uma função que é a classificationReport,

0:06:59: ele vai dar um relatóriozinho mais legal para a gente sobre o que esse modelo está realmente fazendo, então a gente precisa pegar aqui as previsões,

0:07:07: xval, e a gente precisa passar essas previsões para a classificationReport, primeiro a gente passa o nosso yval, a gente passa o nosso p,

0:07:19: e ele dá para a gente esse relatóriozinho da precision, do recall, do f1 score, e quantos itens a gente tem em cada um para determinar isso.

0:07:32: O que a gente vê, precision que é basicamente de todo mundo que o nosso modelo falou que era um, quantos realmente são da classe um,

0:07:39: de todos os exemplos que o nosso modelo falou que eram malignos, quantos realmente eram malignos, basicamente assim que eu interpreto a precision.

0:07:48: Recall é uma métrica um pouco diferente, que é de todos os exemplos benignos que a gente tinha, quantos a gente conseguiu detectar,

0:07:56: então mais ou menos a taxa de detecção, e aqui de todos os exemplos malignos que a gente tinha, quantos a gente conseguiu detectar.

0:08:03: O f1 score é uma média harmônica entre esses dois valores, isso aqui está legal, quer dizer que toda vez que o nosso modelo viu um exemplo e falou esse aqui é benigno,

0:08:14: 92% do tempo ele acertou, realmente era benigno, e aqui 97% a mesma coisa para o maligno.

0:08:21: Eu acho que a gente tem poucos exemplos, mas vocês já pegam a ideia, eu estou satisfeito com esse modelo,

0:08:27: eu acho que ele é bom bastante para a gente poder usar num ambiente de interpretação que é o nosso objetivo aqui.

0:08:35: Nós temos 93% aqui de acurácia, que é uma acurácia bem legal também.

0:08:40: Para interpretar os modelos a gente vai usar uma biblioteca chamada SHAP.

0:08:44: Essa biblioteca SHAP é uma das coisas mais legais de machine learning dos últimos tempos, claro que na minha opinião.

0:08:51: Por que? Ela consegue praticamente criar um interpretador para qualquer modelo, basicamente ela é independente de modelo.

0:09:01: Eles têm várias maneiras de a gente interpretar um modelo, só que essa SHAP é a minha preferida no momento até surgir alguma outra que eu gosto demais.

0:09:13: E como diz aqui, eles unem vários métodos, eles construíram esse SHAP em cima de vários outros métodos e tornou-se essa biblioteca incrível

0:09:25: que eu sempre, sempre uso quando eu quero entender o que o modelo está fazendo.

0:09:29: O legal é que é muito simples de usar, eles são otimizados tanto para árvores quanto para redes neurais.

0:09:39: Se você vir para redes neurais, tem TensorFlow, Keras, eles têm essa maneira também de explicar esses modelos.

0:09:48: Eu testei com o TensorFlow esses dias, então no momento que esse vídeo está saindo ainda existe um problema com o TensorFlow 2.0, mas certamente logo eles vão consertar.

0:09:58: E basicamente o que a gente vai ter aqui são algumas maneiras de entender os nossos dados.

0:10:05: Vamos copiar aqui algumas linhas que a gente precisa para importar essa biblioteca e para a gente ver como é que ela funciona.

0:10:13: Precisa desse SHAP.init.js para que a gente possa ver os gráficos bem bonitos que esse SHAP tem.

0:10:21: Para a gente gerar os valores, esses valores são baseados, se eu não me engano, em um método que é mais popular na teoria dos jogos.

0:10:30: E eu não vou tentar explicar aqui os detalhes porque eu não me sinto qualificado para te dizer exatamente como é que ele está funcionando por dentro ainda,

0:10:39: mas eu recomendo, logicamente, que você leia sobre esse método, que você entenda melhor esse método, mas de qualquer maneira ele é muito simples de usar.

0:10:50: A gente passa o nosso modelo aqui, no caso como nosso modelo é de árvore, a gente passa para o TRIExplainer.

0:10:56: Se você olhar no site, no repositório do GitHub, você vê que ele tem o TRIExplainer, DeepExplainer, LinearExplainer, ele tem um monte de métodos para explicar,

0:11:08: inclusive esse KernelExplainer que funciona para qualquer modelo. Então é bem legal mesmo.

0:11:15: Então a gente cria o TRIExplainer e a gente vai passar o nosso Xtrain.

0:11:21: Faz um pouco mais de sentido a gente fazer a interpretação do Xtrain porque foram os dados usados para criar o modelo.

0:11:28: Se esses dados foram usados para criar o modelo, é mais lógico que a gente tente entender os padrões desse modelo, as relações que esse modelo está capturando, usando esses mesmos dados.

0:11:42: A gente cria aqui, então a gente vai ter dois novos objetos, nós temos o Xtrain e o Shap Values.

0:11:49: Esse Xtrain é simplesmente um objeto do Shap Values e o Shap Values é interessante porque ele vai ser uma lista de duas arrays.

0:11:58: No caso da classificação vai ser uma lista de duas arrays e ele cria para cada exemplo e cada feature ele vai ter ali,

0:12:07: ele vai ter um valor ali para cada feature que ele calcula nesse método interno que ele usa.

0:12:13: Por que nós temos dois? Porque quando a gente pega a saída do Scikit-Learn, ele previu duas classes, então ele acaba criando duas matrizes aqui.

0:12:24: Como é que a gente usa então? Uma das maneiras da gente usar é fazendo esse force plot.

0:12:31: O que é esse force plot? A gente tem que pegar o Expected Value, que é a previsão média para os nossos dados, é uma base e a gente tem que passar.

0:12:41: Um exemplo, no caso a gente está selecionando o primeiro exemplo aqui dos nossos dados.

0:12:47: A gente passa todas as colunas da matriz de Shap values e todas as colunas da nossa matriz de train, todas as nossas features.

0:12:57: Aqui eu tive que mudar para o fundo branco para a gente conseguir ver o que está acontecendo.

0:13:02: O erro aqui foi o seguinte, nós temos duas, nós temos uma lista com as duas matrizes e uma matriz se refere à probabilidade do exemplo ser da classe 0

0:13:13: e a outra matriz se refere à probabilidade do exemplo ser da classe 1.

0:13:17: Para a gente é mais fácil interpretar como sendo da classe 1.

0:13:22: O mais importante é a segunda matriz que está na lista que ele retornou para a gente, então é a matriz Shap Values 1.

0:13:30: Porque essa é a matriz da probabilidade do exemplo ser benigno.

0:13:33: Aqui pegando o primeiro exemplo a gente vê que ele teve probabilidade 0.01 de pertencer à classe 1, de ser benigno.

0:13:40: Por que ele teve essa probabilidade? Os concave points tem essa média, a concavidade tem esse valor de média.

0:13:49: Então ele tenta explicar o seguinte, quanto cada feature contribuiu para essa probabilidade passar do valor base de 0.62 para 0.01.

0:14:00: Então todo mundo sem informação nenhuma a gente prevê 0.62, só que conforme ele vê as features ele vai reduzindo, o modelo vai reduzindo essa probabilidade até chegar à probabilidade 0.01.

0:14:13: Vendo um segundo exemplo, esse no caso tem probabilidade, basicamente ele está dando a probabilidade 100% de ser benigno.

0:14:23: E ele está falando, essa feature aqui influenciou, jogou a probabilidade de pouco menos de 0.9 aqui, mais ou menos 0.9 para 100%.

0:14:34: Essa aqui levou o nosso score de 0.8 para basicamente 0.9.

0:14:40: E ele está falando, o modelo tomou essa decisão mais por causa dessas features.

0:14:46: Para que serve isso aqui na prática? Caso de crédito, por exemplo, ou no caso do diagnóstico médico mesmo, está cada vez mais importante a gente saber dizer porque o modelo tomou uma decisão.

0:14:58: Se você olhar apresentações de pessoas que trabalham na área de machine learning para saúde, os médicos confiam muito mais numa aplicação de inteligência artificial, numa aplicação de machine learning, se a aplicação consegue dizer para eles porque ela tomou aquela decisão.

0:15:15: Por isso é muito importante ter um método desses que explique para um exemplo específico, o que foi mais importante.

0:15:22: E essa é só uma forma de visualizar isso. Você pode pegar essas informações e colocar numa aplicação que simplesmente dê os três motivos pelos quais a gente está dizendo que esse exemplo pertence à classe 1, são essas variáveis aqui.

0:15:42: A grande sacada aqui é você poder para cada exemplo entender porque ele saiu do valor base para ter a probabilidade que ele tem.

0:15:51: Mas o SHAP não é só isso. Esse force plot também pode nos dar uma outra visão dos dados que é a seguinte.

0:16:01: Aqui você consegue ver para os exemplos que você tem quais foram as previsões.

0:16:07: Aqui eu aumentei um pouco para a gente poder ver e ele tem várias sequências possíveis de se ordenar. Nesse caso ele está ordenando por similaridade, imagino eu que seja a similaridade entre as features que a gente tem.

0:16:22: Mas a gente pode fazer aqui por exemplo na ordem original dos exemplos que a gente tem. No eixo Y ele coloca o valor da probabilidade de ser da classe 1 e no eixo X a gente pode colocar basicamente a ordem pelas features que a gente tem.

0:16:42: Vamos dizer que eu queira ver como a média da concavidade aqui afeta o valor de saída. Ele vai ordenar desde a concavidade menor até a concavidade maior.

0:16:58: Então nós temos aqui de 0 a pouco mais de 0.4 de concavidade, de média de concavidade. E aqui a gente vê claramente o ponto em que o modelo decidiu que os exemplos têm menor chance de ser benigno.

0:17:17: Se passa aqui do ponto 1 você vê que o modelo já fica bem mais convencido de que esses exemplos são malignos.

0:17:25: Agora os dois gráficos que eu mais gosto do Shep são os seguintes. Um deles é o Summary Plot que basicamente ele vai calcular quais são as features mais importantes.

0:17:35: Então nesse caso ele está falando entre todos os exemplos quais são as features mais importantes.

0:17:40: E a gente até já tem isso em modelo de árvore normalmente a gente tem as features importances. Mas o legal aqui é que ele te dá um pontinho para cada exemplo que você tem.

0:17:52: E ele colore os pontinhos. Por exemplo aqui ele está dizendo a média dos pontos côncavos é a feature mais importante para a gente prever se vai ser um tumor benigno ou maligno.

0:18:04: Esse gráfico pelo menos a primeira vez que eu vi não foi tão fácil de interpretar. Então é outra coisa que é interessante você passar um tempo olhando para ele fazendo vários deles.

0:18:13: Para você entender porque vale muito a pena entender que é um gráfico muito legal da gente ver dos modelos.

0:18:19: Basicamente a cor é o valor da feature quando o valor da média de pontos côncavos é menor ele é azul. Quando o valor dessa feature é maior ele é vermelho.

0:18:29: E aqui no eixo X ele tem o Shep Value que é como está escrito aqui o impacto no modelo. O impacto na previsão.

0:18:38: O que acontece para esse lado aqui da direita quer dizer que o impacto aumenta a previsão de ser benigno. Para esse aqui na esquerda ele diminui a previsão de ser benigno.

0:18:49: Então a gente vê claramente que essa feature é muito muito correlacionada com a chance de ser benigno ou maligno.

0:18:57: A gente vê que majoritariamente quando essa feature está azul, ou seja quando essa feature tem um valor baixo, o modelo gosta muito de jogar a probabilidade do exemplo ser benigno para cima.

0:19:10: E quando essa feature já é mais alta em geral o modelo quer jogar a probabilidade de ser benigno para baixo.

0:19:17: E é legal porque você pode ver onde está a concentração maior de pontos com esses valores dessas features e também que o modelo prevê com a probabilidade maior ou menor de pertencer às classes.

0:19:29: Aqui a gente vê que a dimensão fractal, média da dimensão fractal dos núcleos de células já não é tão importante.

0:19:36: A maioria aqui está bem colorido no meio, então o modelo não consegue através dessa feature distinguir muito bem quem deve ir para classe 1 ou quem deve ir para classe 0.

0:19:48: Eu prefiro muito mais olhar um gráfico desses do que olhar o gráfico de feature importance normal dos modelos de árvore.

0:19:57: Esse eu diria que é o meu segundo gráfico favorito do SHAP, mas o primeiro gráfico favorito é o dependence plot.

0:20:05: O que acontece nesse gráfico? Você precisa novamente passar os SHAP values aqui e o teu Xtrain, só que você pode selecionar uma feature para ver como que ela realmente, como a variação nela afeta a tua previsão.

0:20:22: Só que de uma forma que eu penso ser mais claro do que aquele force plot que a gente viu.

0:20:27: Então vamos pegar aqui essa feature que é a mais importante, Concave Points Min.

0:20:33: Como é que a gente interpreta esse gráfico?

0:20:36: Aqui é importante colocar esse interaction index igual None, porque normalmente por padrão ele coloca duas variáveis nesse gráfico.

0:20:45: Ele coloca três variáveis, aliás, nesse gráfico. Ele coloca uma variável no X, a influência na previsão no eixo Y e coloca uma variável colorida aqui para a gente poder fazer uma análise de duas variáveis,

0:20:57: afetando a nossa previsão. Só que quando a gente coloca interaction index None, ele faz simplesmente uma das features com a influência dela na previsão.

0:21:07: Então quanto maior esse valor aqui, maior é a influência dela puxando a nossa previsão para ser da classe 1, para o exemplo ser da classe 1.

0:21:17: E aqui a gente vê os exemplos que estão nos nossos dados de treino. Se o valor dessa feature está abaixo de.05, o modelo está bem confiante que ele pode aumentar a probabilidade de ser um tumor benigno.

0:21:30: Mas quando essa feature passa de.05, aqui ele fica meio confuso, alguns ele ainda joga, mas você vê que existe um padrão muito claro de como essa feature está afetando as nossas previsões.

0:21:44: Alguém que trabalha com saúde pode comentar aqui no vídeo se efetivamente isso faz sentido, mas como é que a gente pode ver aqui?

0:21:51: Se eu tivesse escolher apenas uma característica dos exames para tentar entender o resultado, se eu simplesmente pegar essa variável e fizer um corte aqui,

0:22:02: eu sei que a chance do tumor ser benigno é muito maior quando essa média de pontos côncavos das células é menor que.05.

0:22:16: Esse para mim é o melhor gráfico que tem no SHAP, porque ajuda muito a gente a interpretar efetivamente o que o modelo está fazendo.

0:22:24: Ele está praticamente dizendo para a gente, considerando todas as interações mais complexas com outras variáveis e tudo mais, como que essa variável afeta a nossa previsão,

0:22:35: como que essa variável afeta o fenômeno que a gente está tentando prever. A gente pode fazer isso para outras variáveis também.

0:22:41: Vamos pegar aqui a área do núcleo das células, a média da área, o padrão também é parecido, mas ele vai mudando.

0:22:49: Para a gente ter uma ideia completa, vamos dizer, ok, eu sei que essa é a variável mais importante, só que eu quero ver como é que as outras variáveis interagem com ela para gerar essa previsão.

0:23:00: Você vem aqui no Interaction Index e coloca a variável que você quer saber a interação, roda de novo esse gráfico e aí você vai ter, e aqui é bastante informação,

0:23:14: mas você vai ter no X a primeira variável e as cores dos seus pontos vão ser relacionadas ao valor da variável que você escolheu como interação.

0:23:24: Qual o poder disso? A gente vê que não só a média da área menor nos dá uma probabilidade maior de ser um tumor benigno,

0:23:35: mas a gente vê também que essa variável é correlacionada com essa outra, com cave points.

0:23:42: Aqui a gente consegue ver que tanto com cave points quanto a média da área são baixos em exemplos que o modelo atribui uma maior probabilidade de serem benignos.

0:23:54: A gente vê o contrário quando a área cresce, quando a área cresce, a média de pontos côncavos aqui das células também vai crescendo, a gente vê que ela está bem mais vermelha,

0:24:05: o valor dessa variável está maior e ele até certo ponto ele indica que a probabilidade de ser um tumor benigno vai sendo menor.

0:24:15: Eu recomendo que você acesse o site, instale e passe tempo, seja num dataset público ou num dataset que você esteja trabalhando, passe um tempo com o SHAP,

0:24:25: porque saber interpretar os seus modelos vai trazer muito benefício para você tanto em saber usar melhores modelos quanto saber explicar para as áreas não técnicas o que o teu modelo está fazendo,

0:24:40: porque eles podem confiar no teu modelo.