Рубрики
Без рубрики

Прогнозирование кликов клиентов по рекламе с помощью машинного обучения

Автор оригинала: Guest Contributor.

Прогнозирование кликов клиентов по рекламе с помощью машинного обучения

Вступление

В недавнем прошлом интернет-маркетинг взял на себя традиционные маркетинговые стратегии. Компании предпочитают рекламировать свою продукцию на сайтах и платформах социальных сетей. Тем не менее, ориентация на правильную аудиторию по-прежнему является сложной задачей в онлайн-маркетинге. Тратить миллионы на показ рекламы аудитории, которая вряд ли купит вашу продукцию, может быть очень дорого.

В этой статье мы будем работать с рекламными данными маркетингового агентства, чтобы разработать алгоритм машинного обучения, который предсказывает, нажмет ли конкретный пользователь на рекламу. Данные состоят из 10 переменных: “Ежедневное время, проведенное на Сайте”, “Возраст”, “Доход района”, “Ежедневное использование Интернета”, “Тема объявления”, “Город”, “Мужчина”, “Страна”, Временная метка ” и “Клик по объявлению”.

Основная переменная, которая нас интересует, – это “Клик по объявлению”. Эта переменная может иметь два возможных результата: 0 и 1, где 0 относится к случаю, когда пользователь не нажал на объявление, а 1 относится к сценарию, когда пользователь нажимает на объявление.

Мы посмотрим, сможем ли мы использовать другие 9 переменных, чтобы точно предсказать значение переменной “Нажал на объявление”. Мы также проведем некоторый исследовательский анализ данных, чтобы увидеть, как “Ежедневное время, проведенное на сайте” в сочетании с “Темой объявления” влияет на решение пользователя нажать на кнопку добавить.

Импорт библиотек

Чтобы разработать нашу модель прогнозирования, нам нужно импортировать необходимые библиотеки Python:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

Импорт набора данных

Набор данных для этой статьи можно скачать по ссылке Kaggle . Распакуйте загруженный zip-файл и поместите файл “advertising.csv” на локальный диск. Это файл, который мы будем использовать для обучения нашей модели машинного обучения.

Теперь нам нужно загрузить данные:

data = pd.read_csv('E:/Datasets/advertising.csv')

Давайте посмотрим на первые десять строк нашего фрейма данных:

data.head(10)

Основываясь на первых строках таблицы, мы можем получить базовое представление о данных, с которыми работаем. Мы хотим проверить, сколько данных у нас есть в каждой переменной.

data.info()

Выход:


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

Хорошие новости! Все переменные являются полными, и в них нет пропущенных значений. Каждый из них содержит 1000 элементов, и нет необходимости в дополнительной предварительной обработке необработанных данных.

Мы также будем использовать функцию describe , чтобы получить представление о диапазонах изменения переменных:

data.describe()

Интересный факт из таблицы состоит в том, что наименьший доход района составляет $13 996,50, а самый высокий – $79 484,80. Это означает, что посетители сайта-это люди, принадлежащие к разным социальным классам. Можно также сделать вывод, что мы анализируем популярный веб-сайт, поскольку пользователи проводят на нем от 32 до 91 минуты за один сеанс. Это действительно большие цифры!

Кроме того, средний возраст посетителя составляет 36 лет. Мы видим, что самому молодому пользователю 19 лет, а самому старшему-61 год. Можно сделать вывод, что сайт ориентирован на взрослых пользователей. Наконец, если мы зададимся вопросом, посещает ли сайт больше мужчин или женщин, то увидим, что ситуация почти равная (52% в пользу женщин).

Для дальнейшего анализа наших данных сначала построим гистограмму с оценкой плотности ядра для переменной “Возраст”.

from scipy.stats import norm
sns.distplot(data['Age'], hist=False, color='r', rug=True, fit=norm);

Можно сделать вывод, что переменная “Возраст” имеет нормальное распределение данных. В следующих статьях мы увидим, почему это полезно для эффективной обработки данных.

Давайте построим двумерный график плотности, чтобы определить взаимозависимость двух переменных. Давайте посмотрим, как связаны возраст пользователя и время, проведенное на сайте.

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)

Из рисунка можно сделать вывод, что молодые пользователи проводят на сайте больше времени. Это означает, что основной целевой группой маркетинговой кампании могут быть пользователи в возрасте от 20 до 40 лет. Гипотетически, если у нас есть продукт, предназначенный для людей среднего возраста, это правильный сайт для рекламы. И наоборот, если у нас есть продукт, предназначенный для людей старше 60 лет, было бы ошибкой рекламировать его на этом сайте.

Мы представим еще один график плотности и определим взаимозависимость “Ежедневного времени, проведенного на Сайте” и “Ежедневного использования Интернета”.

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);

Из приведенного выше рисунка видно, что пользователи, которые проводят больше времени в Интернете, также проводят больше времени на сайте.

Теперь мы покажем, как визуализировать тренды в данных с помощью функции scatter_matrix . Мы будем включать только числовые переменные для выполнения анализа.

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))

Общая картина дает хорошее представление о свойствах пользователей, которые нажимают на рекламу. На этой основе можно провести большое количество дальнейших анализов. Мы оставляем их вам, попробуйте найти другие интересные факты из данных и поделитесь ими с нами в комментариях.

Предварительная обработка данных

Возможно, вы заметили, что “Строка темы объявления”, “Город” и “Страна” являются категориальными столбцами. Давайте построим все уникальные значения для этих столбцов.

object_variables = ['Ad Topic Line', 'City', 'Country']
data[object_variables].describe(include=['O'])

Как видно из приведенной выше таблицы, все значения в столбце “Строка темы объявления” уникальны, в то время как столбец “Город” содержит 969 уникальных значений из 1000. В этих двух категориальных столбцах слишком много уникальных элементов, и, как правило, трудно выполнить прогноз без наличия шаблона данных. Из-за этого они будут исключены из дальнейшего анализа. Третья категориальная переменная, то есть “Страна”, имеет уникальный элемент (Франция), который повторяется 9 раз. Кроме того, мы можем определить страны с наибольшим количеством посетителей:

pd.crosstab(index=data['Country'], columns='count').sort_values(['count'], ascending=False).head(20)

В таблице ниже приведены 20 наиболее представленных стран в нашей системе данных.

Мы уже видели, что в нашем наборе данных есть 237 различных уникальных стран, и ни одна страна не является слишком доминирующей. Большое количество уникальных элементов не позволит модели машинного обучения легко устанавливать ценные отношения. По этой причине эта переменная также будет исключена.

data = data.drop(['Ad Topic Line', 'City', 'Country'], axis=1)

Далее мы проанализируем категорию “Метка времени”. Он представляет собой точное время, когда пользователь нажал на объявление. Мы расширим эту категорию до 4 новых категорий: месяц, день месяца, день недели и час. Таким образом, мы получим новые переменные, которые модель ML сможет обрабатывать и находить возможные зависимости и корреляции. Поскольку мы создали новые переменные, мы исключим исходную переменную “Timestamp” из таблицы. Переменная “День недели” содержит значения от 0 до 6, где каждое число представляет определенный день недели (с понедельника по воскресенье).

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()

Наборы данных для обучения и тестирования

Как только набор данных обработан, нам нужно разделить его на две части: обучающий и тестовый набор. Для этого мы импортируем и используем функцию train_test_split . Все переменные, кроме ‘Clicked on Ad’, будут входными значениями X для моделей ML. Переменная ‘Clicked on Ad’ будет сохранена в y и будет представлять собой переменную прогноза. Мы произвольно решили выделить 33% от общего объема данных для обучающего набора.

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)

Разработка моделей и процедуры подгонки

В этой статье будут разработаны две различные модели ML: модель логистической регрессии и модель дерева решений.

Модель логистической регрессии-это алгоритм, который использует логистическую функцию для моделирования бинарных зависимых переменных. Это инструмент для прогностического анализа, который используется для объяснения взаимосвязей между несколькими переменными. Подробнее об этой методике вы можете узнать по следующей ссылке: Логистическая регрессия .

Дерево решений является одним из наиболее часто используемых методов интеллектуального анализа данных для анализа и моделирования. Он используется для классификации, прогнозирования, оценки, кластеризации, описания данных и визуализации. Преимущества Деревьев решений по сравнению с другими методами интеллектуального анализа данных заключаются в простоте и эффективности вычислений. Некоторые сведения о деревьях решений и о том, как их использовать с помощью Scikit-Learn, можно найти здесь: Деревья решений в Python с помощью Scikit-Learn

Первой моделью, которую мы импортируем, будет модель логистической регрессии. Во-первых, необходимо загрузить функцию Logistic Regression из библиотеки sklearn.linear_model . Кроме того, мы загрузим accuracy_score для оценки классификационных характеристик модели.

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

Следующие шаги-это инициализация модели, ее обучение и, наконец, составление прогнозов.

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))

Выход:

Logistic regression accuracy: 0.906060606060606

Confusion matrix:
[[158   4]
 [ 27 141]]

Точность модели логистической регрессии составляет 0,906 или 90,6%. Как можно заметить, производительность модели также определяется матрицей путаницы. Условием использования этой матрицы является использование набора данных с известными истинными и ложными значениями. Дополнительную информацию о матрице путаницы вы можете найти здесь: Матрица путаницы .

Наша матрица путаницы говорит нам, что общее число точных предсказаний равно 158 + . С другой стороны, количество неверных прогнозов 27 + . Мы можем быть удовлетворены точностью предсказания нашей модели.

Теперь мы импортируем DecisionTreeClassifier из библиотеки sklearn.tree . model_2 будет основан на методе дерева решений, он будет обучен, как и в предыдущем случае, и будут сделаны желаемые прогнозы.

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))

Выход:

Decision tree accuracy: 0.9333333333333333

Confusion matrix:
[[151  11]
 [ 11 157]]

Можно сделать вывод, что модель Дерева решений показала лучшие результаты по сравнению с моделью логистической регрессии. Матрица путаницы показывает нам, что 308 предсказаний были сделаны правильно и что есть только 22 неверных предсказания. Кроме того, точность дерева решений выше примерно на 3% по сравнению с первой регрессионной моделью.

Вывод

Полученные результаты показали полезность обеих моделей машинного обучения. Модель Дерева решений показала несколько лучшую производительность, чем модель логистической регрессии, но определенно обе модели показали, что они могут быть очень успешными в решении задач классификации.

Результаты прогнозирования, безусловно, могут быть изменены другим подходом к анализу данных. Мы рекомендуем вам провести анализ с самого начала, чтобы найти новые зависимости между переменными и графически отобразить их. После этого создайте новый обучающий набор и новый тестовый набор. Пусть обучающий набор содержит больший объем данных, чем в статье. Подгоняйте и оценивайте свою модель. В конце концов, похвалите себя в комментарии, если вы получите улучшенные результаты.

Желаем вам успешной и волшебной работы!