Линейная классификация для интернет магазина

Благодаря искусственному интеллекту в ближайшие 30 лет специалисты по пиару и рекламе приобретут невиданные суперсилы, включая способность предсказывать будущее. Venture Beat опросил PR-агентов и распространителей маркетинговых инструментов о том, какова роль машинного обучения в их профессии. Опубликуем выжимку из статьи чтобы вы понимали реалии сегодняшнего дня.

«Машинное обучение уже помогает маркетологам эффективнее использовать данные о клиентах и дополняет то, что у них было всегда: интуицию и опыт», — Джефф Хардисон, вице-президент Lytics, платформы для сбора данных о клиентах.

«Наши данные на 80% — 90% точны в прогнозировании того, что случится в ближайшие 30 дней. За три дня мы можем предсказать, какой будет динамика развития через 30 дней», — говорит Саиф Аджани, глава Keyhole, аналитической компании, использующей средства машинного обучения Google Tensor Flow.

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

Впечатлило после прочитанного? Лично нас вдохновило!

И так вернемся к нашему проекту интернет -магазина, где мы подготавливаем данные для  их анализа.

Проект интернет-магазина. Подготовка данных

И так  продолжим наш проект интернет-магазина, а точнее, рассмотрим процесс обработки данных.

Я уже загрузил библиотеки Numpy и Pandas.

import numpy as np

import pandas as pd

Для загрузки данных используем функцию pd.read_csv, файл ecommerce_data.csv.

df = pd.read_csv(‘ecommerce_data.csv’)

Если вы хотите увидеть, что в файле, используйте команду

df.head()

Она показывает первые пять строк файла.

Итак, выйдем из оболочки и начнём работу с файлом процесса. Если вы не хотите писать код, а сразу его просмотреть, зайдите на github, соответствующий файл называется process.py. Прежде всего загрузим библиотеки Numpy и Pandas.

import numpy as np

import pandas as pd

Далее мы напишем функцию get_data. Она, во-первых, считывает данные из файла, как мы это сделали чуть ранее, а во-вторых, преобразует их в матрицы Numpy, поскольку так легче работать.

def get_data():

df = pd.read_csv(‘ecommerce_data.csv’)

data = df.as_matrix()

Далее нам необходимо разделить наши x и y. Y  – это последний столбец, поэтому x у нас будет всеми остальными столбцами, за исключением последнего.

X = data[:, :-1]

Y = data[:, -1]

Далее, как мы говорили, необходимо нормализовать данные. Для х1 это значение х1 минус среднее значение и поделённое на среднее отклонение. То же самое и для х2.

X[:,1] = (X[:,1] – X[:,1].mean()) / X[:,1].std()

X[:,2] = (X[:,2] – X[:,2].mean()) / X[:,2].std()

Перейдём теперь к работе над столбцом категорий, которым является время суток. Для этого возьмём форму оригинального х и на его основе создадим новый Х2 размерности Nx(D+3), поскольку у нас четыре категории.

N, D = X.shape

X2 = np.zeros((N, D+3))

X2[:,0:(D-1)] = X[:,0:(D-1)]

Теперь напишем код для прямого кодирования для остальных столбцов. Сначала сделаем это простым способом. Для каждого наблюдения считываем значение времени суток, которое, как вы помните, принимает значение 0, 1, 2 и 3, и записываем это значение в Х2.

для n в xrange(N):

t = int(X[n,D-1])

X2[n,t+D-1] = 1

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

Z = np.zeros((N, 4))

Z[np.arange(N), X[:,D-1].astype(np.int32)] = 1

В таком случае нужно будет дописать ещё одну строку

X2[:,-4:] = Z

assert(np.abs(X2[:,-4:] – Z).sum() < 10e-10)

И конец функции.

return X2, Y

Для наших занятий по логистической регрессии нам нужны только двоичные данные, а не полный их набор, поэтому напишем функцию get_binary_data, которая будет вызывать функцию get_data, а затем фильтровать её результат, отбирая только классы 0 и 1.

def get_binary_data():

X, Y = get_data()

X2 = X[Y <= 1]

Y2 = Y[Y <= 1]

return X2, Y2

Это всё.

Проект интернет-магазина. Создание прогнозов

Итак, прежде всего надо загрузить наши данные. Запустим уже написанную нами функцию и присвоим значения для наших x и y.

import numpy as np

from process import get_binary_data

X, Y = get_binary_data()

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

D = X.shape[1]

W = np.random.randn(D)

b = 0

Нам понадобится написать ещё несколько функций. Прежде всего это функция для вычисления сигмоиды, а также функция forward, возвращающая значение сигмоиды для выражения WX + b.

def sigmoid(a):

return 1 / (1 + np.exp(-a))

def forward(X, W, b):

return sigmoid(X.dot(W) + b)

Далее создадим две переменные P_Y_given_X и predictions.

P_Y_given_X = forward(X, W, b)

predictions = np.round(P_Y_given_X)

И ещё одна функция classification_rate, в качестве аргумента принимающая целевые показатели и прогнозы, и возвращающая количество правильных ответов по отношению к их общему количеству.

def classification_rate(Y, P):

return np.mean(Y == P)

И, наконец, распечатаем результат.

print ‘’Score:’’, classification_rate(Y, predictions)

Запустим программу. Как можно видеть, установив случайные весовые коэффициенты, мы получили не очень хороший результат – около 32% точности.

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

Андрей Никитенко
Андрей Никитенко
Задать вопрос эксперту
Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Share via
Copy link