Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Predicción de clics de anuncios de clientes mediante aprendizaje automático

Introducción

El marketing en Internet se ha hecho cargo de las estrategias de marketing tradicionales en el pasado reciente. Las empresas prefieren anunciar sus productos en sitios web y plataformas de redes sociales. Sin embargo, apuntar a la audiencia correcta sigue siendo un desafío para el marketing en línea. Gastar millones para mostrar el anuncio a la audiencia que no es probable que compre sus productos puede ser costoso.
En este artículo, trabajaremos con los datos publicitarios de una agencia de marketing para desarrollar un algoritmo de aprendizaje automático que predice si un usuario en particular hará clic en un anuncio. Los datos constan de 10 variables: "Tiempo diario empleado en el sitio", "Edad", "Ingresos del área", "Uso diario de Internet", "Línea de tema de anuncios", "Ciudad", "Hombre", "País", Marca de tiempo " y 'Haga clic en el anuncio'.
La variable principal en la que estamos interesados ​​es "Hacer clic en un anuncio". Esta variable puede tener dos resultados posibles: 0 y 1 donde 0 se refiere al caso donde un usuario no hizo clic en el anuncio, mientras que 1 se refiere al escenario donde un usuario hace clic en el anuncio.
Veremos si podemos usar las otras 9 variables para predecir con precisión el valor de la variable 'Haga clic en el anuncio'. También realizaremos un análisis exploratorio de los datos para ver cómo el "Tiempo Diario Pasado en el Sitio" en combinación con la "Línea de Tema del Anuncio" afecta la decisión del usuario de hacer clic en el complemento.

Importando Bibliotecas

Para desarrollar nuestro modelo de predicción, necesitamos importar las bibliotecas de Python necesarias:
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
import seaborn as sns

%matplotlib inline

Importando el conjunto de datos

El conjunto de datos de este artículo se puede descargar desde este enlace de Kaggle . Descomprima el archivo zip descargado y coloque el archivo "advertising.csv" en su disco local. Este es el archivo que vamos a utilizar para entrenar nuestro modelo de aprendizaje automático.
Ahora necesitamos cargar los datos:
data = pd.read_csv('E:/Datasets/advertising.csv')  
Veamos las primeras diez líneas de nuestro DataFrame:
data.head(10)  
Basándonos en las primeras líneas de la tabla, podemos obtener una visión básica de los datos con los que estamos trabajando. Queremos verificar cuántos datos tenemos dentro de cada variable.
data.info()  
Salida:
<class 'pandas.core.frame.DataFrame'>  
RangeIndex: 1000 entries, 0 to 999  
Data columns (total 10 columns):  
Daily Time Spent on Site    1000 non-null float64  
Age                         1000 non-null int64  
Area Income                 1000 non-null float64  
Daily Internet Usage        1000 non-null float64  
Ad Topic Line               1000 non-null object  
City                        1000 non-null object  
Male                        1000 non-null int64  
Country                     1000 non-null object  
Timestamp                   1000 non-null object  
Clicked on Ad               1000 non-null int64  
dtypes: float64(3), int64(3), object(4)  
memory usage: 78.2+ KB  
¡Buenas noticias! Todas las variables están completas y no hay valores perdidos dentro de ellas. Cada uno de ellos contiene 1000 elementos y no habrá necesidad de un preprocesamiento adicional de datos sin procesar.
También utilizaremos la describefunción para obtener información sobre los rangos en los que cambian las variables:
data.describe()  
Un dato interesante de la tabla es que el ingreso más pequeño del área es $ 13,996.50 y el más alto es $ 79,484.80. Esto significa que los visitantes del sitio son personas que pertenecen a diferentes clases sociales. También se puede concluir que estamos analizando un sitio web popular, ya que los usuarios pasan entre 32 y 91 minutos en el sitio web en una sesión. ¡Estos son números realmente grandes!
Además, la edad media de un visitante es de 36 años. Vemos que el usuario más joven tiene 19 y el mayor tiene 61 años. Podemos concluir que el sitio está dirigido a usuarios adultos. Finalmente, si nos preguntamos si el sitio es visitado más por hombres o mujeres, podemos ver que la situación es casi igual (52% a favor de las mujeres).
Para seguir analizando nuestros datos, primero dibujemos un histograma con la estimación de la densidad del Kernel para la variable 'Edad'.
from scipy.stats import norm  
sns.distplot(data['Age'], hist=False, color='r', rug=True, fit=norm);  
Se puede concluir que la variable 'Edad' tiene una distribución normal de datos. Veremos en algunos de los siguientes artículos por qué esto es bueno para el procesamiento efectivo de datos.
Vamos a trazar una gráfica de densidad bidimensional para determinar la interdependencia de dos variables. Veamos cómo se vinculan la edad del usuario y el tiempo que se pasa en el sitio.
f, ax = plt.subplots(figsize=(10, 10))  
sns.kdeplot(data.Age, data['Daily Time Spent on Site'], color="b", ax=ax)  
sns.rugplot(data.Age, color="r", ax=ax)  
sns.rugplot(data['Daily Time Spent on Site'], vertical=True, ax=ax)  
De la imagen, podemos concluir que los usuarios más jóvenes pasan más tiempo en el sitio. Esto implica que los usuarios de 20 a 40 años de edad pueden ser el principal grupo objetivo de la campaña de marketing. Hipotéticamente, si tenemos un producto destinado a personas de mediana edad, este es el sitio adecuado para la publicidad. Por el contrario, si tenemos un producto destinado a personas mayores de 60 años, sería un error anunciarlo en este sitio.
Presentaremos otro gráfico de densidad y determinaremos la interdependencia de 'Tiempo diario dedicado en el sitio' y 'Uso diario de Internet'.
f, ax = plt.subplots(figsize=(8, 8))  
cmap = sns.cubehelix_palette(as_cmap=True, start=0, dark=0, light=3, reverse=True)  
sns.kdeplot(data["Daily Time Spent on Site"], data['Daily Internet Usage'],  
    cmap=cmap, n_levels=100, shade=True);
De la figura anterior, está claro que los usuarios que pasan más tiempo en Internet también pasan más tiempo en el sitio.
Ahora mostraremos cómo visualizar tendencias en los datos utilizando la scatter_matrixfunción. Incluiremos solo variables numéricas para realizar análisis.
from pandas.plotting import scatter_matrix  
scatter_matrix(data[['Daily Time Spent on Site', 'Age','Area Income', 'Daily Internet Usage']],  
    alpha=0.3, figsize=(10,10))
El panorama general proporciona una buena visión de las propiedades de los usuarios que hacen clic en los anuncios. Sobre esta base, se puede hacer un gran número de análisis adicionales. Se los dejamos a usted, trate de encontrar otros datos interesantes a partir de los datos y compártalos con nosotros en los comentarios.

Preprocesamiento de datos

Es posible que haya notado que "Ad Topic Line", "City" y "Country" son columnas categóricas. Vamos a trazar todos los valores únicos para estas columnas.
object_variables = ['Ad Topic Line', 'City', 'Country']  
data[object_variables].describe(include=['O'])  
Como podemos ver en la tabla anterior, todos los valores en la columna "Línea de tema de anuncios" son únicos, mientras que la columna "Ciudad" contiene 969 valores únicos de cada 1000. Hay demasiados elementos únicos dentro de estas dos columnas categóricas y es Generalmente difícil de realizar una predicción sin la existencia de un patrón de datos. Debido a eso, se omitirán de un análisis más detallado. La tercera variable categórica, es decir, "País", tiene un elemento único (Francia) que se repite 9 veces. Además, podemos determinar los países con el mayor número de visitantes:
pd.crosstab(index=data['Country'], columns='count').sort_values(['count'], ascending=False).head(20)  
La siguiente tabla muestra los 20 países más representados en nuestro DataFrame.
Ya hemos visto, hay 237 países únicos diferentes en nuestro conjunto de datos y ningún país es demasiado dominante. Un gran número de elementos únicos no permitirá que un modelo de aprendizaje automático establezca relaciones fácilmente valiosas. Por esa razón, esta variable será excluida también.
data = data.drop(['Ad Topic Line', 'City', 'Country'], axis=1)  
A continuación, analizaremos la categoría 'Marca de tiempo'. Representa la hora exacta en que un usuario hizo clic en el anuncio. Ampliaremos esta categoría a 4 nuevas categorías: mes, día del mes, día de la semana y hora. De esta manera, obtendremos nuevas variables que un modelo ML podrá procesar y encontrar posibles dependencias y correlaciones. Como hemos creado nuevas variables, excluiremos la variable original "Marca de tiempo" de la tabla. La variable "Día de la semana" contiene valores de 0 a 6, donde cada número representa un día específico de la semana (de lunes a domingo).
data['Timestamp'] = pd.to_datetime(data['Timestamp'])

data['Month'] = data['Timestamp'].dt.month  
data['Day of the month'] = data['Timestamp'].dt.day  
data["Day of the week"] = data['Timestamp'].dt.dayofweek  
data['Hour'] = data['Timestamp'].dt.hour  
data = data.drop(['Timestamp'], axis=1)

data.head()  

Conjuntos de datos de tren y prueba

Una vez que se procesa el conjunto de datos, debemos dividirlo en dos partes: entrenamiento y conjunto de pruebas. Importaremos y utilizaremos la train_test_splitfunción para eso. Todas las variables excepto 'Clicked on Ad' serán los valores de entrada Xpara los modelos ML. La variable 'Clicked on Ad' se almacenará en y, y representará la variable de predicción. Elegimos arbitrariamente asignar el 33% de los datos totales para el conjunto de capacitación.
from sklearn.model_selection import train_test_split

X = data[['Daily Time Spent on Site', 'Age', 'Area Income', 'Daily Internet Usage',  
    'Male', 'Month', 'Day of the month' ,'Day of the week']]
y = data['Clicked on Ad']  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)  

Desarrollo de modelos y procedimientos de adaptación

En este artículo, se desarrollarán dos modelos ML diferentes: un modelo de regresión logística y un modelo de árbol de decisión.
El modelo de regresión logística es un algoritmo que utiliza una función logística para modelar variables dependientes binarias. Es una herramienta para el análisis predictivo y se utiliza para explicar las relaciones entre múltiples variables. Puede encontrar más información sobre esta técnica en el siguiente enlace: Regresión logística .
El Árbol de decisiones es una de las técnicas de minería de datos más utilizadas para el análisis y el modelado. Se utiliza para la clasificación, predicción, estimación, agrupación, descripción de datos y visualización. Las ventajas de los árboles de decisión, en comparación con otras técnicas de extracción de datos, son la simplicidad y la eficiencia de cálculo. Puede encontrar algunos antecedentes sobre los árboles de decisión y cómo usarlos con Scikit-Learn aquí: Árboles de decisión en Python con Scikit-Learn
El primer modelo que importaremos será un modelo de regresión logística. Primero, es necesario cargar la LogisticRegressionfunción desde la sklearn.linear_modelbiblioteca. Asimismo, se cargará el accuracy_scorepara evaluar los rendimientos de clasificación del modelo.
from sklearn.linear_model import LogisticRegression  
from sklearn.metrics import accuracy_score  
from sklearn.metrics import confusion_matrix  
Los siguientes pasos son la inicialización del modelo, su entrenamiento y, finalmente, hacer predicciones.
model_1 = LogisticRegression(solver='lbfgs')  
model_1.fit(X_train, y_train)  
predictions_LR = model_1.predict(X_test)

print('Logistic regression accuracy:', accuracy_score(predictions_LR, y_test))  
print('')  
print('Confusion matrix:')  
print(confusion_matrix(y_test,predictions_LR))  
Salida:
Logistic regression accuracy: 0.906060606060606

Confusion matrix:  
[[158   4]
 [ 27 141]]
La precisión del modelo de regresión logística es 0.906 o 90.6%. Como se puede observar, el rendimiento del modelo también está determinado por la matriz de confusión. La condición para usar esta matriz se debe explotar en un conjunto de datos con valores verdaderos y falsos conocidos. Puede encontrar información adicional sobre la matriz de confusión aquí: Matriz de confusión .
Nuestra matriz de confusión nos dice que el número total de predicciones exactas es 158 + 141 = 299Por otro lado, el número de predicciones incorrectas es 27 + 4 = 31Podemos estar satisfechos con la precisión de predicción de nuestro modelo.
Ahora vamos a importar DecisionTreeClassifierdesde la sklearn.treebiblioteca. model_2se basará en la técnica del árbol de decisión, se capacitará como en el caso anterior y se harán las predicciones deseadas.
from sklearn.tree import DecisionTreeClassifier

model_2 = DecisionTreeClassifier()  
model_2.fit(X_train, y_train)  
predictions_DT = model_2.predict(X_test)

print('Decision tree accuracy:', accuracy_score(predictions_DT, y_test))  
print('')  
print('Confusion matrix:')  
print(confusion_matrix(y_test,predictions_DT))  
Salida:
Decision tree accuracy: 0.9333333333333333

Confusion matrix:  
[[151  11]
 [ 11 157]]
Se puede concluir que el modelo de árbol de decisión mostró mejores rendimientos en comparación con el modelo de regresión logística. La matriz de confusión nos muestra que las 308 predicciones se han realizado correctamente y que solo hay 22 predicciones incorrectas. Además, la precisión del Árbol de Decisión es mejor en aproximadamente un 3% en comparación con el primer modelo de regresión.

Conclusión

Los resultados obtenidos mostraron el valor de uso de ambos modelos de aprendizaje automático. El modelo de Árbol de Decisión mostró un rendimiento ligeramente mejor que el modelo de Regresión Logística, pero definitivamente, ambos modelos han demostrado que pueden ser muy exitosos para resolver problemas de clasificación.
Los resultados de la predicción ciertamente se pueden cambiar con un enfoque diferente para el análisis de datos. Lo alentamos a que haga su análisis desde el principio, a que encuentre nuevas dependencias entre variables y las muestre gráficamente. Después de eso, crea un nuevo conjunto de entrenamiento y un nuevo conjunto de prueba. Deje que el conjunto de entrenamiento contenga una mayor cantidad de datos que en el artículo. Encaja y evalúa tu modelo. Al final, felicítate en un comentario si obtienes mejores actuaciones.
¡Te deseamos un trabajo exitoso y mágico!

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas