Введение в Mahout и простое приложение

Java алгоритм

Mahout Mountain (основное содержание обучения - ItemCF, USERCF, развертывание кластеров Hadoop и операция в рекомендуемой части Mahout)

1. Что такое Mahout?

  • Махаут — этоБиблиотека алгоритмов, который объединяет множество алгоритмов.
  • Apache Mahout — это проект с открытым исходным кодом под эгидой Apache Software Foundation (ASF), который предоставляет некоторые расширяемые возможности.Реализация классических алгоритмов в области машинного обучения, призванный помочь разработчикам создавать интеллектуальные приложения проще и быстрее.
  • В настоящее время проект Mahout имеет несколько общедоступных дистрибутивов. Mahout содержит множество реализаций, включая кластеризацию, классификацию, фильтрацию рекомендаций, частый анализ подэлементов.
  • Mahout эффективно масштабируется до кластеров Hadoop с помощью библиотеки Apache Hadoop.
  • Грант Ингерсолл, основатель Mahout, знакомит с основными концепциями машинного обучения и демонстрирует, как использовать Mahout для кластеризации документов, предоставления рекомендаций и организации контента.

2. Для чего используется Mahout?

2.1 Механизм рекомендаций

Провайдеры или веб-сайты рекомендуют вам книги, фильмы или статьи на основе вашего поведения в прошлом.

2.2 Кластеризация

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

2.3 Классификация

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

 

3. Алгоритм совместной фильтрации Mahout

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

Вкус в основном включает в себя следующие интерфейсы:

  • DataModel — это абстрактный интерфейс для информации о предпочтениях пользователя, а его конкретная реализация поддерживает извлечение информации о предпочтениях пользователя из любого типа источника данных. Taste по умолчанию предоставляет JDBCDataModel и FileDataModel, которые соответственно поддерживают чтение информации о предпочтениях пользователя из базы данных и файла.
  • Любовьимилянство и предметы вещества. AssulariMarity для определения сходства между двумя пользователями, он основан на ядре механизма совместной фильтрации. Отказ Удовлетворенность подобных, рассчитывает сходство между предметом.
  • UserNeighborhood используется в методе рекомендации на основе схожести пользователей, а рекомендуемый контент генерируется на основе метода поиска соседних пользователей с предпочтениями, схожими с текущим пользователем. UserNeighborhood определяет метод определения соседних пользователей, и конкретная реализация обычно рассчитывается на основе UserSimilarity.
  • Recommender — это абстрактный интерфейс механизма рекомендаций, основного компонента Taste. В программе предоставьте ей DataModel, которая может рассчитывать рекомендуемый контент для разных пользователей. В практических приложениях его класс реализации GenericUserBasedRecommender или GenericItemBasedRecommender в основном используется для реализации механизма рекомендаций на основе сходства пользователей или механизма рекомендаций на основе содержимого соответственно.
  • RecommenderEvaluator: Оценщик.
  • RecommenderIRStatsEvaluator: собирает показатели, связанные с эффективностью рекомендаций, включая точность, полноту и т. д.

 

4. Программирование алгоритма совместной фильтрации Mahout

1. Создайте проект maven

2. Импорт зависимостей mahout

    <dependencies>
        <dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout</artifactId>
            <version>0.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout-examples</artifactId>
            <version>0.11.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

 

3. Загрузите данные рейтинга фильмов

ссылка для скачивания:группа Lens.org/datasets/mo…

Категория данных: миллионы оценок 72 000 пользователей для 10 000 фильмов и 100 000 данных тегов.

4. пользовательские рекомендации

 1 package com.ahu.learnmahout;
 2 
 3 import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
 4 import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
 5 import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
 6 import org.apache.mahout.cf.taste.model.DataModel;
 7 import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
 8 import org.apache.mahout.cf.taste.recommender.RecommendedItem;
 9 import org.apache.mahout.cf.taste.recommender.Recommender;
10 import org.apache.mahout.cf.taste.similarity.UserSimilarity;
11 import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;
12 
13 import java.io.File;
14 import java.util.List;
15 
16 /**
17  * Created by ahu_lichang on 2017/6/23.
18  */
19 public class BaseUserRecommender {
20     public static void main(String[] args) throws Exception {
21         //准备数据 这里是电影评分数据
22         File file = new File("E:\\ml-10M100K\\ratings.dat");
23         //将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的
24         DataModel dataModel = new GroupLensDataModel(file);
25         //计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。
26         UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
27         //计算最近邻域,邻居有两种算法,基于固定数量的邻居和基于相似度的邻居,这里使用基于固定数量的邻居
28         UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(100, similarity, dataModel);
29         //构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于用户的协同过滤推荐
30         Recommender recommender = new GenericUserBasedRecommender(dataModel, userNeighborhood, similarity);
31         //给用户ID等于5的用户推荐10部电影
32         List<RecommendedItem> recommendedItemList = recommender.recommend(5, 10);
33         //打印推荐的结果
34         System.out.println("使用基于用户的协同过滤算法");
35         System.out.println("为用户5推荐10个商品");
36         for (RecommendedItem recommendedItem : recommendedItemList) {
37             System.out.println(recommendedItem);
38         }
39     }
40 }

 

результат операции:

5. Рекомендации по предметам

package com.ahu.learnmahout;

import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;

import java.io.File;
import java.util.List;

/**
 * Created by ahu_lichang on 2017/6/24.
 */
public class BaseItemRecommender {
    public static void main(String[] args) throws Exception {
        //准备数据 这里是电影评分数据
        File file = new File("E:\\ml-10M100K\\ratings.dat");
        //将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的
        DataModel dataModel = new GroupLensDataModel(file);
        //计算相似度,相似度算法有很多种,欧几里得、皮尔逊等等。
        ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel);
        //构建推荐器,协同过滤推荐有两种,分别是基于用户的和基于物品的,这里使用基于物品的协同过滤推荐
        GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
        //给用户ID等于5的用户推荐10个与2398相似的商品
        List<RecommendedItem> recommendedItemList = recommender.recommendedBecause(5, 2398, 10);
        //打印推荐的结果
        System.out.println("使用基于物品的协同过滤算法");
        System.out.println("根据用户5当前浏览的商品2398,推荐10个相似的商品");
        for (RecommendedItem recommendedItem : recommendedItemList) {
            System.out.println(recommendedItem);
        }
        long start = System.currentTimeMillis();
        recommendedItemList = recommender.recommendedBecause(5, 34, 10);
        //打印推荐的结果
        System.out.println("使用基于物品的协同过滤算法");
        System.out.println("根据用户5当前浏览的商品34,推荐10个相似的商品");
        for (RecommendedItem recommendedItem : recommendedItemList) {
            System.out.println(recommendedItem);
        }
        System.out.println(System.currentTimeMillis() -start);
    }
}

 

результат операции:

6. Оцените рекомендательную модель

package com.ahu.learnmahout;


import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;

import java.io.File;

/**
 * Created by ahu_lichang on 2017/6/24.
 */
public class MyEvaluator {
    public static void main(String[] args) throws Exception {
        //准备数据 这里是电影评分数据
        File file = new File("E:\\ml-10M100K\\ratings.dat");
        //将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的
        DataModel dataModel = new GroupLensDataModel(file);
        //推荐评估,使用均方根
        //RecommenderEvaluator evaluator = new RMSRecommenderEvaluator();
        //推荐评估,使用平均差值
        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
        RecommenderBuilder builder = new RecommenderBuilder() {

            public Recommender buildRecommender(DataModel dataModel) throws TasteException {
                UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
                UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, dataModel);
                return new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
            }
        };
        // 用70%的数据用作训练,剩下的30%用来测试
        double score = evaluator.evaluate(builder, null, dataModel, 0.7, 1.0);
        //最后得出的评估值越小,说明推荐结果越好
        System.out.println(score);
    }
}

 

7. Получите рекомендуемую точность и отзыв

package com.ahu.learnmahout;

import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.eval.IRStatistics;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.eval.GenericRecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.apache.mahout.cf.taste.similarity.precompute.example.GroupLensDataModel;

import java.io.File;

/**
 * Created by ahu_lichang on 2017/6/24.
 */
public class MyIRStatistics {
    public static void main(String[] args) throws Exception {
        //准备数据 这里是电影评分数据
        File file = new File("E:\\ml-10M100K\\ratings.dat");
        //将数据加载到内存中,GroupLensDataModel是针对开放电影评论数据的
        DataModel dataModel = new GroupLensDataModel(file);
        RecommenderIRStatsEvaluator statsEvaluator = new GenericRecommenderIRStatsEvaluator();
        RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
            public Recommender buildRecommender(DataModel model) throws TasteException {
                UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
                UserNeighborhood neighborhood = new NearestNUserNeighborhood(4, similarity, model);
                return new GenericUserBasedRecommender(model, neighborhood, similarity);
            }
        };
        // 计算推荐4个结果时的查准率和召回率
        //使用评估器,并设定评估期的参数
        //4表示"precision and recall at 4"即相当于推荐top4,然后在top-4的推荐上计算准确率和召回率
        IRStatistics stats = statsEvaluator.evaluate(recommenderBuilder, null, dataModel, null, 4, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
        System.out.println(stats.getPrecision());
        System.out.println(stats.getRecall());
    }
}

 

5. Mahout работает в кластере Hadoop

 1,Исполнение скрипта Hadoop

hadoop jar mahout-examples-0.9-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /sanbox/movie/10M.txt --output /sanbox/movie/r -s SIMILARITY_LOGLIKELIHOOD

Параметр Описание

  • --input(path) : каталог, в котором хранятся данные о предпочтениях пользователя, этот каталог может содержать один или несколько текстовых файлов, в которых хранятся данные о предпочтениях пользователя;
  • --output(path) : каталог вывода результатов расчетов
  • --numRecommendations (integer): Количество элементов, рекомендуемых для каждого пользователя, по умолчанию 10.
  • --usersFile (путь): указать путь к файлу, содержащему один или несколько сохраненных идентификаторов пользователей, и рекомендовать расчет только для идентификаторов пользователей, содержащихся во всех файлах по указанному пути (этот параметр является необязательным).
  • --itemsFile (путь): указать путь к файлу, содержащему один или несколько сохраненных идентификаторов элементов, и рекомендовать вычисление только для идентификаторов элементов, содержащихся во всех файлах в пути (этот параметр является необязательным).
  • --filterFile (путь): укажите путь, путь к файлу включает в себя значения [userID, itemID], itemID userID и разделенные запятыми. Результаты не будут рекомендовать элемент значения [userID, itemID] для пользователя (эта опция не является обязательной).
  • --booleanData (логическое значение): если входные данные не содержат значения предпочтения, установите для этого параметра значение true, по умолчанию — false.
  • --maxPrefsPerUser (целое число): максимальное количество данных о предпочтениях, используемых для каждого пользователя на заключительном этапе расчета результата рекомендации, по умолчанию — 10.
  • --minPrefsPerUser (целое число): при расчете сходства игнорировать всех пользователей с меньшим значением данных о предпочтениях, по умолчанию 1.
  • --maxSimilaritiesPerItem (integer): максимальное сходство для каждого элемента, по умолчанию 100.
  • --maxPerUserInItemSimilarity (целое число): на этапе расчета схожести элементов максимальное количество данных о предпочтениях, учитываемых для каждого пользователя, по умолчанию равно 1000.
  • --similarityClassname (имя класса) : Класс расчета сходства векторов
  • ProductsPOSORIMALILITYMATRIX: DiqueityMatrix Выходной каталог
  • --radomseed: Случайное начальное число — SequenceFileoutput: Выходной путь к файлу последовательности
  • --tempDir (путь): каталог, в котором хранятся временные файлы, по умолчанию это временный каталог в домашнем каталоге текущего пользователя.
  • --threshold (double): игнорировать пары элементов, чье сходство ниже этого порога

2,Результаты

После выполнения вышеуказанной команды в домашнем каталоге hdfs текущего пользователя будет создан временный каталог, который можно установить с помощью параметра --tempDir (путь).

 

Дополнения для последующего изучения:

Mahout - это распределенная структура машинного обучения на основе Hadoop и добыча данных. Mahout с Maprecuce для достижения некоторых алгоритмов добычи данных для решения проблемы параллельной добычи.

Сценарии применения Mahout:

 

Надеемся на единомышленников, общайтесь и обсуждайте вместе, если есть вопросы, можете комментировать, и мы вовремя ответим!