Suponha que eu tenha um classificador (pode ser um dos classificadores padrão, como árvore de decisão, floresta aleatória, regressão logística etc. etc.) para detecção de fraudes usando o código abaixo
library(randomForest)
rfFit = randomForest(Y ~ ., data = myData, ntree = 400) # A very basic classifier
Say, Y is a binary outcome - Fraud/Not-Fraud
Agora, eu previ em um conjunto de dados invisíveis .
pred = predict(rfFit, newData)
Em seguida, obtive o feedback da equipe de investigação sobre minha classificação e descobri que cometi um erro ao classificar uma fraude como Não-Fraude (isto é, um falso negativo ) . Existe alguma maneira que eu possa deixar meu algoritmo entender que ele cometeu um erro? Ou seja, alguma maneira de adicionar um loop de feedback ao algoritmo para que ele possa corrigir os erros?
Uma opção que posso pensar do alto da minha cabeça é criar um, de adaboost classifier
modo que o novo classificador corrija o erro do antigo. ou eu ouvi algo sobre Incremental Learning
ou Online learning
. Existem implementações (pacotes) existentes R
?
É a abordagem correta? ou Existe outra maneira de ajustar o modelo em vez de construí-lo do zero?
fonte
Respostas:
Uma estratégia de reforço pode melhorar o desempenho do seu modelo, por isso vale a pena tentar. Com relação ao aprendizado incremental / on-line, não conheço nenhum pacote no R que o implemente (outros, corrija-me se estiver errado). No Scikit Learn, existem classificadores fora do núcleo que permitem um aprendizado incremental. No entanto, se você estiver vinculado ao uso de R, poderá não ter outra opção a não ser gravar seu próprio modelo incremental. Em ambos os casos, analisar os classificadores fora do núcleo do Scikit Learn pode fornecer uma idéia de por onde começar.
Outro detalhe a ser lembrado é até que ponto a atualização do modelo em um único falso positivo ou falso negativo melhorará o desempenho do modelo. No domínio da fraude, geralmente existem milhares a milhões de vezes mais casos de não fraude do que fraude. Como tal, é importante tentar aprender a discriminar todas as instâncias de fraude corretamente, mas a atualização de um modelo em uma única instância de fraude provavelmente não mudará significativamente o modelo. Considere outras estratégias para fazer com que o modelo atribua mais significado às instâncias de fraude.
A maneira mais direta de melhorar seu modelo supervisionado, com base no feedback de investigadores humanos, seria criar um modelo separado das instâncias corrigidas (ou seja, as instâncias previstas incorretamente e depois rotuladas corretamente). Você pode, então, fazer com que seus dois modelos "votem" na classificação de instâncias futuras agregando as associações previstas para a classe. Por exemplo, o ModeloA pode acreditar que a Instância1 é [Fraude: 0,65, Não Fraude: 0,35], enquanto o ModeloB acredita que a Instância1 é [Fraude: 0,47, Não Fraude: 0,53]. A previsão do conjunto seria assim [Fraude: (0,65 + 0,47) /2=0,56, Não Fraude: (0,35 + 0,53) /2=0,44].
Se o seu modelo original tiver um desempenho melhor que o acaso, o número de instâncias classificadas corretamente será maior que o número classificado incorretamente. Portanto, você não deseja atribuir peso igual aos modelos se eles forem treinados em um número desproporcional de instâncias. Existem duas opções simples para lidar com essa disparidade: 1) espere até você acumular instâncias corrigidas suficientes para aproximadamente igual ao número em que o modelo original foi treinado ou 2) atribua peso a cada modelo com base no desempenho do modelo em um conjunto de validação.
fonte
Eu fiz algumas pesquisas no passado sobre aprendizado on-line e incremental. Há algumas idéias que você precisa levar em consideração.
Todo classificador pode 'fazer' aprendizado incremental, o único problema é que, com alguns, é muito mais difícil fazê-lo. Não existe um algoritmo de aprendizado incremental como tal, apenas uma maneira de conseguir essa compra usando os algoritmos comuns. Normalmente, você seleciona um deles e adapta a maneira como o treina e alimenta os dados em lote ou online.
Você pode fazer isso de duas maneiras: a) Treine novamente o modelo do zero sempre que uma nova amostra (ou conjunto de amostras) chegar. Obviamente, isso não é o ideal, mas se o seu modelo não for muito complexo (o que significa que você pode executar um treinamento inteiro entre as instâncias que estão chegando) e você limitar o tamanho do conjunto de dados (descartando dados antigos, novos ou aleatórios e mantendo um número constante de instâncias de treinamento ), ele pode funcionar em alguns cenários. Um bom exemplo desse aprendizado 'pseudo-incremental' com máquinas de vetores de suporte pode ser encontrado aqui .
b) Encontre uma maneira de atualizar os parâmetros / pesos do modelo modificando apenas 'um pouco' esses parâmetros quando a previsão estiver errada. As redes neurais são naturalmente ótimas para isso, pois você pode treinar um modelo, salvar pesos e treinar novamente com novos lotes de dados à medida que eles chegam. Além disso, você pode ajustar a taxa de aprendizado para dar mais / menos relevância às suas novas entradas. Se você pode escolher qualquer algoritmo para o seu caso, essa seria minha escolha. No entanto, existem muitos outros métodos: por exemplo, nas abordagens bayesianas, você pode modificar as distribuições aplicando incrementos / decrementos numéricos a determinados parâmetros (veja isso em outro exemplo).
Faça algumas leituras e procure abordagens anteriores que correspondam a qualquer que seja o comportamento do seu algoritmo de aprendizado. Pode parecer assustador no começo configurar tudo para você, em vez de usar essa ou aquela biblioteca, mas fica super legal quando você chega ao ponto em que se sente responsável por todo o processo de aprendizado do seu modelo.
Boa sorte!
fonte