Um Guia Prático para Interpretar e Visualizar Máquinas de Vetores de Suporte

SVM's são frequentemente considerados 'Black Boxes'. Neste artigo, abordamos técnicas para visualizar modelos SVM aprendidos e seu desempenho em dados do mundo real.

Hugo Dolan Blocked Unblock Seguir Seguindo 12 de janeiro Tiro da imagem por Hugo Dolan

Sobre o autor

Hugo Dolan é aluno de graduação em Matemática Financeira na University College Dublin. Isso é baseado e motivado principalmente por experiências recentes de análise de dados e aprendizado de máquina na Competição NFL Punt Analytics Kaggle e por fazer parte da equipe que ganhou o Citadel Dublin Data Open, juntamente com material do curso online CS229 de Stanford.

Este artigo contém as seguintes seções:

  1. Introdução aos Modelos Lineares, SVMs e Kernels
  2. Interpretando espaços de recursos projetados de alta dimensão que estão utilizando kernels SVM…
  3. Técnicas para avaliar o desempenho de limites de classificação de alta dimensionalidade
  4. Opções práticas para trabalhar com grandes desequilíbrios de classe
  5. Quantos dados você precisa para treinar um SVM

Algumas suposições eu farei:

Este artigo assumirá familiaridade com modelos básicos de ML, como Logistic and Linear Regression. Também assumirá que você sabe como desenhar alguns dos gráficos que eu discuto (eu tenho um guia para isso se você estiver preso!). Também assumiremos que você sabe o que é uma função de decisão e função de objetivo / custo e que você tem algum conhecimento básico de álgebra linear. Se ainda não vale a pena ler, você pode sempre marcar isso e voltar mais tarde para uma passagem mais profunda em algumas das partes mais matemáticas deste artigo.

Introdução aos Modelos Lineares, SVMs e Kernels

Em classificadores lineares de aprendizado de máquina, existe qualquer modelo no qual existe uma única função de hipótese que mapeia entre entradas de modelo e saídas previstas.

Muitos modelos, como regressão logística, Naive Bayes e análise discriminante, para citar alguns, são exemplos de modelos lineares.

A principal vantagem dos modelos lineares sobre redes neurais (um modelo não linear) é que os pesos dos recursos correspondem diretamente à importância do recurso dentro do modelo. Assim, é fácil entender o que o modelo aprendeu.

Ao treinar um modelo de Regressão Regularizada L1, fica imediatamente óbvio que a maioria de nossos recursos em nosso conjunto de dados é totalmente irrelevante para prever nossa saída. É claro que as características 0,1 fazem contribuições positivas para o modelo, enquanto a presença de características 2,3,4 em um determinado exemplo resulta em contribuições negativas para a saída.

No núcleo de qualquer modelo linear é um produto de ponto entre o exemplo de entrada e o vetor de parâmetro / peso. No caso da regressão linear, essa é toda a função da hipótese. Onde a regressão logística alimenta o produto escalar por meio de uma função sigmóide, de tal forma que a saída está entre 0 e 1 e, portanto, é adequada para problemas de classificação binária.

Ao considerar problemas de classificação, a queda de modelos lineares é que, em última instância, o limite de decisão é uma linha reta, plano ou hiperplano, com coeficientes iguais aos pesos / parâmetros do modelo e, portanto, só pode classificar dados linearmente separáveis, o que pode ser uma grande limitação. trabalhando em problemas de análise mais complexos.

Como podemos ver, o modelo linear simples não pode separar os dois 'Noisy Hyperbola', pois ele só pode encaixar um plano / reta 'reta' nos dados. O segundo exemplo usa um modelo não linear (na verdade, um truque do kernel, chegaremos a isso em breve)

A Support Vector Machine (SVM) é o único modelo linear que pode classificar dados que não são linearmente separáveis.

Você pode estar se perguntando como o SVM, que é um modelo linear, pode ajustar um classificador linear a dados não lineares. Intuitivamente com um modelo de regressão linear simples, podemos projetar manualmente os recursos x, x², x³,… para tentar obter um ajuste para um conjunto não linear de pontos de dados.

Enquanto o recurso X é a única variável independente que temos que prever y, que tem uma relação inerentemente não linear com x, podemos projetar recursos x² e x³ para melhorar nosso ajuste para y.

Transferindo esta intuição para o nosso SVM, quando projetamos o recurso x², estamos essencialmente multiplicando o recurso x por si mesmo. Portanto, suponha que projetemos os recursos do nosso conjunto de dados multiplicando as combinações de recursos x1, x2, x3 … juntos e, teoricamente, poderíamos * acabar com um espaço no qual seus recursos projetados sejam linearmente separáveis. Tomando o exemplo simples anterior, observe como os dados abaixo são transformados em uma tendência quase linear no espaço de recursos x³.

Como uma intuição adicional em relação ao exemplo anterior, podemos ver transformando o eixo x do espaço de recurso original de x até o espaço de recurso de x³ como o modelo poderia ser visto como uma relação linear entre x³ e y.

Infelizmente, para conseguir isso com um conjunto de dados complexo, é necessário criar mais do que apenas um espaço tridimensional (recursos x, x², x³), mas de fato, espaços de recursos extremamente grandes que seriam computacionalmente muito caros calcular para cada exemplo em nosso conjunto de dados. Abaixo mostro um exemplo de uma função ø (x) que pega nossas características originais xe as combina para criar muitos recursos polinomiais de 2ª ordem.

Antes de prosseguir : vou usar a notação de x para denotar pontos de dados / exemplos de treinamento com sobrescritos para denotar um determinado ponto de dados e subscritos para denotar um determinado recurso.

Esse é um espaço tipicamente alto, se tivéssemos 100 recursos originalmente, essa função produziria 100 * 100 recursos projetados. Isto é computacionalmente caro, neste caso, complexidade de tempo Big-O (n²), pense em ter que escrever dois loopings aninhados para gerar todas as combinações produzidas por ø (x).

Felizmente para nós existe uma saída para este enigma da complexidade computacional! Quando derivamos o problema de otimização para um SVM (a fórmula de aparência complexa que nos diz como derivar e atualizar nossos pesos para maximização durante a subida de coordenadas), descobrimos que nossos vetores de recursos para nossa entrada de treinamento x aparecem em apenas um lugar dentro do toda a fórmula de otimização (destacada em vermelho).

Este produto escalar foi para o nosso espaço de características original, então agora vamos substituí-lo com o nosso espaço de características do engenheiro usando nossa função ø.

Então, como isso ajuda a reduzir a complexidade computacional? Bem, por definição do produto escalar, tomamos a i-ésima entrada de ø (x (i)) e multiplicamos pela i-ésima entrada de ø (x (j)) e então somamos todos estes para obter um único scaler. Aplicando isso, obtemos:

Como por magia, podemos remover a necessidade de computar ø (x) completamente por simples manipulação algébrica pelo truque do kernel. Agora, temos todos os benefícios de um espaço de recursos de alta dimensão sem a complexidade computacional adicional

O truque do kernel é um rearranjo realmente simples da equação original, podemos ver que removemos totalmente ø (x) e só temos que realizar computações usando nossos recursos de entrada originais, mas ainda temos o efeito de computar um espaço dimensional alto.

Tudo o que temos a fazer agora é substituir o produto ponto envolvendo ø (x) pelo equivalente do kernel (K (x ^ i, x ^ j)):

Simples substituição, note que o nosso Kernel está usando xez aqui apenas para remover a notação sobrescrita.

Da mesma forma, quando queremos usar nosso modelo para fazer previsões, nunca calculamos explicitamente os pesos para nosso espaço dimensional alto, mas usamos o truque do kernel para fazer nossas previsões:

Em resumo, podemos usar o truque do kernel para transformar um conjunto de dados não linear em um conjunto de dados que é linearmente separável, apenas em um espaço de dimensão superior. O Sklearn vem pré-empacotado com um número de kernels na implementação do SVC, incluindo Radius Basis Kernel (RBF) e Polynomial Kernels, cada um tem seus próprios hyper parameters que podem ser ajustados experimentalmente usando validação cruzada para alcançar os melhores resultados.

Um ligeiro percalço, interpretando um espaço de alta engenharia dimensional…

Portanto, lembre-se de como dissemos que o grande benefício de um modelo linear era que os pesos / parâmetros do modelo poderiam ser interpretados como a importância dos recursos. Bem, depois que projetamos um conjunto de recursos de alta ou infinita dimensão, os pesos do modelo implicitamente correspondem ao espaço de alta dimensão que não é útil para ajudar nosso entendimento.

Em vez disso, o que podemos fazer é ajustar um modelo de regressão logística que estima a probabilidade de o rótulo y ser 1, dadas as características originais, onde f (x) é a função de decisão da SVM:

Se isso parece familiar, pense em regressão logística!

Usamos a estimação de máxima verossimilhança para ajustar os parâmetros deste modelo de regressão logística, a técnica é chamada Platt Scaling, o artigo original [3] é definitivamente vale a pena ler se você está curioso sobre o funcionamento interno.

Então, como isso nos ajuda a entender como o SVM funciona? Bem, nós simplesmente ajustamos o modelo e selecionamos um ponto em nosso conjunto de dados para avaliá-lo, então perturbamos um recurso de cada vez através de um intervalo de valores, enquanto mantemos os outros recursos fixos. Podemos usar isso para desenhar um gráfico da sensibilidade do modelo para cada recurso.

O SKlearn vem com este recurso embutido no modelo SVC, você só precisa ter certeza de que a probabilidade = true, quando inicializar e depois usar o clf. função predict_proba (X) para obter as probabilidades.

Na prática, descobri que, em vez de apenas avaliar um único ponto, muitas vezes é melhor amostrar uma coleção de pontos relevantes, por exemplo. 40 exemplos negativos e média da distribuição de probabilidade por característica, para obter algo mais representativo.

Aqui está um exemplo que eu fiz quando estava trabalhando na Competição NFL Punt Analytics Kaggle, examinando os efeitos de vários fatores em concussões:

Eu peguei todos os exemplos negativos e calculei a média das probabilidades através deles, eu destaquei as áreas em vermelho para cada característica onde os jogadores eram mais propensos a receber uma concussão. Um truque se você tiver um monte de variáveis codificadas a quente, como papel de jogador, é agregá-las em um gráfico de barras e apenas observar a mudança líquida na probabilidade entre quando o recurso está presente e não presente.

Há também um ótimo exemplo aplicado a isso aplicado a dados de marketing [1] que você pode encontrar aqui . Eu também gostaria de agradecer a Georgi, que teve tempo para responder algumas das minhas perguntas sobre o jornal.

Técnicas de avaliação de desempenho

Quando você está lidando com modelos de alta dimensão envolvendo um SVM, seria bom poder visualizar como o modelo está classificando os pontos de dados sem confiar apenas em métricas como as pontuações F1 ou ROC AUC.

Embora alguns possam usar técnicas como a análise de componentes principais para visualizar a classificação, ao fazê-lo, perdemos as dimensões de nosso espaço de recursos e, assim, distorcemos o visual que estamos procurando alcançar.

Uma técnica legal que eu encontrei é chamada de 'Histograma de projetos' [2] e envolve a representação gráfica da distribuição da saída da função de decisão do SVM para seus conjuntos de treinamento e teste.

A função de decisão é fácil de obter na implementação do SVC do SKlearn. Basta chamar decision_function (X). Você desejará acompanhar os rótulos de seus conjuntos de dados para codificar em cores o seu histograma de projeções, conforme abaixo:

Um histograma de projeção é bastante simples de interpretar. O eixo x histograma identifica a distância de um exemplo de treinamento específico do limite de decisão do SVM (indicado pela linha tracejada central).

Um SVM tem uma margem de separação igual a 1 de cada lado do limite de decisão, essa é uma restrição imposta do problema de otimização dupla (os 'Vetores de Suporte' são pontos de dados situados ao longo dessas margens). Você notará no modelo acima que há algum vazamento nas áreas de margem e, de fato, passa de uma classe para a classe no lado oposto do limite de decisão. Isso ocorre porque definimos o hiper-parâmetro de regularização C> 0 (Ele permite uma compensação entre alguns erros de classificação e a minimização da função de objetivo do SVM).

Apesar de trabalhar com espaços característicos de alta dimensão, este gráfico visualiza com sucesso a região de limite de decisão e toda a classificação sem perda de dimensionalidade. Todas as métricas vistas em uma matriz de confusão (ou seja, número de positivos verdadeiros, falsos positivos, verdadeiros negativos e falsos negativos) também podem ser vistas através do histograma. Também nos permite observar se um modelo está generalizando bem para o conjunto de testes. Se o conjunto de testes tiver uma distribuição similar de saídas de função de decisão para o conjunto de treinamento, poderíamos dizer que o modelo tem bom desempenho na generalização. O modelo também pode ser usado para determinar se dados os hiper-parâmetros selecionados se o conjunto de dados é linearmente separável.

Opções práticas para lidar com dados desequilibrados

Quando um conjunto de dados tem um número desproporcional de exemplos para uma classe em relação a outra, dizemos que ela é desequilibrada.

Um exemplo de um conjunto de dados do mundo real que tem um desequilíbrio de mais de 3000: 1

Isso é um problema se quisermos construir um modelo de ML para prever ocorrências de minorias, já que podemos alcançar altos níveis de precisão simplesmente classificando erroneamente todos os exemplos de minoria como classe majoritária.

Isso ocorre comumente em dados do mundo real, seja identificando tecidos malignos, fraudes com cartões de crédito ou concussões em um esporte, devido à relativa raridade dos incidentes que desejamos identificar corretamente.

Existem duas práticas comumente aceitas para corrigir modelos ML trabalhando com dados desbalanceados:

  1. Excesso de amostragem da classe minoritária / subamostragem da classe majoritária
  2. Aumentando o peso para exemplos minoritários na função de custo

Opção 1: SMOTE

Há duas maneiras de fazer uma nova amostra dos dados, removendo exemplos existentes (Subamostra) ou adicionando novos exemplos (Sobre-amostragem). O método mais comumente aceito é sobreamostrar a classe minoritária usando um algoritmo chamado SMOTE (Synthetic Minority Oversampling Technique) [5]

É muito mais simples do que o nome sugere, para cada ponto minoritário no conjunto de dados, seleciona k mais próximo de outros exemplos minoritários (tipicamente 5) e interpola aleatoriamente novos exemplos minoritários ao longo da linha 'unindo' exemplos minoritários existentes.

Isto é uma coisa razoável a fazer, pois estamos simplesmente supondo que interpolando entre exemplos existentes semelhantes, obteremos novos exemplos da mesma classe.

Podemos ver como o SMOTE gerou novos pontos de dados ao longo das linhas de pontos existentes

Isso tende a melhorar significativamente o desempenho do modelo e ajuda a generalizar o limite de decisão para exemplos minoritários.

Opção 2: Introduzindo pesos na função objetivo

Outro procedimento que pode ser empregado é atribuir pesos mais altos na função objetivo para erros de classificação de exemplos minoritários. Isso incentivará o algoritmo a classificar corretamente as classes minoritárias.

Eu não tenho experiência pessoal usando este método, mas ele pode ser usado em conjunto com a opção 1. Este é um link para um bom artigo aqui [4] que detalha muitas abordagens para lidar com o desequilíbrio de classe

Quantos dados preciso para treinar um SVM?

Uma regra prática razoável é em torno de 10x tantos exemplos de treinamento quanto recursos, no mínimo. Se você tiver uma grande quantidade de dados de treinamento usando menos de 50.000 exemplos de treinamento, já que a implementação SVC em sklearn tem complexidade O (n³), o que significa que o tempo de convergência para uma solução aumenta de forma cúbica com o número de exemplos de treinamento. ficar bem devagar mesmo com um laptop decente ou um contêiner kaggle.

Geralmente vale a pena treinar em um conjunto de dados menor primeiro e ajustar o hyper-parameter do seu modelo. Você pode manter um pequeno conjunto de testes de validação cruzada para a seleção do modelo. Você pode se surpreender com o quão bem seu modelo se generaliza quando você testa seu conjunto de dados restante, apesar da pequena proporção de dados reais que você pode ter usado.

Nota: Se você é novato nisso, uma dica é usar o módulo split de teste de treinamento da sklearn e corrigir a semente aleatória para que seus resultados sejam reproduzíveis se você voltar a editar algum código anterior e executar novamente o procedimento de seleção de treinamento / modelo.

Conclusão

Espero que este artigo tenha sido útil, se você tiver comentários / perguntas, deixe-os abaixo, vou tentar respondê-los da melhor maneira possível. Você também pode me encontrar no LinkedIn .

Referências de papel

[1] Nalbantov, Georgi e C. Bioch, Jan & Groenen, Patrick. (2005). Resolvendo e Interpretando Problemas de Classificação Binária em Marketing com SVMs. 566-573. 10.1007 / 3–540–31314–1_69.

[2] Cherkassky, Vladimir & Dhar, Sauptik. (2010). Método Simples para Interpretação de Modelos de Classificação SVM Não Lineares de Alta Dimensão .. 267–272.

[3] Platt, J. (2019). Saídas probabilísticas para máquinas de vetores de suporte e comparações com métodos de verossimilhança regularizados . [online] Citeseer.ist.psu.edu. Disponível em: http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.1639 .

[4] Batuwita, Rukshan & Palade, Vasile. (2013). Métodos de aprendizagem de desequilíbrio de classes para máquinas de vetores de suporte. 10.1002 / 9781118646106.ch5.

[5] Chawla, NV, et al. “SMOTE: Técnica de sobre-amostragem de minoria sintética”. Journal of Artificial Intelligence Research , www.jair.org/index.php/jair/article/view/10302.

Texto original em inglês.