Từng bước xây dựng Recommender Systems với R

Humor recommender

Humor recommender

Mỗi người chúng ta là duy nhất! Bạn là duy nhất! Có rất nhiều người khác bạn. Nhưng cùng một lúc, cũng có rất nhiều người giống như bạn … có những hành vi tương tự, tương tác với cùng người, có cùng sở thích với bạn.

Cho dù bạn có thích hay không, điều này làm cho chúng ta dễ đoán và trở nên nhàm chán… Nhưng nó cũng không hẳn là một điều xấu… Bạn đã từng trải nghiệm những lợi ích từ collective intelligence, được nhúng vào rất nhiều ứng dụng mà chúng ta sử dụng hàng ngày. Những ứng dụng như Facebook, Twitter hoặc Linkedin đưa ra danh sách những người mà bạn quen biết để mở rộng Social Media Network của bạn, hoặc Amazon gợi ý cho bạn danh sách các sản phẩm khác sau khi bạn mua một sản phẩm cụ thể nào đó, hoặc Last.fm, Spotify & Co. gợi ý các bài hát phù hợp với thị hiếu âm nhạc của mình…

Tất cả các ứng dụng này có một điểm chung đó là sử dụng kỹ thuật recommendation để lọc ra những nội dung phù hợp nhất cho một user cụ thể. Trong bài viết này, ta sẽ từng bước xây dựng hệ thống recommendation engine với R.

Các vấn đề cơ bản

Phân loại recommender systems

Có 2 hướng tiếp cận cơ bản để xây dựng recommender systems. Giả sử bạn muốn gợi ý danh sách các sản phẩm liên quan khi khách hàng thanh toán sản phẩm X:

  • Ta có thể tìm ra những điểm hấp dẫn trong sản phẩm X để gợi ý danh sách các sản phẩm có cùng đặc điểm hấp dẫn này. Phương pháp này gọi là Content based recommender systems.
Content based recommender systems

Content based recommender systems

  • Ta lọc ra tất cả user đã mua sản phẩm X, và đưa ra danh sách các sản phẩm cũng được mua bởi những user này. Trong danh sách này, ta chọn ra các sản phẩm có tần suất lặp lại nhiều nhất. Phương pháp này gọi là Collaborative filtering recommender systems.
Collaborative filtering recommender systems

Collaborative filtering recommender systems

Ví dụ, tôi rất thích bộ phim “The Mission” và đã cho điểm rating rất cao… Hệ thống đầu tiên mô hình hóa bộ phim này như sau:

{actors: ["Robert De Niro", "Jeremy Irons"], director: "Roland Joffé", topics:["18th century","Spanish colonization","Christian Evangelization"]}.

Dựa trên thông tin này, những bộ phim do các diễn viên Robert De Niro, Jeremy Irons thủ vai hay do đạo diễn Roland Joffé thực hiện sẽ được gợi ý cho tôi.

Hệ thống thứ hai như hệ thống imdb đang triển khai sẽ duyệt CSDL những user cũng rating cao cho bộ phim “The Mission” và lọc ra những bộ phim khác cũng được đánh giá bởi những user này.

Trong bài viết này, ta sẽ xây dựng Collaborative Filtering Recommender System. Mặc dù còn nhiều vấn đề liên quan đến cold start problem, hệ thống này đang được áp dụng một cách rộng rãi và cho ra kết quả tốt. Ngoài ra, ta có thể triển khai hybrid recommender systems là hệ thống lai kết hợp cả hai hướng tiếp cận trên để khắc phục những khuyết điểm của cả hai hệ thống.

Những tác vụ recommender system cần giải quyết

Từ góc nhìn của một user cụ thể -tạm thời gọi là active user-, recommender system phải giải quyết 2 tác vụ sau:

  1. Dự đoán điểm rating cho một item mà user chưa đánh giá.
  2. Gợi ý danh sách top N item.

Đánh giá hô hình

Hiểu được Recommender System hoạt động như thế nào khi thực hiện các tác vụ trên là điều quan trọng khi ứng dụng nó vào môi trường thực tế.

MAE = \frac{1}{|K|}\sum_{(i, j)\in K} |r_{ij} - \hat{r_{ij}}|

RMSE = \sqrt{\frac{\sum_{(i, j)\in K} (r_{ij} - \hat{r_{ij}})^2}{K}}

Hiệu suất của tác vụ dự đoán được đo bằng độ sai biệt giữa giá trị dự đoán so với giá trị thực tế. Hai độ đo thường được dùng là Mean Average Error (MAE) và Root Mean Square Error (RMAE).

Trong công thức trên, K thể hiện tập dữ liệu gồm tất cả các cặp dữ liệu user-item (i, j), giá trị dự đoán (predicted rating) \hat{r_{ij}} và giá trị thực tế r_{ij} (known rating). Ý tưởng cơ bản của độ đo này là tính độ sai biệt giữa điểm rating dự đoán so với điểm rating thực tế của các user so với các item.

Xây dựng Recommender System với R

Tổng quan

Một trong những ứng dụng nổi bật của Recommender System là tối ưu hóa tỷ lệ chuyển đổi (conversion rate optimization): khách hàng tìm thấy sản phẩm có liên quan nhanh hơn, từ đó các mặt hàng mua kèm (cross-selling) nhiều hơn, hình ảnh thương hiệu được cải thiện, tích cực tác động đến lòng trung thành của khách hàng. Đó là lý do tại sao chúng ta tập trung vào use case này.

Ta sẽ không xây dựng mọi thứ từ đầu mà sẽ dùng một vài gói phần mềm được cài đặt sẵn collaborative filtering engines của R như recommenderlab.

1 – Thu thập dữ liệu

Đôi khi việc phát hiện ra mối quan hệ giữa user và item không phải là việc dễ dàng như CSDL đã có điểm rating. Tuy nhiên, có vô số các chỉ số ta có thể sử dụng để mô hình hóa mối quan hệ này.

Chỉ số dữ liệu click chuột (clickstream data). Bạn có thể đo lường các thông số như trang web được truy cập, các item được clicked, trang web so sánh các item, những item có trong quá trình thanh toán… Thậm chí bạn còn có thể kết hợp nó với các chỉ số on-page như thời gian trung bình trên một trang (plugin riveted time spent cho Google Analytics) hoặc quá trình di chuyển chuột (ClickTale, Mouseflow).

Kết quả là, bạn có rất nhiều session với rất nhiều event cho một user đối với một item. Một cách tiếp cận đó là tính mối User-Item Affinity trên mỗi session.

Affinity(u_i, it_j, s_k) = \frac{1}{daysAgo(s_k)} * \sum\limits_{j = 0}^n w_j, f_j

Tổng hợp tất cả các session mà user tương tác với item.

Affinity(u_i, it_j) = \sum\limits_{l = 0}^k Affinity(u_i, it_j, s_l)

2 – Chuẩn hóa dữ liệu

Data normalization

Data normalization

Ta chuẩn hóa dữ liệu bằng đoạn mã dưới đây:

library("recommenderlab")
# Loading to pre-computed affinity data
affinity.data <- read.csv("collected_data.csv")
affinity.matrix

3 – Collaborative Model

Ta sẽ tạo một mô hình được gọi là UBCF – U(ser) B(ased) C(ollaborative) F(iltering) với tập dữ liệu là 5000 user. Ngoài ra, chúng ta có thể sử dụng phương pháp tiêu tốn ít bộ nhớ hơn mà không cần tải toàn bộ dữ liệu user vào bộ nhớ gọi là IBCF – I(ser) B(ased) C(ollaborative) F(iltering), đơn giản thay đổi tham số trong mã lệnh dưới đây:

# Creation of the model - U(ser) B(ased) C(ollaborative) F(iltering)
Rec.model <- Recommender(affinity.matrix[1:5000], method = "UBCF")

Mô hình này sử dụng cosine similarity để tính độ tương tự giữa các user:

crossprod(a,b)/sqrt(crossprod(a)*crossprod(b))

Có nhiều cách khác để tính độ tương tự giữa các user như chỉ số của Jaccard hay Pearson.

Rec.model=Recommender(affinity.data[1:400],method="UBCF", param=list(normalize = "Z-score",method="Cosine",nn=5, minRating=1))

4 – Chạy mô hình – lọc ra top N item

Bây giờ chúng ta có thể chạy thử mô hình của mình. Ví dụ, ta muốn lấy ra top các item gợi ý cho user “u15348”.

# recommended top 5 items for user u15348
recommended.items.u15348 # to display them
as(recommended.items.u15348, list)
# to obtain the top 3
recommended.items.u15348.top3 # to display them
as(recommended.items.u15348.top3, list)

Cũng với user “u15348”, ta quan sát kết quả dự đoán giá trị affinity trên từng item:

# Predict list of product which can be recommended to given users
# to predict affinity to all non-rated items
predicted.affinity.u15348 # to see the user u15348's predicted affinity for items we didn't have any value for
as(predicted.affinity.u15348, list)
# .. and the real affinity for the items obtained from the affinity.matrix
as(affinity.matrix[u15348,], list)

5- Đánh giá mô hình

Để đánh giá Rec.model chúng ta cần có dữ liệu test. Hiện tại ta chỉ có affinity.data, vì vậy ta cần phân chia thành dữ liệu train và test. Kỹ thuật này được gọi là “split”.

# create evaluation scheme splitting taking 90% of the date for training and leaving 10% for validation or test
e # creation of recommender model based on ubcf
Rec.ubcf # creation of recommender model based on ibcf for comparison
Rec.ibcf # making predictions on the test data set
p.ubcf # making predictions on the test data set
p.ibcf # obtaining the error metrics for both approaches and comparing them
error.ubcf <-calcPredictionAccuracy(p.ubcf, getData(e, "unknown"))
error.ibcf <-calcPredictionAccuracy(p.ibcf, getData(e, "unknown"))
error rownames(error) error

Có những kỹ thuật đánh giá khác nhìn từ góc độ information retrieval. Những kỹ thuật này liên quan đến việc tạo ra confusion matrix để tính precisionrecall metrics.

Kết luận

Khi triển khai mô hình ta cần lưu ý thêm các điểm sau:

  • Bạn cần đặt mô hình này tại vị trí hợp lý để hiển thị các gợi ý trên trang eCommerce của mình.
  • Cần bổ sung thêm một số luật để chọn ra được top N item phù hợp hơn với từng user.
  • Không cho hiển thị những sản phẩm đã được mua trong danh sách gợi ý.
  • Cần một kế hoạch cập nhật lại mô hình thông qua tập dữ liệu mới sinh ra hàng ngày.
  • Nếu tập dữ liệu quá lớn lên đến vài trăm GB, ta có thể chuyển qua sử dụng Mahout, đây là công cụ hữu ích để triển khai các tính toán trên Big Data, Mahout cũng cài đặt sẵn những hàm liên quan đến collaborative filtering algorithms

Nguồn: http://bigdata-doctor.com/recommender-systems-101-practical-example-in-r/

Advertisements

12 thoughts on “Từng bước xây dựng Recommender Systems với R

  1. Mình đang nghiên cứu hệ thống gợi ý lai (hybrid recommender system) để làm luận văn, nhưng qua tìm hiểu nhiều tài liệu do nó là công nghệ mới có ít tài liệu về hệ thống gợi ý lai. Khó khăn về việc nghiên cứu, nhờ bạn có thể giải đáp thác mắc cho mình được không?
    Ví dụ như: cách xây dựng, mô hình, áp dụng những kỹ thuật nào?
    Cám ơn.

    Số lượt thích

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s