Está en la página 1de 19

Entrenamiento de una red neuronal

Presentado por:
Andrés Felipe Brieva 
Héctor Bustamante Ortega
Jonier Jiménez Rodríguez
José David Cantillo

Grupo 3

Docente
Idanis Beatriz Diaz Bolaño

Santa Marta 
(Magdalena, Colombia) 
2021 -1 
Contenido

1. Problema a resolver 3
Número de usuarios ¡Error! Marcador no definido.
Histograma de las variables medibles 5
Matriz de correlación (mapa de calor) 6
Boxplot 7
2. Tratar los datos 8
Outliers o valores atípicos 8
Columna Special day 9
Convertir Dtypes (de numérico a tipo categórico) 9
Convertir etiquetas de texto a números categóricos 10
Construcción del modelo de predicción 10
3. Uso de gridsearchCV para pruebas múltiples de combinaciones con las
configuraciones para nuestra red neuronal multicapa. 11
4. Análisis del resultado con la matriz de confusión 15
Análisis del resultado 15
Matriz de confusión 15
5. Conclusiones 16
¿Cómo podemos en un futuro mejorar los resultados? 17
1. Problema a resolver

El problema por solucionar es: “Saber la intención de los clientes al comprar (si generará
dinero), cuando visitan una página web de un producto”, en la dataset nos vamos a
encontrar estas columnas:

● Revenue: esta va a ser nuestra clase categórica donde dice si el usuario genera
ingresos o no.
● Administrative, Administrative Duration, Informational, Informational
Duration, Product Related y Product Related Duration: representan el número de
diferentes tipos de páginas visitadas por el visitante en esa sesión y el tiempo total
invertido en cada una de estas categorías de página.
● Bounce Rate: porcentaje de visitantes que ingresan al sitio desde esa página y luego
se van ("rebotan") sin activar ninguna otra solicitud al servidor de análisis durante esa
sesión.
● Exit Rate: el porcentaje que fueron los últimos en la sesión.
● Page Value: representa el valor promedio de una página web que un usuario visitó
antes de completar una transacción de comercio electrónico.
● Special Day: indica la proximidad del tiempo de visita del sitio a un día especial
específico (por ejemplo, Día de la Madre, Día de San Valentín) en el que es más
probable que las sesiones finalizan con la transacción.
● Operating system, browser, región, traffic type: diferentes tipos de sistemas
operativos, navegador, región y tipo de tráfico utilizado para visitar el sitio web.
● Visitor type: si el cliente es un visitante nuevo o que regresa.
● Weekend: un valor booleano que indica si la fecha de la visita es el fin de semana.
● Month: mes del año.

Columnas, tipo de datos y número de datos del dataset:


12330 filas y columns: 2 bool, 7 float, 7 int y 2 object

Número de usuarios

Con un total de 12,330 datos en los cuales: 10,422 que no generan ingreso y 1,908 generan
ingreso, los cuales vamos a clasificar en un futuro para entrenar y probar nuestra red
neuronal, donde el 84,68% están en True (generan ingresos) y 15,47% están en False (no
genera ingreso).
Histograma de las variables medibles

El histograma es una gráfica que representa cómo se distribuyen los datos en forma de barra
donde “X” son los datos y “Y” es la frecuencia de estos, algunas de estas gráficas tienen
espacios entre datos dichas graficas son: Region, TrafficType, OperatingSystems, Browser
y SpecialDay que son datos numéricos, pero representan a categorías y no son datos
continuos. Podemos ver que algunas de ellas se genera una forma que se parece a una
distribución normal que es capaz de aproximarse al valor de una variable aleatoria como en
este caso, aunque no esté completo porque eso sería en una situación ideal, por ejemplo, la
variable “Exitrates” que muestra la forma de una media campana.
Matriz de correlación (mapa de calor)

La matriz de correlación que en nuestro caso es el mapa de calor, muestra con colores las
ciertas relaciones que tienen una columna con otras columnas, donde el color más fuerte que
es el rojo oscuro es que están 100% relacionadas de manera uniforme si una sube la otra sube,
si una baja la otra baja, el color azul claro es que están menos correlacionados, y el azul
fuerte es una correlación inversa, si una sube otra baja, si baja la otra sube. En nuestro mapa
de calor podemos ver algunas que están fuertemente correlacionadas que son:

● Administrative con Adminsitrative_Duration


● Informational con Informational_Duration
● ProductRelated con ProductRelated_Duration
● BounceRates con ExitRates

Con toda esta información de cuanto se relacionan unas con otras podemos decidir en un
futuro si quitaremos algunas columnas porque nos proporciona la misma información, de
tener una columna o la otra. También podemos ver la influencia de otras variables a nuestra
variable de clasificación como pueden ver Revenue con PageValues que tienen una alta
relación.
Boxplot

Acá podemos observar que hay muchos valores atípicos (outliers)

En nuestras gráficas de boxplot podemos encontrar muchos valores donde la mediana es


representada por la línea naranja, y los valores que están apartados arribas son los valores
atípicos, en nuestra gráfica no pudimos representar bien, porque algunos de esos valores son
muy altos o pequeños, entonces tiene problema para sacar el cuartil y la mediana, más
adelante veremos cómo mejorar esto, quitando algunos outliers.
2. Tratar los datos

Outliers o valores atípicos


Uno de los problemas en nuestra dataset es que tenemos muchos valores atípicos, valores que
en el rango no vamos a necesitar para entrenar nuestra red neuronal como, por ejemplo: una
persona que abrió la página web y la cierra enseguida, como podemos observar en la gráfica
de los boxplot hay muchos valores atípicos, una de las técnicas que vamos a utilizar es el IQR
(interquartile range o Rango intercuartílico) que es un método que nos ayudará filtrar los
outliers.

Datos sin tratar

Datos tratados
Columna Special day

Uno de los problemas del dataset es esta columna, porque la descripción de esta columna es
numérica pero no es necesaria porque la descripción es:

● Si es mayor que 0.4, es '1', lo que indica que es un 'Día especial'.


● Si es menor o igual a 0.4, es 0, lo que indica 'No es un día especial'.

Así son los valores que representan a un día especial:

Así colocamos si es día especial o no (1 o 0):

Lo convertimos a una booleana (True or False):


Convertir Dtypes (de numérico a tipo categórico)
En los datos hay algunos que son de tipo categórico, pero están como numéricos para que la
red neuronal lo identifique como categórico hay que cambiar los datos a “category”.

Convertir etiquetas de texto a números categóricos

La columna “Month” cómo “visitor_type”, tienen texto cómo “feb”, “nov” o como
“Returning_Visitor”, este es un problema y hay que convertirlo a número categórico.
Donde convertimos los meses a número y el tipo de dato a número.
Construcción del modelo de predicción

Para construir el modelo de predicción hay que primero, separar nuestra columna de etiqueta
de clasificación y segundo hacer un split para separar los datos de entrenamiento y prueba (un
80% para entrenamiento y 20% para prueba).

X = label_data.drop(['Revenue'],axis=1)
y = label_data.Revenue

X_train, X_test, y_train, y_test = train_test_split(X, y,train_size=0.8)

3. Uso de gridsearchCV para pruebas múltiples de combinaciones con las


configuraciones para nuestra red neuronal multicapa.

En nuestro primer uso de gridsearchCV usamos varias configuraciones para elegir cual es la
mejor función de activación:

# creación del modelo


param_grid = [
{
'activation' : ['logistic', 'identity', 'tanh', 'relu'],
'solver' : ['lbfgs'],
'alpha' : [0.01],
'hidden_layer_sizes': [
(3, 2)
]
}
]

probamos con todas las funciones de activación para ver cuál es la mejor función de
activación para nuestro problema, dando como la mejor combinación ‘logistic’:

Ahora intentemos buscar nuestro mejor solver:

param_grid = [
{
'activation' : ['logistic'],
'solver' : ['lbfgs', 'sgd', 'adam'],
'alpha' : [0.01],
'hidden_layer_sizes': [
(3, 2)
]
}
]

Nos dio como resultado en buscar el mejor solver, ‘adam’:

Ahora probemos buscar el mejor número para nuestro alpha:

param_grid = [
{
'activation' : ['logistic'],
'solver' : ['adam'],
'alpha' : [0.01, 0.001, 0.1, 0.0001],
'hidden_layer_sizes': [
(3, 2)
]
}
]

Dando como resultado ‘0.01’:

Ahora se viene de último, pero no menos importante de los demás de hecho es lo más
importante que son nuestras capas escondidas de nuestra red neuronal perceptrón
multicapa:

param_grid = [
{
'activation' : ['logistic'],
'solver' : ['adam'],
'alpha' : [0.01],
'hidden_layer_sizes': [
(3, 2),
(4, 3, 2),
(7, 2),
(6, 4, 3, 2)
]
}
]

En las capas escondidas probamos con estas 4 combinaciones, 2 capas escondidas, con 3
neuronas en la primera capa y 2 en la segunda capa. en la segunda combinación con 3 capas
escondidas con 4 neuronas en la primera capa, 3 en la segunda capa y 2 en la tercera capa, y
por último intentamos con más neuronas, con dos capas: en la primera capa 7 neuronas y en
la segunda capa 2 neuronas.

En nuestro resultado nos dio (7, 2), dando a entender que son dos capas, con 7 neuronas en la
primera capa y en la segunda capa 2 neuronas.

Usamos como modelo MLPClassifier con 3000 máximas de iteraciones.

Ahora con estas últimas configuraciones tratemos de entrenar y probarlo para ver cuánto nos
puede dar en el porcentaje de precisión.

model = MLPClassifier(activation = 'logistic', solver = 'adam', alpha = 0.01, max_iter = 3000,


hidden_layer_sizes=(7, 2))

Corriendo con estas configuraciones nos dio: 0.897.

Aunque estás configuraciones es casi el 90% intentamos con otras configuraciones si


podemos subirlo:

Tratamos de probar con más capas o diferentes capas que están cerca a nuestro resultado
anterior que es (7, 2):

param_grid = [
{
'activation' : ['logistic'],
'solver' : ['adam'],
'alpha' : [0.01],
'hidden_layer_sizes': [
(8, 5),
(7, 4),
(6, 3)
]
}
]

y nos dio como mejor resultado: (7, 4).


Entonces probamos con más capas que están cerca del 7:

param_grid = [
{
'activation' : ['logistic'],
'solver' : ['adam'],
'alpha' : [0.01],
'hidden_layer_sizes': [
(7, 2),
(7, 3),
(7, 4),
(7, 7)
]
}
y nos volvió a dar (7, 4):

Ahora probamos cuanto es la probabilidad que nos da:

model = MLPClassifier(activation = 'logistic', solver = 'adam', alpha = 0.01, max_iter = 5000,


hidden_layer_sizes=(7, 4))

y nos dio: 0.899 ( 89.9% ).


4. Análisis del resultado con la matriz de confusión

Análisis del resultado


La probabilidad que nos dio al final es de un 89,9% esto indica que es la probabilidad global
de nuestra red neuronal multicapa acertar si genera ingresos o no. al final usamos una
configuración con la función de activación logística (f(x) = 1 / (1 + exp(-x))) esta función es
suave y permite propagar los resultados de una capa a otra capa, otra configuración que
usamos es el solver llamado “adam”, es una función de optimización para los pesos de las
conexiones de nuestra red neuronal, y al final usamos dos capas ocultas, la primera capa con
7 neuronas y la segunda capa con 4 neuronas.

Matriz de confusión

Esta matriz de confusión se usa para ver el desempeño de nuestra red neuronal al etiquetar
“Revenue”, que nos genera ingresos o no de los clientes al entrar en las páginas web. en la
columna y fila que se junta “positivo” con “positivo” que son 164 clientes, esto significa
que la predicción versus el valor real acertó en que genera ingresos en 164 clientes. En
positivo versus negativo son 74, es que falló en esos 74 en donde la etiqueta es “genera
ingreso”, ahora negativo versus positivo son 115 acá este lugar es donde falló en predecir la
red neuronal pensó que se etiqueta “no genera ingreso” pero realmente es que esos 115
generan ingreso, en negativo versus negativo son 1399, es que “no genera ingresos” y la red
neuronal predijo efectivamente que “no genera ingreso”.

En todo esto que hemos usado nuestro resultado, ¿Cuál de estos números son los que hizo
bien?, bueno en nuestra red neuronal donde pensó que es positivo y realmente era positivo, y
en donde la red neuronal pensó que era negativa y efectivamente es negativo que son 164 y
1399 respectivamente, en un total de 1,752 que nuestra red neuronal acertó de unos 1,536 que
hay en total en los datos de prueba. Unos de los problemas que podemos ver en esta tabla es
en las columnas de nuestra predicción de positivo y negativo, de 164 vs 74 y 115 vs 1399,
podemos ver que es más difícil de predecir cuándo gasta dinero en los números
relativamente. Si calculamos las probabilidades son:

● Hay un 92% de acertar cuando no va a generar ingreso.


● Hay un 68,9% de acertar cuando va a generar ingreso.
Con esto podemos concluir que es más fácil acertar cuando alguien no va a generar ingreso.

5. Conclusiones

Data sin tratar

Data tratada

Con esta gráfica podemos concluir que esta dataset tiene muchos outliers, porque este tipo de
datos como de navegar en sitios web en donde se toma información de personas, no siguen un
“patrón” tan claro y existen muchos datos que están fuera del patrón y son muy exagerados
o pobres, como un cliente que abre y cierra la página web o deja el computador con esa
página web abierta, entonces esto hace que los datos adquiridos son muy bajos o altos. En un
futuro mejorar nuestro dataset en la calidad de los datos porque existe una baja calidad en
estos así mejorar nuestra dataset y así sería más sencillo predecir usando nuestro modelo.
En nuestra dataset son 12,330 datos en total, donde 1,980 son clientes que generan ingresos y
10,422 no generan ingresos. unos de los problemas del dataset como pudimos ver es la
diferencia de examples de que no generan ingresos que son demasiados en comparación a los
que generan ingresos y es incluso menos cuando tratamos nuestros datos, tal vez por esto es
más fácil predecir cuando alguien no genera ingreso por que tiene más examples.

¿Cómo podemos en un futuro mejorar los resultados?

Una opción seria mejorar nuestra dataset tomando más datos de ejemplo: cuando un cliente
genera ingresos dado que en nuestra dataset representan el 16% (1,980) son muy pocos en
comparación del 84% (10,442) que no generan ingreso y así subir el porcentaje de acierto de
nuestra red neuronal.
También podemos usar otro modelo, aunque las redes neuronales multi perceptrón son muy
útiles, además de que usamos la más básica estructura en la red neuronal, hay otros modelos
que pueden dar muy buenos resultados, modelos como: clasificador Naive Bayes para
modelos de Bernoulli multivariable (BernoulliNB), Clasificación de vectores de soporte C
(SVC), Bosque aleatorio (RandomForestClassifier), etc. Como podemos ver existen varios
modelos multivariables son buenos a la hora de clasificar nuestra data, en la siguiente imagen
podemos ver un ejemplo de la web oficial de las diferencias de clasificadores:
Imagen sacada de Classifier comparison

No solo existen estas si no que hay muchos y cada uno de estos clasificadores son usados
para distintos tipos de problemas.

También podría gustarte