Supongamos que tengo un clasificador (podría ser cualquiera de los clasificadores estándar como árbol de decisión, bosque aleatorio, regresión logística, etc.) para la detección de fraude usando el siguiente código
library(randomForest)
rfFit = randomForest(Y ~ ., data = myData, ntree = 400) # A very basic classifier
Say, Y is a binary outcome - Fraud/Not-Fraud
Ahora, he predicho en un conjunto de datos no visto .
pred = predict(rfFit, newData)
Luego, obtuve los comentarios del equipo de investigación sobre mi clasificación y descubrí que cometí un error al clasificar un fraude como No Fraude (es decir, Un Falso Negativo ) . ¿Hay alguna forma de que pueda dejar que mi algoritmo entienda que ha cometido un error? es decir, ¿alguna forma de agregar un ciclo de retroalimentación al algoritmo para que pueda corregir los errores?
Una opción que puedo pensar desde la parte superior de mi cabeza es construir una adaboost classifier
para que el nuevo clasificador corrija el error del anterior. o he escuchado algo de Incremental Learning
o Online learning
. ¿Hay implementaciones (paquetes) existentes en R
?
¿Es el enfoque correcto? o ¿Hay alguna otra forma de modificar el modelo en lugar de construirlo desde cero?
fuente
Respuestas:
Una estrategia de impulso puede mejorar el rendimiento de su modelo, por lo que vale la pena intentarlo. Con respecto al aprendizaje incremental / en línea, no conozco ningún paquete en R que lo implemente (otros, corríjalos si estoy equivocado). En Scikit Learn, hay clasificadores fuera de núcleo que permiten un aprendizaje incremental. Sin embargo, si está vinculado al uso de R, es posible que no tenga más remedio que escribir su propio modelo incremental. En cualquier caso, mirar los clasificadores fuera de núcleo de Scikit Learn puede darle una idea de por dónde empezar.
Otro detalle a tener en cuenta es el grado en que la actualización del modelo en un solo falso positivo o falso negativo mejorará el rendimiento del modelo. En el dominio del fraude, generalmente hay miles o millones de veces más casos de no fraude que fraude. Como tal, es importante tratar de aprender a discriminar cada instancia de fraude correctamente, pero la actualización de un modelo en una sola instancia de fraude probablemente no cambie el modelo de manera significativa. Considere otras estrategias para lograr que el modelo atribuya más importancia a las instancias de fraude.
La forma más directa de mejorar su modelo supervisado, en base a los comentarios de los investigadores humanos, sería construir un modelo separado de las instancias corregidas (es decir, las instancias predichas incorrectamente que se etiquetaron correctamente). A continuación, podría hacer que sus dos modelos "voten" sobre la clasificación de futuras instancias agregando sus membresías de clase previstas. Por ejemplo, el Modelo A puede creer que la Instancia1 es [Fraude: 0.65, Sin fraude: 0.35], mientras que el Modelo B cree que la Instancia1 es [Fraude: 0.47, Sin fraude: 0.53]. Por lo tanto, la predicción del conjunto sería [Fraude: (0.65 + 0.47) /2=0.56, Sin fraude: (0.35 + 0.53) /2=0.44].
Si su modelo original funciona mejor que el azar, el número de instancias que clasifica correctamente será mayor que el número clasificado incorrectamente. Por lo tanto, no desea atribuir igual peso a los modelos si están entrenados en un número desproporcionado de instancias. Hay dos opciones sencillas para manejar esta disparidad: 1) espere hasta que acumule suficientes instancias corregidas para igualar aproximadamente el número en el que se entrenó el modelo original, o 2) asigne peso a cada modelo según el rendimiento del modelo en un conjunto de validación.
fuente
Investigué en el pasado sobre el aprendizaje en línea e incremental. Hay algunas ideas que debe tener en cuenta.
Cada clasificador puede 'hacer' un aprendizaje incremental, el único problema es que con algunos es mucho más difícil hacerlo. No existe un algoritmo de aprendizaje incremental como tal, solo una forma de lograr esta compra utilizando los algoritmos comunes. Normalmente, elegiría uno de ellos y adaptaría la forma en que lo entrena y alimenta los datos, ya sea por lotes o en línea.
Puede hacer esto de dos maneras: a) Vuelva a entrenar el modelo desde cero cada vez que llegue una nueva muestra (o conjunto de muestras). Obviamente, esto no es ideal, pero si su modelo no es demasiado complejo (lo que significa que puede realizar una capacitación completa entre las próximas instancias) y limita el tamaño de su conjunto de datos (descartando datos antiguos, nuevos o aleatorios y manteniendo un número constante de instancias de capacitación ), puede funcionar en algunos escenarios. Aquí puede encontrar un buen ejemplo de este aprendizaje 'pseudo-incremental' con máquinas de vectores de soporte .
b) Encuentre una manera de actualizar los parámetros / pesos de su modelo modificando solo 'un poco' estos parámetros cuando la predicción fue incorrecta. Las redes neuronales son geniales para esto, ya que puedes entrenar a un modelo, guardar los pesos y luego volver a entrenar con nuevos lotes de datos a medida que vienen. Además, puede ajustar la tasa de aprendizaje para dar más / menos relevancia a sus nuevas entradas. Si puede elegir cualquier algoritmo para su caso, esta sería mi elección. Sin embargo, existen muchos otros métodos: por ejemplo, en los enfoques bayesianos, puede modificar las distribuciones aplicando incrementos / decrementos numéricos a ciertos parámetros (consulte esto para otro ejemplo).
Lee un poco y busca enfoques anteriores que coincidan con lo que quieras con tu algoritmo de aprendizaje. Puede parecer desalentador al principio configurar todo para usted en lugar de usar esta o aquella biblioteca, pero se vuelve genial cuando llega al punto en el que se siente a cargo de todo el proceso de aprendizaje de su modelo.
¡Buena suerte!
fuente