Estructura de datos que representa un conjunto y tiene:
Catch: Hay una probabilidad pequeña de que la query de un falso positivo.
Estructura de datos para conteo de frecuencia que tiene:
Similar a bloom filter, pero con conteo. Muy util para estimar probabilidades en streams de cosas.
Link a Wikipedia.
Es un esquema similar al de bloom filters, pero en vez de tener un array de bits tiene un array de enteros que se incrementa con cada inserción. A la hora de hacer una query se computa el valor mínimo de las partes del array seleccionadas por la función de hash.Bag of words
La casa verde --> 00010001100 El auto verde --> 01000000101 El auto de la casa --> 01010101001
Tradicionalmente esto requiere un diccionario de label a indices.
Un hashing vectorizer reemplaza este diccionario con un hash que va de label a indices.
Pros: Memoria constante, no requiere entrenamiento.
Cons: Puede haber colisiones
Hay riesgo de colision pero el vectorizador no necesita entrenarse ni consume memoria. Es stateless.Problema: Encontrar pares de objetos similares en una bolsa grande.
Caso real: Usuarios de telefono celular duplicados.
Como ejemplo voy a comentar una sola técnica para esto: Random projection, pero hay todo una rama de estudio sobre este tema que se llama Locality sensitive hashing.
Conoci alguien al que le paso esto: Una empresa de telefonia quiere saber cuales números de telefonos celulares son "duplicados", ie: Son usados por la misma persona. La dificultad: Hay 60 millones de números de celular entregados, todos contra todos no va ni a gancho. Tambien se puede pensar como una forma de reducción de dimensionalidad donde los features son binarios.Meta: Tomar una muestra aleatoria de un stream de datos que no entra en memoria y cuya longitud es desconocida.
Existe un algoritmo para esto que se llama Reservoir sampling
Llenar un reservorio de K elementos y por cada elemento nuevo usar un número aleatorio para decidir si entra (reemplazando a otro) dentro del resevorio. En todo momento el reservorio tiene la muestra aleatoria. Se puede analizar como una recursion. Si se implementa correctamente el output es una muestra aleatoria barajada aleatoriamente.Problema: Tengo 1 feature rico (1 columna) y 1 feature ralo (100000 columnas) ¿Como los uso juntos?
Caso de estudio: Supermercado. Predecir si un cliente va a comprar un producto.
Approach: Usar reducción de dimensionalidad en el feature ralo y concatenarlo con el feature rico.
SVD y PCA son métodos de reducción de dimensionalidad no supervisados.
- Feature rico: Cuantas veces el cliente compró el producto antes. - Feature ralo: Palabras en el título/descripción del producto.Mismo problema, mismo approach, distinta reducción de dimensionalidad.
Entrenar un clasificador usando solo el feature ralo y concatenar su función de decision con el feature rico.
A esta técnica le dicen Stacking.
En vez de usar un algoritmos no supervisado usar la función de decisión de un clasificador como una método supervisado de reducción de dimensionalidad. En mi experiencia personal esto da muy buenos resultados.a
Cuando hay muchas clases vale la pena probar:
En vez de entrenar un clasificador \[ f(features) \rightarrow category \]
Entrenar un clasificador \[ f(features, category) \rightarrow \{ 0 , 1 \} \]
a
Pros: Entrenamiento crece, features compactos
Cons: Computacionalmente caro, requiere cuidado
En mi experiencia siempre requirio mucho cuidado llevar el problema a esta forma y existe un riesgo de que no de mejor performance que con el esquema vainilla.