Você está na página 1de 20

RETO

PREDICTIVE
CAJAMAR
(AML)

FERNANDO APARICIO GALISTEO


ndice
Preprocesado
Anlisis de los datos
Aproximacin colaborativa incluyendo el tiempo
Recomendacin
Evaluacin

FERNANDO APARICIO GALISTEO


2
Preprocesado
Para cambiar el carcter separador | por , desde la
PowerShell:

Get-Content train.txt | Foreach-Object {$_.Replace('|', ', ')} | Set-


Content train.csv

Get-Content test.txt | Foreach-Object {$_.Replace('|', ',')} | Set-


Content test.csv
Para estudiar los datos podemos utilizar algn gestor de
bases de datos relacional, tal y como por ejemplo MySQL

FERNANDO APARICIO GALISTEO


3
Preprocesado
Tal cual tenemos los archivos csv ya se pueden agregar
AML, aunque estos no sern nuestros datos de trabajo
definitivos.
Si agregamos los dos dataset (train y test):
Para generar un dataset de entrenamiento y de prueba con
los usuario, item y rating, podemos utilizar una consulta sql
del tipo:
select ID_Customer as iduser,Cod_Prod as iditem, '1' as rating
from t1;
Esto nos generar una tabla con iduser, iditem, y un valor 1
para todos los registros.

FERNANDO APARICIO GALISTEO


4
Preprocesado
Problemas:
El algoritmo de recomendacin necesita valores diferentes
para los ratings
Posibles soluciones:
Generar unos ratings de 0 para aquellos productos que no
han sido contratados (ESTO GENERA UN CONJUNTO DE MS
DE 47M DE REGISTROS La versin free de AML no nos
permite procesarlo).
Ponderar de alguna manera los ratings

FERNANDO APARICIO GALISTEO


5
Anlisis de los datos
Debido a la lentitud con la que AML procesa las consultas
SQL, utilizaremos MySQL.
A tener en cuenta:
Trataremos las tablas como si de una base de datos no
relacional se tratase (no usaremos relaciones).
Cuando desde el cliente utilizado se sobrepasa un cierto
lmite de tiempo, no nos muestra los resultados aunque el
gestor de BBDD sigue haciendo los clculos. Para
solucionarlo, los resultados los almacenamos en fichero o los
insertamos en nuevas tablas.

FERNANDO APARICIO GALISTEO


6
Anlisis de los datos
Carga de datos a MySQL:

LOAD DATA INFILE 'D:/temp/train.csv'


INTO TABLE train
FIELDS TERMINATED BY ','
LINES terminated BY '\n'
IGNORE 1 ROWS -- ignora las cabeceras
(ID_Customer,Cod_Prod,Cod_Fecha,Socio_Demo_01,
Socio_Demo_02,Socio_Demo_03,Socio_Demo_04,So
cio_Demo_05);

FERNANDO APARICIO GALISTEO


7
Anlisis de los datos
Despus de cargar los datos de train y test podemos
hacer un poco de analtica:
Comprobar si hay clientes repetidos
El concepto de cliente (es suficiente el id de usuario?)
Nmero de clientes y nmero de tems
Cuntos registros nos saldran si consideramos todas las
combinaciones de clientes y productos (producto cartesiano)

FERNANDO APARICIO GALISTEO


8
Anlisis de los datos
Si el concepto de cliente lo determinamos por los
atributos U={A1,,An} y el de producto por B, para
calcular los usuarios que no estn en Train (y por tanto
pondramos un rating de 0) haramos:
(U x B) (Proyeccin(U,B) de Train)

FERNANDO APARICIO GALISTEO


9
Aproximacin
colaborativa incluyendo
el tiempo
Dado que el resultado resulta una matriz de en torno a
47M, podramos pensar en una mtrica que tuviese en
cuenta el tiempo para ponderar los ratings entre 1 y 5 por
ejemplo:
Si dividimos el tiempo en 5 partes:
incremento=(tf-t0)/5
El rating podra consistir en:
rating=5-parteEntera((tf-t)/incremento)

FERNANDO APARICIO GALISTEO


10
Aproximacin
colaborativa incluyendo
el tiempo
Argumentos para usar el tiempo en la mtrica de los
ratings:
Usuarios que contratan los productos en los mismos periodos
deberan parecerse.
Los usuarios con patrones similares desplazados en el tiempo
tambin tendrn una cierta similitud (menor cuanto mayor
desplazamiento haya). Para reforzar esto habra que pensar
en alguna caracterstica de frecuencia (por ejemplo).
Los usuarios que sigan el mismo patrn pero en tiempos
diferentes diferirn, aunque no completamente.

FERNANDO APARICIO GALISTEO


11
Recomendacin
Una vez disponemos de una tabla de ratings ponderados
podemos preparar nuestro experimento:
Salvamos los datos a fichero
SELECT * FROM rating1_ponderado
INTO OUTFILE 'D:/tmp/rating_ponderado.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
Cargamos el dataset en el AML (teniendo en cuenta que van
sin cabecera)

FERNANDO APARICIO GALISTEO


12
Recomendacin
Montamos la primera parte del experimento

FERNANDO APARICIO GALISTEO


13
Recomendacin
Dado que el dataset lo hemos cargado sin cabeceras, AML
ver los nombres de las columnas como la secuencia
col1,col2, Para cambiar esto editamos los metadatos e
incluimos los nombres:
ID_Customer,Cod_Prod,Cod_Fecha,Socio_Demo_01,Socio_Dem
o_02,Socio_Demo_03,Socio_Demo_04,Socio_Demo_05,rating
Extraemos el identificador de usuario, con el cdigo de
producto y el rating:
select (ID_Customer||'-'||Socio_Demo_01||'-'||Socio_Demo_02||
'-'||Socio_Demo_03||'-'||Socio_Demo_04||'-'||Socio_Demo_05)
as iduser,
Cod_Prod, rating from t1;

FERNANDO APARICIO GALISTEO


14
Recomendacin
Eliminamos duplicados (mismo iduser y mismas caractersticas
sociodemogrficas): para quedarnos con el ltimo registro
DESMARCAMOS la opcin retain first duplicate row
Por otro lado extraemos las caractersticas de usuario para cada usuario:
select (ID_Customer||'-'||Socio_Demo_01||'-'||Socio_Demo_02||
'-'||Socio_Demo_03||'-'||Socio_Demo_04||'-'||Socio_Demo_05)
as iduser,
Socio_Demo_01, Socio_Demo_02, Socio_Demo_03,
Socio_Demo_04, Socio_Demo_05 from t1
group by
ID_Customer,Socio_Demo_01,Socio_Demo_02,Socio_Demo_03
,Socio_Demo_04,Socio_Demo_05;

FERNANDO APARICIO GALISTEO


15
Recomendacin
Por ltimo incorporamos los elementos esenciales y tambin
y exportador a csv para poder cargar y valorar los resultados
en nuestra bd local:

FERNANDO APARICIO GALISTEO


16
Recomendacin
Si usamos
nicamente
los datos de
entrenamiento
, entonces
debemos
incluir el Split
recommender.
De lo contrario
podemos
hacer uso de
los datos de
test para la
evaluacin.

FERNANDO APARICIO GALISTEO


17
Recomendacin

FERNANDO APARICIO GALISTEO


18
Evaluacin
Para evaluar nuestra aproximacin, basta con utilizar la
mtrica incluida en el AML o, de otro modo, guardarnos los
resultados en local y analizarlos por nosotros mismos:
Guardamos el archivo Excel resultante y lo incorporamos en
la base de datos:
LOAD DATA INFILE 'D:/tmp/results.csv
INTO TABLE result
FIELDS TERMINATED BY ','
LINES terminated BY '\n'
IGNORE 1 ROWS
(iduser,Cod_Prod);

FERNANDO APARICIO GALISTEO


19
Evaluacin
Podramos calcular la exactitud teniendo en cuenta los posibles
cambios de tipos (de cadenas a nmeros y viceversa, en todo el
proceso de importacin y exportacin). Por ejemplo:
SELECT count(*)/(SELECT count(*) from result)
accuracy
FROM result
WHERE iduser in (select iduser from result,test where
concat(ID_Customer,'-',Socio_Demo_01,'-',Socio_Dem
o_02,'-',Socio_Demo_03,'-',Socio_Demo_04,'-',CAST(S
ocio_Demo_05 AS UNSIGNED))=result.iduser
AND
CAST(test.Cod_Prod AS
UNSIGNED)=CAST(result.Cod_Prod AS UNSIGNED));

FERNANDO APARICIO GALISTEO


20