使用 Apache Spark 构建商品推荐引擎

21世纪技术官导读:构建商品推荐系统本质是协同过滤的问题,在Apache Spark中有一个内置算法来实现这一点。本文提纲挚领,欢迎各位开发参考。

如果机器学习能像推荐引擎这样的简单用例征服,那么开始使用机器学习可以像Hello World一样简单。

在Java中启动机器学习最流行的工具选择是Apache Spark,因为它带有一个特殊的ML库或模块,其中包含着许多简单到高级的算法。

产品推荐被业界公认为是一个协作过滤问题,Apache Spark有一个内置算法来实现它。

什么是协同过滤?

根据Apache Spark网站上的描述:

这些技术旨在补充用户项目关联矩阵的缺失条目。spark.mllib目前支持基于模型的协同过滤,其中用户和产品由一组可用于预测缺失条目的潜在因素来描述。spark.mllib使用交替最小二乘法(ALS)来学习这些潜在的因素。

spark.mllib之实现具有以下参数:

numBlocks是用于并行计算的块数(设置为-1以自动配置)。

排名是要使用的功能数量(也称为潜在因子数量)。

迭代是运行ALS的迭代次数。ALS通常在20次或更少的迭代中收敛到合理的解决方案。

lambda指定ALS中的正则化参数。

implicitPrefs指定是使用显式反馈ALS变体,还是适用于隐式反馈数据的变体。

alpha是一个适用于ALS的隐式反馈变量的参数,它支配偏好观察值的基线置信度。

开始Spark之旅

ApacheSpark mllib可以使用Maven对中央存储库的依赖。我们需要设置如下模块来启动它。

spark-core_2.11

$

spark-mllib_2.11

$

准备数据集

现在,在准备开发之前,我们需要构建有效的数据集。在本文的案例中,我们尝试建立一个基于销售订单历史的样本建立销售线索预测模型。

以下是两个数据集的样本记录。

销售订单:

销售线索记录:

我们的目标是根据过去的订单历史来预测或推荐相关的产品(商品)。

在上面的表格中,我们可以看到用户1和用户2都订购了产品1和产品2;另外,他们还各自单独订购了一件产品。

现在,我们预测用户对替代产品和一个新产品的兴趣。

技术实现

第一步

调入训练模型,然后使用JavaRDD API将其转换为评价模式。

JavaRDD salesOrdersFile = sc.textFile("target/classes/data/sales_orders.csv");

// Map file to Ratings(user, item, rating) tuples

JavaRDD ratings = salesOrdersFile.map(newFunction () {

publicRating call(Stringorder) {

Stringdata[] = order.split(",");

returnnewRating(Integer.parseInt(data[userIdIndex]),Integer.parseInt(data[productIdIndex]),Double.parseDouble(data[ratingIndex]));

}

});

第二步

下一步是使用ALS算法训练矩阵分解模型。

MatrixFactorizationModel model =ALS.train(JavaRDD.toRDD(ratings), rank, numIterations);

第三步

现在,我们加载销售主文件并转换为元组格式。

// file format - user, product

JavaRDD salesLeadsFile = sc.textFile("target/classes/data/sales_leads.csv");

// Create user-product tuples from leads

JavaRDD > userProducts = salesLeadsFile.map(newFunction > () {

publicTuple2 call(Stringlead) {

Stringdata[] = lead.split(",");

returnnewTuple2 (Integer.parseInt(data[userIdIndex]),Integer.parseInt(data[productIdIndex]));

}

});

第四步

最后,我们可以用一个简单的API来预测未来的等级。

// Predict the ratings of the products not rated by user

JavaRDD recomondations = model.predict(userProducts.rdd()).toJavaRDD().distinct();

第五步

可以使用基本流水线操作对数据输出进行排序:

// Sort the recommendations by rating in descending order

recomondations = recomondations.sortBy(newFunction () {

@Override

publicDoublecall(Rating v1)throwsException {

returnv1.rating();

}

},false,1);

第六步

现在,你可以使用基础JavaRDD API来显示最终结果。

// Print the recommendations .

recomondations.foreach(newVoidFunction () {

@Override

publicvoidcall(Rating rating)throwsException {

Stringstr ="User : "+ rating.user() +// " Product : " + rating.product() + // " Rating : " + rating.rating();

}

});

输出结果如下:

结论

以上Spark输出的建议为:User 2想买Product 3,而User 1会购买Product 4。也就是说不建议我们推荐新产品,因为它们不符合过去任何相似性的标准。

学习愉快!

作者:Avni Malhotra

编译:雪青

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180306G1NBN000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券