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

图片

 

若是机器学习能像推荐引擎这样的简单用例征服,那么开始使用机器学习能够像Hello World同样简单。算法

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

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

什么是过滤机器学习


根据
Apache Spark网站 上的描述ide

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

spark.mllib之实现具备如下参数:学习

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

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

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

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

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

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


开始Spark之旅


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

<dependency>


<groupId>org.apache.spark</groupId>


<artifactId>spark-core_2.11</artifactId>


<version>${spark.version}</version>


</dependency>


<dependency>


<groupId>org.apache.spark</groupId>


<artifactId>spark-mllib_2.11</artifactId>


<version>${spark.version}</version>


</dependency>


数据集

 

如今,在准备开发以前,咱们须要构建有效的数据集。在本文的案例中,咱们尝试创建一个基于销售订单历史的样本创建销售线索预测模型。

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

销售订单:

产品编

产品名

购买

数量

1

User 1

1

产品1

10

5

50

1

User 1

2

产品2

20

10

200

1

User 1

3

产品3

10

15

150

2

User 2

1

产品1

10

5

50

2

User 2

2

产品2

20

20

400

2

User 2

4

产品4

10

15

150


销售线索记录:

户编号

产品编

产品名

1

User 1

4

Product 4

1

User 1

5

Product 5

2

User 2

3

Product 3

2

User 2

6

Product 6


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

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

如今,咱们预测用户对替代产品和一个新产品的兴趣。

 

技术实现

 

第一步


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

 

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

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

JavaRDD < Rating > ratings = salesOrdersFile.map(new Function < String, Rating > () {

public Rating call(String order) {

  String data[] = 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 < String > salesLeadsFile = sc.textFile("target/classes/data/sales_leads.csv");

// Create user-product tuples from leads

JavaRDD < Tuple2 < ObjectObject >> userProducts = salesLeadsFile.map(newFunction < String, Tuple2 < ObjectObject>> () {

 public Tuple2 < ObjectObject > call(String lead) {

  String data[] = lead.split(",");

  returnnew Tuple2 < ObjectObject > (Integer.parseInt(data[userIdIndex]),Integer.parseInt(data[productIdIndex]));

 }

});

 

第四步

 

最后,咱们能够用一个简单的API来预测将来的等级。

 

// Predict the ratings of the products not rated by user
JavaRDD<Rating> recomondations = model.predict(userProducts.rdd()).toJavaRDD().distinct();

 

第五步

 

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

 

// Sort the recommendations by rating in descending order
recomondations = recomondations.sortBy(new Function < Rating, Double > () {
@Override
publicDouble call(Rating v1) throws Exception {
  return v1.rating();
 }
}, false, 1);

 

第六步

 

如今,你可使用基础JavaRDD API来显示最终结果。

 

// Print the recommendations .
recomondations.foreach(new VoidFunction < Rating > () {
@Override
publicvoid call(Rating rating) throws Exception {
  String str = "User : " + rating.user() + // " Product : " + rating.product() + // " Rating : " + rating.rating();
   System.out.println(str);
 }
});

 

输出结果以下:

 

User : 2 Product : 3 Rating : 54.54927015541634
User : 1 Product : 4 Rating : 49.93948224984236

 

结论

 

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


学习愉快!

相关文章
相关标签/搜索