Bien como el nombre de esta entrada indica, hablaré de l
algoritmo de discretización CAIM[1]. Antes de continuar, abordemos la definición
de discretización desde el punto de vista de la minería de datos:
Discretización: Es el proceso mediante el cual los valores
se incluyen en depósitos para que haya un número limitado de estados posibles.
Los depósitos se tratan como si fueran valores ordenados y discretos [2].
En pocas palabras es crear rangos, por ejemplo, veamos una parte de la famosa tabla iris [3]:
Como podemos observar, tenemos aquí una tabla con atributos
continuos, esto es común es cualquier tabla. Bueno ahora supongamos que
deseamos crear rangos para uno de sus atributos, digamos “sepalwidth”, tenemos aquí
varias soluciones posibles:
- Utilizar el conocimiento inherente de los datos y elegir manualmente los rangos.
- Crear algún modelo en el cual se cree ‘x’ cantidad de rangos y cada rango contenga en promedio la misma cantidad de valores, esto es, por ejemplo, tener rangos con la misma diferencia 2-4, 4-6, 6-8 etc.
- Parecido al anterior pero en vez de que los rangos tengan las mismas distancias ahora se intentará que cada uno contenga la misma cantidad de elementos, es decir, si tenemos una base con 1500 registros, podríamos crear tres rangos y que cada uno contuviera 500 registros.
- Utilizar algún algoritmo de discretización que se encargue de la creación de los rangos en base a heurísticas que intenten agrupar los datos con la mayor ganancia de información.
Como se puede observar, si se tiene suficiente conocimiento
de la información, pues no hablar más, el primer punto es el más indicado,
pero de no ser así, bueno cada quien sus
gustos, yo me decantaré por explicar el último punto, el de crear un algoritmo
que me entrega rangos que maximicen mi ganancia de información (se escucha
bonito pero se refiere a que pueda explicar mejor mis datos).
Existen varios métodos creados con este fin, por citar
algunos:
- · Maximum entropy
- · IEM
- · CADD
- · CAIR
- · CAIM
- · FCAIM
- · Shanon
- · Paterson-Niblett
- · Equal Width
- · Equal Frequency
Básicamente estos algoritmos se dividen en dos tipos,
basados en clase y no basados en clase. Los primeros requieren de una clase que
identifique a sus datos (en la tabla mostrada anterior tenemos un atributo
llamado “class” que se encarga de realizar esto), estos algoritmos son un poco más
“fiables”, debido a que se cuenta con mayor información para poder tomar
decisiones al momento de crear los rangos, usualmente sus algoritmos son muy
parecidos pero cambia la fórmula que nos brinda la ganancia de información. Los
no basados en clase son algoritmos en general más rápidos, aquí no se tiene
algo que identifique a los datos, entonces no existe mucho de donde buscarle,
simplemente ordenan la información y la distribuyen de manera equitativa en un
número x de valores discretos.
En esta entrada nos centraremos en el algoritmo CAIM[1] por
sus siglas en inglés (class attribute interdependence maximization).
Este algoritmo posee las siguientes ventajas:
- Intenta reducir el número de intervalos a ser creados, el algoritmo determina cuantos rangos serán creados y no necesita supervisión alguna por parte de una persona.
- Es rápido o al menos no tiene un alto coste computacional.
- Maximiza la interdependencia entre los intervalos creados y las clases.
- Minimiza la información perdida en el proceso de discretización.
Sin entrar más en terminologías veamos el algoritmo:
Entrada: un conjunto de datos, clases y atributos
continuos, M, S, F respectivamente.
Para cada Fi realizar
Paso uno:
- 1.1 Encontrar en valor mínimo (d0) y el valor máximo (dn)
- 1.2 Formar un conjunto de todos los valores distintos de Fi, colocados en orden ascendente, crear una variable B que contendrá la siguiente información: d0, todos los valores intermedios sin repetir, dn. (Por valores intermedios se refiere a sumar los atributos y dividirlos entre dos, es decir, si tenemos como datos 4,5 entonces un punto intermedio seria 4.5)
- 1.3 Crear una variable D que contendrá el esquema de discretización, e inicializarla con D[0] = d0 y D[1] = dn. Establecer la variable GlobalCaim = 0;
Paso dos:
- 2.1 Inicializar una variable K = 1
- 2.2 Tentativamente agregar algunos límites, de B que no se encuentren ya en D y calcular su correspondiente valor CAIM
- 2.3 Aceptar el límite que posea el valor mayor de CAIM
- 2.4 Si (CAIM > GlobalCAIM or K < S (Donde S es la cantidad de clases existentes)) entonces actualiza D con el limite aceptado en el paso 2.3 y establece GlobalCAIM = CAIM, sino terminar el proceso
- 2.5 establece K = K + 1
Salida: El vector D que indica los valores
discretizados
Como podemos observar no se trata de un algoritmo
complicado, aunque claro, debemos de calcular el valor CAIM. La fórmula es la
siguiente:
Para obtener las variables y calcular la fórmula debemos de hacer uso de una matriz llamada "quanta matrix":
En donde:
- C1,Ci ...Cs. :Son las clases (para el caso de la tabla iris serian: Iris-setosa, Iris-versicolor, Iris-virginica.
- [d0, d1]..[dn-1,dn] : Son los intervalos.
- q11.: Es la cantidad de atributos de la clase C1 es encontrado en el intervalo [d0,d1].
- Interval Total: es la suma de las columnas de la matriz.
- Class Total: Es la suma de las filas.
- M: representa al total de atributos proporcionados
- D[0] = 4.5
- D[1] = 6.8
- D[2] = 7.9
- 4.5-6.8
- 6.8-7.9
Pues bien una vez creada la "quanta matrix" ya podemos obtener los valores para calcular la función de CAIM:
- N: número de intervalos proporcionados por F
- Maxr : Este es el máximo valor de cada columna para cada intervalo (por supuesto sin incluir la suma, es decir , solo las variables q)
- M+r: Es la suma de un atributo en particular, es decir el resultado de cada columna en “Interval Total” de la “quanta matrix”
Bueno ahora si ya con esto solo queda ir probando valores posibles, calcular su “quanta matrix” para cada valor, elegir aquel valor que nos entregue el máximo de la fórmula de CAIM y terminar el proceso.
Y por supuesto, he creado un programita en javascript que nos realiza esta tarea, el mismo lo pueden descargar de:
Descargar CAIM.zip
El dataset debe de ser un archivo JSON configurado de la siguiente manera (el ejemplo esta dado para la base iris):
{tabla: [{ "sepallength": 5.1, "sepalwidth": 3.5, "petallength": 1.4, "petalwidth": 0.2, "clase": "Iris - setosa" },
{ "sepallength": 4.9, "sepalwidth": 3, "petallength": 1.4, "petalwidth": 0.2, "clase": "Iris - setosa" },
{ "sepallength": 4.7, "sepalwidth": 3.2, "petallength": 1.3, "petalwidth": 0.2, "clase": "Iris - setosa" },
{ "sepallength": 4.6, "sepalwidth": 3.1, "petallength": 1.5, "petalwidth": 0.2, "clase": "Iris - setosa" },
{ "sepallength": 7, "sepalwidth": 3.2, "petallength": 4.7, "petalwidth": 1.4, "clase": "Iris - versicolor" },
{ "sepallength": 6.4, "sepalwidth": 3.2, "petallength": 4.5, "petalwidth": 1.5, "clase": "Iris - versicolor" },
{ "sepallength": 6.9, "sepalwidth": 3.1, "petallength": 4.9, "petalwidth": 1.5, "clase": "Iris - versicolor" },
{ "sepallength": 5.5, "sepalwidth": 2.3, "petallength": 4, "petalwidth": 1.3, "clase": "Iris - versicolor" },
{ "sepallength": 6.3, "sepalwidth": 3.3, "petallength": 6, "petalwidth": 2.5, "clase": "Iris - virginica" },
{ "sepallength": 5.8, "sepalwidth": 2.7, "petallength": 5.1, "petalwidth": 1.9, "clase": "Iris - virginica" },
{ "sepallength": 7.1, "sepalwidth": 3, "petallength": 5.9, "petalwidth": 2.1, "clase": "Iris - virginica" }]};
Simplemente se debe mandar a llamar a la función:
var D = ObtenDatos(data, S, atributo_a_discretizar, numero_limites_inferiores_a_probar);
en donde:
- data: es la tabla en formato JSON explicada anteriormente.
- S: Es un vector con las clases(S[0] = "Iris - setosa",S[1] = "Iris - versicolor",S[2] = "Iris - versicolor").
- atributo_a_discretizar: Este es el nombre de la columna que se desea discretizar, ejemplo : "sepallength"
- numero_limites_inferiores_a_probar: Es el número de intentos a realizar en el paso 2.2 del algoritmo.
Espero les haya gustado la entrada. Cualquier duda pueden enviarme un correo a ferpitol@gmail.com
Referencias:
[3] http://archive.ics.uci.edu/ml/datasets/Iris
1 comentario:
Hola, lamentablemente el .zip no esta disponible, sería de gran ayuda si es que lo puedes volver a subir
Publicar un comentario