5

Tôi đang sử dụng Spark để tạo mẫu thử nghiệm hệ thống đề xuất. Sau khi thực hiện một số hướng dẫn, tôi đã có thể đào tạo một số MatrixFactorizationModel từ dữ liệu của mình.Spark - Cách sử dụng mô hình recommender được đào tạo trong sản xuất?

Tuy nhiên, mô hình được đào tạo bởi Spark mllib chỉ là Serializable. Làm cách nào để sử dụng mô hình này để thực hiện đề xuất cho người dùng thực? Tôi có nghĩa là, làm thế nào tôi có thể tiếp tục mô hình vào một số loại cơ sở dữ liệu hoặc cập nhật nó nếu dữ liệu người dùng đã được tăng lên?

Ví dụ: mô hình được đào tạo bởi thư viện đề xuất Mahout có thể được lưu trữ vào cơ sở dữ liệu như Redis, sau đó chúng tôi có thể truy vấn danh sách mục được đề xuất sau. Nhưng làm thế nào chúng ta có thể làm những thứ tương tự trong Spark? Bất kì lời đề nghị nào?

Trả lời

8

Đầu tiên, "mô hình" mà bạn đang đề cập đến từ Mahout không phải là mô hình, mà là danh sách các đề xuất được tính toán trước. Bạn cũng có thể làm điều này với Spark, và tính toán trong các đề xuất hàng loạt cho người dùng và duy trì chúng ở bất cứ đâu bạn thích. Điều này không liên quan gì đến việc tuần tự hóa một mô hình. Nếu bạn không muốn thực hiện cập nhật hoặc ghi điểm trong thời gian thực, bạn có thể dừng ở đó và chỉ sử dụng Spark cho hàng loạt giống như bạn làm Mahout.

Nhưng tôi đồng ý rằng trong nhiều trường hợp bạn muốn gửi mô hình đến một nơi khác và phục vụ. Như bạn thấy, các mô hình khác trong Spark là Serializable, nhưng không phải là MatrixFactorizationModel. (Có, mặc dù nó được đánh dấu như vậy, nó sẽ không tuần tự hóa.) Tương tự, có một serialization tiêu chuẩn cho các mô hình dự đoán được gọi là PMML nhưng nó không chứa từ vựng cho một mô hình ma trận.

Lý do thực sự giống nhau. Trong khi nhiều mô hình dự đoán, như mô hình hồi quy SVM hoặc logistic, chỉ là một tập hợp các hệ số nhỏ, một mô hình ma trận nhân tố là rất lớn, chứa hai ma trận với hàng tỷ nguyên tố tiềm tàng. Đó là lý do tại sao tôi nghĩ PMML không có bất kỳ mã hóa hợp lý nào cho nó.

Tương tự như vậy, trong Spark, điều đó có nghĩa là các ma trận thực tế là RDD s không thể được tuần tự trực tiếp. Bạn có thể duy trì các RDD này để lưu trữ, đọc lại chúng ở nơi khác bằng cách sử dụng Spark, và tạo lại một MatrixFactorizationModel bằng tay theo cách đó.

Bạn không thể phân phối hoặc cập nhật mô hình bằng cách sử dụng Spark. Đối với điều này bạn đang thực sự nhìn vào viết một số mã để thực hiện cập nhật và tính toán các khuyến nghị trên bay.

Tôi không ngại khi đề xuất ở đây dự án Oryx, vì điểm của nó là quản lý chính xác khía cạnh này, đặc biệt cho đề xuất ALS. Trên thực tế, dự án Oryx 2 dựa trên Spark và mặc dù trong alpha, đã chứa đường dẫn hoàn chỉnh để tuần tự hóa và phục vụ đầu ra của MatrixFactorizationModel. Tôi không biết nếu nó đáp ứng nhu cầu của bạn, nhưng có thể ít nhất là một điểm tham chiếu thú vị.

+0

Cảm ơn lời giải thích tuyệt vời và chi tiết của bạn! Tôi sẽ thử Oryx :) – shihpeng

2

Một phương pháp khác để tạo recs với Spark là phương pháp công cụ tìm kiếm. Đây là cơ bản một người giới thiệu cooccurrence phục vụ bởi Solr hoặc Elasticsearch. So sánh các yếu tố để cooccurrence là vượt ra ngoài câu hỏi này vì vậy tôi sẽ chỉ mô tả sau này.

Bạn tương tác nguồn cấp dữ liệu (id người dùng, mục-id) vào số spark-itemsimilarity của Mahout. Điều này tạo ra một danh sách các mục tương tự cho mỗi mục được thấy trong dữ liệu tương tác. Nó sẽ xuất hiện theo mặc định dưới dạng csv và do đó có thể được lưu trữ ở mọi nơi. Nhưng nó cần phải được lập chỉ mục bởi một công cụ tìm kiếm.

Trong mọi trường hợp khi bạn muốn tìm nạp lại, bạn sử dụng lịch sử của người dùng làm truy vấn, bạn lấy lại danh sách các mục được sắp xếp dưới dạng recs.

Một lợi ích của phương pháp này là các chỉ số có thể được tính cho nhiều hành động của người dùng tùy thích. Bất kỳ hành động nào mà người dùng thực hiện tương quan với những gì bạn muốn đề xuất đều có thể được sử dụng. Ví dụ: nếu bạn muốn giới thiệu giao dịch mua nhưng bạn cũng có thể ghi lại lượt xem sản phẩm. Nếu bạn xem xét sản phẩm giống như mua hàng, bạn có thể sẽ nhận được số lần truy cập tồi tệ hơn (tôi đã thử). Tuy nhiên, nếu bạn tính toán chỉ số cho các giao dịch mua và một chỉ số khác (thực tế là cross-cooccurrence) cho các lượt xem sản phẩm thì chúng đều có thể dự đoán trước về các giao dịch mua. Điều này có tác dụng tăng dữ liệu được sử dụng cho recs. Cùng một loại điều có thể được thực hiện với các vị trí người dùng để pha trộn thông tin vị trí vào recs mua hàng.

Bạn cũng có thể thiên vị số lần truy cập của mình dựa trên ngữ cảnh. Nếu bạn đang ở trong "điện tử" phần của một cửa hàng, bạn có thể muốn recs được skewed đối với thiết bị điện tử. Thêm thiết bị điện tử vào truy vấn đối với trường siêu dữ liệu "danh mục" của mục và cung cấp cho nó một sự gia tăng trong truy vấn và bạn có recs thiên vị.

Vì tất cả các xu hướng và pha trộn các chỉ số xảy ra trong truy vấn, nó làm cho công cụ recs dễ dàng điều chỉnh theo nhiều ngữ cảnh trong khi vẫn duy trì một truy vấn nhiều trường được thực hiện thông qua công cụ tìm kiếm. Chúng tôi nhận được khả năng mở rộng từ Solr hoặc Elasticsearch. Một trong những lợi ích khác của việc sử dụng hệ số hoặc phương pháp tìm kiếm là người dùng hoàn toàn mới và lịch sử mới có thể được sử dụng để tạo recs trong đó người giới thiệu Mahout cũ hơn chỉ có thể giới thiệu cho người dùng và tương tác khi công việc được chạy.

mô tả ở đây:

0

Bạn có thể sử dụng lệnh .save chức năng (sparkContext, outputFolder) để lưu mô hình vào thư mục bạn chọn. Trong khi đưa ra các khuyến nghị trong thời gian thực, bạn chỉ cần sử dụng chức năng MatrixFactorizationModel.load (sparkContext, modelFolder) để tải nó dưới dạng đối tượng MatrixFactorizationModel.

Một câu hỏi để @Sean Owen: Chẳng phải MatrixFactorizationObject chứa các ma trận nhân tử: sử dụng tính năng và ma trận mục-tính năng thay vì khuyến nghị/dự đoán xếp hạng.

Các vấn đề liên quan