Главная страница
Навигация по странице:

  • Таблица 2.2.2 – Формат таблицы соответствия между исходными и укрупненными категориями

  • Первичная подготовка данных для кластеризации

  • Идентификатор пользователя(reviewer_id) Категория 1 ….. Категория N

  • Таблица 2.2.3 – Формат исходных данных для кластеризации

  • Таблица 2.2.4 – Вспомогательная таблица исходных данных для кластеризации

  • Пример процесса подготовки данных к кластеризации При помощи скрипта transform_user_reviews.r

  • Кластеризация с помощью библиотеки flexclust

  • Рисунок 2.2.8 – Пример гистограммы центра кластера

  • Подготовка исходных данных

  • Таблица 2.2.5 – Формат данных для оценки потребительских предпочтений

  • Таблица 2.2.6 – Вспомогательная таблица с данными для оценки потребительских предпочтений

  • Разделение выборки в соответствии с результатами кластеризации

  • Построение графиков для сравнения доверительных интервалов

  • Рисунок 2.2.9 – Пример графика с доверительными интервалами предпочтений по времени работы от аккумулятора

  • Для Герасимова 2. Разработка модели потребительских предпочтений на основе данных рекомендательной сети epinions com


    Скачать 2.87 Mb.
    НазваниеРазработка модели потребительских предпочтений на основе данных рекомендательной сети epinions com
    Дата11.06.2022
    Размер2.87 Mb.
    Формат файлаdocx
    Имя файлаДля Герасимова 2.docx
    ТипДокументы
    #584719
    страница6 из 16
    1   2   3   4   5   6   7   8   9   ...   16

    Преобразование и анализ данных


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


    Расскажем, как может быть реализованы операции по разделению пользователей сайта Epinions на группы, описанные в разделе 1.3.1.

    Укрупнение категорий

    Для того чтобы реализовать в БД принадлежность товара к более крупной категории (см. раздел 3.2), можно добавить таблицу вида:

    category

    new_category

    <исходная категория 1>

    <новая категория 1>

    <исходная категория 2>

    <новая категория 2>

    <исходная категория 3>

    <новая категория 1>

    ……….

    ……….

    Таблица 2.2.2 – Формат таблицы соответствия между исходными и укрупненными категориями

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

    select product.product_id, catmap.new_category
    from product inner join catmap
    on product.category = catmap.category

    Где catmap – таблица соответствия между категориями.

    Первичная подготовка данных для кластеризации

    Для кластеризации первым делом нужно получить векторы с количеством отзывов по категориям для каждого пользователя. Будем представлять данные в виде таблицы.

    Идентификатор пользователя(reviewer_id)

    Категория 1

    ..

    Категория N



    Количество отзывов пользователя в данной категории

    …..

    Количество отзывов пользователя в данной категории

    …..

    …..

    …..

    …..

    Таблица 2.2.3 – Формат исходных данных для кластеризации

    Для получения такой таблицы написан скрипт transform_user_reviews.r

    В скрипте сначала задается имя файла с БД и имя выходного файла, в котором будет сохранена полученная таблица. Затем при помощи SQL-запроса получаем таблицу вида:

    reviewer_id

    category

    reviews





    Количество отзывов пользователя в категории

    ……

    ……



    Количество отзывов пользователя в категории

    ……

    ……

    ……





    Количество отзывов пользователя в категории

    ……

    ……



    Количество отзывов пользователя в категории

    Таблица 2.2.4 – Вспомогательная таблица исходных данных для кластеризации

    Затем таблица несколькими командами R приводится в требуемый вид.

    Отбор пользователей и категорий

    Для отбора пользователей и отзывов (см. раздел 3.2) служит функция filter_data. На вход она принимает таблицу с исходными данными (Таблица 2.2 .3), список категорий, которые нужно исключить из таблицы, минимальное и максимальное количество отзывов для пользователя.

    filter_data <- function(df, stopcategories, minrev, maxrev) {

    df1 <- df[,setdiff(names(df),stopcategories)]

    return (df1[rowSums(df1) > minrev & rowSums(df1) < maxrev,])

    }

    Возвращается таблица, из которой исключены столбцы, входящие в stopcategories и сохранены только те пользователи, у которых количество отзывов после исключения столбцов больше minrev и меньше maxrev.

    Преобразование tf-idf

    Покажем, как применить к строкам таблицы (Таблица 2.2 .2) преобразование tf-idf.

    Функция lolfreqframe применяет к каждой строке таблицы логарифмическое преобразование частоты слова (Таблица 1.3 .1).

    logfreqframe <- function(df) {

    return (data.frame(apply(df, 1:2, function (x)

    if (x==0) 0 else log(x) +1)))

    }

    Функция tfidf применяет преобразование TF-IDF (см. раздел Векторная модель документа1.3.1.2) к каждой строке таблицы.

    tfidf <- function(df) {

    idf <- function(termvect) {

    return ( log( length(termvect) / (sum(ifelse(termvect>0,1,0))) ) )

    }

    return (sweep(df,2,apply(df,2,idf), FUN = "*"))

    }

    Функция normframerows служит для нормирования строк таблицы.

    normframerows <- function(df) {

    return (sweep(df,1,apply(df,1, function (x) sqrt(sum(x*x))),FUN="/"))

    }

    Указанные функции определены в файле clustfunc.r.

    Пример процесса подготовки данных к кластеризации

    1. При помощи скрипта transform_user_reviews.r получим файл с данными из БД. Пусть файл называется users_by_reviews.csv

    2. Прочитаем файл в таблицу R

    mydata_raw <- read.table("users_by_reviews.csv", header=TRUE, sep=";", row.names ="reviewer_id")

    1. Зададим список запрещенных категорий, например:
      stopcategories <- c("Books", "Movies", "Music")

    2. Исключим из выборки лишние данные

    mydata <- filter_data(mydata_raw, stopcategories, 20, 500)

    1. Выполним все требуемые преобразования над строками таблицы

    mydata <- normframerows(tfidf(logfreqframe(mydata)))

    Кластеризация с помощью библиотеки flexclust

    В библиотеках языка R реализовано множество алгоритмов кластеризации. При этом найти библиотеку, в которой хорошо реализованы основные методы, не просто. Как правило, библиотека подбирается под используемый метод. Для кластеризации методом К-средних хорошо подходит библиотека flexclust, о которой можно подробно узнать в статье [7] и справочном руководстве [14]. Она удовлетворила всем требованиям, которые возникли в ходе выполнения данной работы.

    1. Библиотека позволяет задавать собственные меры близости и функции для вычисления центров кластеров.

    2. Библиотека включает средства для визуализации результатов кластеризации.

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

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

    Мера близости и функция для вычисления центра кластера задаются при помощи объекта класса kccaFamily. Создается объект kccaFamily так:

    angleFam <- kccaFamily(dist = distAngle, cent = colMeans)

    В качестве меры близости здесь выбирается угол между векторами. За центр кластера принимается вектор, составленный из средних значений по каждому элементу векторов, входящих в кластер. Функции distAngle и colMeans входят в библиотеку flexclust.

    Функция kcca реализует метод К-средних. Пример вызова функции:

    fit <- kcca(mydata, 3, family = angleFam)

    Данные содержатся в переменной mydata, используется заранее определенный объект angleFam для задания параметров кластеризации, данные разбивается на 3 кластера

    Переменная fit теперь содержит объект класса kcca. В этом объекте сохраняются различные данные о кластеризации, например, центры получившихся кластеров, различные показатели качества кластеризации, принадлежность точек к кластерам. Например, вектор, показывающий номер кластера для каждой из строк исходной таблицы, хранится в атрибуте “second” объекта класса kcca. Получить его можно при помощи следующей команды:
    clust_assign <- attr(fit, "second")

    Дополнительные возможности для кластеризации предоставляет функция stepFlexclust.

    • Она позволяет выполнить алгоритм для разного числа кластеров

    • Для каждого заданного числа кластеров она позволяет многократно повторить алгоритм со случайными начальными центроидами. Для каждого варианта кластеризации(числа кластеров) сохраняется лучший результат

    Приведем пример вызова функции stepFlexclust

    stepfit <- stepFlexclust(mydata, 2:5, family = angleFam,
    FUN=kcca, nrep = 100)

    Алгоритм выполнится для 2, 3,..5 кластеров, по сто прогонов в каждом случае. Функция stepFlexclust возвращает объект класса stepFlexclust. Получить результат кластеризации в виде объекта класса kcca, например, для случая двух кластеров, можно так:
    fit2 <- getModel(cl1, as.character(2))

    Функция barplot служит для построения гистограмм центров кластеров.

    barplot(fit,oneplot = FALSE)

    В результате этого вызова будут построены гистограммы для центров кластеров.

    Рисунок 2.2.8 – Пример гистограммы центра кластера

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


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

    Подготовка исходных данных

    Чтобы построить регрессионную модель потребительских предпочтений для какой-либо товарной категории, нужно получить таблицу следующего вида:

    reviewer_id

    review_id

    overall



    ..



    Идентификатор пользователя

    Идентификатор отзыва

    Общая оценка товара

    Оценка по первому св-ву товара (1-5)

    …..

    Оценка по св-ву N товара (1-5)

    …..

    …..




    …..

    …..





    Таблица 2.2.5 – Формат данных для оценки потребительских предпочтений


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

    Опишем принцип его работы:

    1. Создаем в базе данных временную таблицу cat_rating, в которой содержатся детальные оценки только на отзывы конкретной категории (в нашем случае это цифровые камеры).

    2. Создаем таблицу rawdata следующего формата

    review_id

    attribute

    rating





    Оценка свойства в отзыве

    ……

    ……



    Оценка свойства в отзыве

    ……

    ……

    ……





    Оценка свойства в отзыве

    ……

    ……



    Оценка свойства в отзыве

    Таблица 2.2.6 – Вспомогательная таблица с данными для оценки потребительских предпочтений

    1. Выбираем из таблицы review в БД пользователей и оценки для требуемых отзывов и загружаем в таблицу reviews в R. Более коротким решением было бы загрузить из БД всю таблицу целиком, но это отрицательно сказалось бы на производительности.

    2. Преобразуем таблицу rawdata так, чтобы атрибуты располагались согласно таблице 2.4.

    3. Соединяем таблицы rawdata и reviews, чтобы добавить в таблицу идентификатор пользователя и общую оценку

    Линейная регрессия в R

    Приведем пример построения линейной регрессионной модели в среде R. Напомним, что фотокамеры характеризуются пятью свойствами:

    • Надежность (durability)

    • Простота использования (Ease of use)

    • Время работы от аккумулятора (Battery)

    • Скорость срабатывания (Shutter lag)

    • Качество снимка (Picture quality)

    Пусть таблица с данными хранится в переменной cameras. Поля с оценками свойств для простоты названы так (порядок соответствует вышеуказанному списку): durability, eou, battery, lag, picture.

    Линейную регрессионную модель в R можно построить с помощью функции lm, которая входит в стандартную библиотеку R. В нашем примере вызов может выглядеть так:

    fit <- lm(overall durability + eou + battery + lag + picture, data=cameras)

    В переменной fit будет сохранен объект класса lm, который содержит всю информацию о полученной модели: оценки коэффициентов, доверительные интервалы, показатели качества модели и т.п. Основные сведения о полученной модели можно получить с помощью команды summary.

    summary(fit)

    Call:

    lm(formula = overall durability + eou + battery + lag + picture,
    data = cameras)

    Residuals:
    Min 1Q Median 3Q Max
    -3.4101 -0.3509 0.0279 0.4092 1.8015


    Coefficients:
    Estimate Std. Error t value Pr(>|t|)
    (Intercept) -0.93663 0.08631 -10.852 < 2e-16 ***
    durability 0.38986 0.01859 20.976 < 2e-16 ***
    eou 0.21485 0.01656 12.978 < 2e-16 ***
    battery 0.09894 0.01301 7.603 4.09e-14 ***
    lag 0.14116 0.01598 8.833 < 2e-16 ***
    picture 0.41490 0.01643 25.254 < 2e-16 ***
    ---
    Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.6238 on 2462 degrees of freedom
    (2385 observations deleted due to missingness)
    Multiple R-squared: 0.6249, Adjusted R-squared: 0.6242
    F-statistic: 820.4 on 5 and 2462 DF, p-value: < 2.2e-16

    Разделение выборки в соответствии с результатами кластеризации

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

    getclustsamples <- function(clustdf, clustfit, sampdf) {

    clust_assign <-data.frame(row.names(clustdf), attr(clustfit, "second"))

    names(clust_assign) <- c("reviewer_id", "cluster")

    df1 <- merge(sampdf,clust_assign, by = "reviewer_id")

    return (split(df1, df1$cluster))

    }

    Аргументы функции

    • clustdf – таблица формата 2

    • clustfit – результат кластеризации clustdf(объект класса kcca)

    • sampdf – таблица с оценками по товарной категории(формат 3)

    Функция getclustsamples возвращает список, состоящий из таблиц формата 3. Список получен разделением таблицы sampdf на части, число которых равно числу кластеров. В каждой таблице содержатся оценки пользователей, относящихся к соответствующему кластеру. К каждой таблице в списке можно обратиться по номеру кластера, которому она соответствует (записав номер как строку).

    clustsamples <- getclustsamples(mydata, fit, cameras)
    clustsamples$’1’

    Построить регрессионную модель отдельно для каждой из полученных выборок можно, например, так:

    camlm <- function(x) {

    return lm(overall durability + eou + battery + lag + picture, data=x)

    }

    clustlms <- lapply(clustsamples, camlm)

    К каждой модели можно обратиться по номеру соответствующего кластера(в виде строки), например, clustlms$’1’.

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

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

    Для того, чтобы упростить сравнение, будем для каждого свойства товара строить график, на котором вертикальными отрезками будут изображены доверительные интервалы оценок соответствующего коэффициента для каждого кластера. Координата X для каждого из отрезков для удобства будет равна номеру кластера. Если на графике будем изображать доверительный интервал для полной выборки, то координату такого отрезка положим равной -1.

    Для построения графиков будем использовать функцию plotclustCIs.

    plotclustCIs <- function(clustlms, conf) {

    clustCIs <- lapply(clustlms, function(x) confint(x, level=conf))

    clustCIs1 <- lapply(clustCIs, function(x) data.frame(x, row.names(x)))

    data <-ldply(lapply(clustCIs1, function(x) x[2:nrow(x),]))

    names(data) <- c('cluster', 'lower', 'higher', 'char')

    data$cluster <-as.integer(data$cluster)

    charCIs <- split(data, data$char)

    for (i in names(charCIs)) {

    a <- charCIs[[i]]

    plot(0,xlim=c(-1,10), ylim=c(-0.5,1), ylab = i, xlab = "cluster")

    segments(a$cluster, a$lower, a$cluster, a$higher)

    points(a$cluster,(a$lower + a$higher) / 2, pch = '-', cex=1.5)

    }

    }

    Функция принимает список регрессионных моделей и степень доверия. Функция строит график для каждой независимой переменной, на котором отображен доверительный интервал для этой переменной для каждой модели из списка. Вот пример такого графика:



    Рисунок 2.2.9 – Пример графика с доверительными интервалами предпочтений по времени работы от аккумулятора

    Здесь изображены доверительные интервалы для оценок емкости батареи фотоаппаратов. Доверительные интервалы отображены для выборок из пяти кластеров, а также для полной выборки.
    1. 1   2   3   4   5   6   7   8   9   ...   16


    написать администратору сайта