KNN con SAS. Mejorando K-Means

29 Abr
Imagen de previsualización de YouTube

La clasificación por k vecinos más cercanos es EL MÉTODO supervisado no paramétrico. El KNN, si empleamos las siglas en inglés, clasifica las observaciones en función de su probabilidad de pertenecer a uno u otro grupo, en el video que encabeza la entrada queda muy bien explicado. El caso es que tenemos la posibilidad de realizar esta clasificación con SAS STAT y el PROC DISCRIM y me parece interesante dedicarle unas líneas. Hace años ya hablamos de segmentación con SAS  y vamos a emplear los mismos datos para ilustrar esta entrada. Primero generamos un conjunto de datos con datos simulados de 3 esferas que clasificamos en 3 grupos:

data pelota;
do i = 1 to 1000;
a=0; b=5; x = a+(b-a)*ranuni(34);
a=0; b=5; y = a+(b-a)*ranuni(14);
grupo=1;
distancia = sqrt(((x-2.5)**2)+((y-2.5)**2));
if distancia < 2.5 then output;
end;
run;

data pelota1;
set pelota;
grupo=1;
run;

data pelota2;
set pelota;
x = x+4.5;
grupo=2;
run;

data pelota3;
set pelota;
x = x+2.5;
y = y+3.5;
grupo=3;
run;

data datos;
set pelota1 pelota2 pelota3;
run;

proc gplot data=datos;
	plot y * x = grupo; 
run;quit;

KNN_SAS1

Si realizamos un análisis mediante k-means sin asignar centroides obtenemos esta clasificación:

proc fastclus data=datos maxclusters=3 out=datos2;
var x y;
quit;

proc gplot data=datos2;
	plot y * x = cluster; 
run;quit;

KNN_SAS2

Ya vimos que había algunos problemas por la asignación aleatoria de centroides. Este problema lo podemos solventar empleando clasificación por KNN a partir del PROC DISCRIM:

data entreno testeo;
set datos;
if ranuni(7)>=0.5 then output entreno;
else output testeo;
run;

proc discrim data = entreno test = testeo 
	testout = puntuacion method = npar k = 5
	Crossvalidate;
class grupo;
var x y;
run; 

proc gplot data=puntuacion;
	plot y * x = _into_; 
run;quit;

KNN_SAS3

El resultado es muy satisfactorio como se puede ver en la figura y la sintaxis del PROC DISCRIM tampoco es muy compleja, necesitamos conjunto de datos de test y validación y generamos un dataset de salida que denominamos puntuación en method especificamos que la clasificación la llevamos a cabo con un método no paramétrico y en ese momento necesitamos especificar la k que es el número de vecinos que vamos a evaluar para clasificar cada observación y evaluamos como funciona nuestra clasificación mediante validación cruzada. El resultado de esta clasificación no paramétrica lo podemos ver en el gráfico, el resultado muy satisfactorio. Es necesario tratar con más cariño el número de vecinos (k) pero esta tarea la dejo pendiente para otro momento porque sería interesante automatizarla. El caso es que bajo mi punto de vista sigo prefiriendo el uso de k medias pero knn puede ayudarnos a seleccionar las semillas iniciales para nuestra clasificación por k medias:

proc summary data=puntuacion nway;
class grupo;
output out=medias (keep= x y) mean(x)= mean(y)=;
quit;

proc fastclus data=datos maxclusters=3 out=datos3 seed=medias;
var x y;
quit;

proc gplot data=datos3;
	plot y * x = cluster; 
run;quit;

KNN_SAS4

Este análisis si arroja resultados muy interesantes. Saludos.