Điều này là để thử và trả lời phần "làm thế nào" của câu hỏi cho những người muốn thực hiện thực tế các đề xuất SVD thưa thớt hoặc kiểm tra mã nguồn để biết chi tiết. Bạn có thể sử dụng một phần mềm FOSS có sẵn để mô hình hóa SVD thưa thớt. Ví dụ, vowpal wabbit
, libFM
, hoặc redsvd
.
vowpal wabbit
có 3 triển khai thuật toán "giống như SVD" (mỗi thuật toán có thể chọn bằng một trong 3 tùy chọn dòng lệnh). Nói một cách chính xác những thứ này nên được gọi là "xấp xỉ, lặp, nhân tố ma trận" chứ không phải là "SVD" cổ điển thuần túy nhưng chúng có liên quan chặt chẽ với SVD. số không) ma trận.
Đây là một công thức đầy đủ, hoạt động để thực hiện các đề xuất phim theo phong cách Netflix với tùy chọn vowpal wabbit
"bậc hai xếp hạng thấp" ( --lrq
) có vẻ phù hợp nhất với tôi:
Tệp định dạng tập dữ liệu ratings.vw
(mỗi xếp hạng trên một dòng theo người dùng và phim):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Trong đó số thứ nhất là xếp hạng (1 đến 5 sao) theo sau là ID của người dùng đã xếp hạng và ID phim được xếp hạng.
Dữ liệu thử nghiệm có cùng định dạng nhưng có thể (tùy chọn) bỏ qua cột xếp hạng:
|user 1 |movie 234
|user 12 |movie 1019
...
tùy chọn vì để đánh giá / kiểm tra dự đoán, chúng tôi cần xếp hạng để so sánh dự đoán. Nếu chúng tôi bỏ qua xếp hạng, vowpal wabbit
vẫn sẽ dự đoán xếp hạng nhưng sẽ không thể ước tính lỗi dự đoán (giá trị dự đoán so với giá trị thực trong dữ liệu).
Để đào tạo, chúng tôi yêu cầu vowpal wabbit
tìm một tập hợp các N
yếu tố tương tác tiềm ẩn giữa người dùng và phim họ thích (hoặc không thích). Bạn có thể nghĩ về điều này khi tìm các chủ đề phổ biến trong đó những người dùng tương tự đánh giá một tập hợp con phim theo cách tương tự và sử dụng các chủ đề phổ biến này để dự đoán người dùng sẽ đánh giá phim như thế nào.
vw
tùy chọn và đối số chúng ta cần sử dụng:
--lrq <x><y><N>
tìm thấy các yếu tố tiềm ẩn "bậc hai thấp".
<x><y>
: "um" có nghĩa là vượt qua các không gian tên u [sers] và m [ovie] trong tập dữ liệu. Lưu ý rằng chỉ có chữ cái đầu tiên trong mỗi không gian tên được sử dụng với --lrq
tùy chọn.
<N>
: N=14
bên dưới là số lượng các yếu tố tiềm ẩn mà chúng tôi muốn tìm
-f model_filename
: viết mô hình cuối cùng vào model_filename
Vì vậy, một lệnh đào tạo đầy đủ đơn giản sẽ là:
vw --lrq um14 -d ratings.vw -f ratings.model
Khi chúng ta có ratings.model
tệp mô hình, chúng ta có thể sử dụng nó để dự đoán xếp hạng bổ sung trên tập dữ liệu mới more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Các dự đoán sẽ được ghi vào tập tin more_ratings.predicted
.
Sử dụng demo/movielens
trong vowpalwabbit
cây nguồn, tôi nhận được ~ 0,693 MAE (Lỗi tuyệt đối trung bình) sau khi đào tạo trên 1 triệu xếp hạng người dùng / phim ml-1m.ratings.train.vw
với 14 yếu tố tiềm ẩn (có nghĩa là ma trận giữa SVD là ma trận cột 14x14 hàng x) và thử nghiệm độc lập thiết lập thử nghiệm ml-1m.ratings.test.vw
. 0,69 MAE tốt như thế nào? Đối với phạm vi đầy đủ của các dự đoán có thể, bao gồm cả trường hợp chưa được đánh giá (0) [0 đến 5], sai số 0,69 là ~ 13,8% (0,69 / 5,0) của phạm vi đầy đủ, nghĩa là độ chính xác khoảng 86,2% (1 - 0,138).
Bạn có thể tìm thấy các ví dụ và bản demo đầy đủ cho một tập dữ liệu tương tự (Movielens) với tài liệu trong vowpal wabbit
cây nguồn trên github:
Ghi chú:
- Các
movielens
bản demo sử dụng một vài lựa chọn Tôi bỏ qua (vì đơn giản) từ ví dụ của tôi: đặc biệt --loss_function quantile
, --adaptive
và--invariant
- Việc
--lrq
thực hiện trong vw
nhanh hơn nhiều --rank
, đặc biệt là khi lưu trữ và tải các mô hình.
Tín dụng:
--rank
tùy chọn vw được thực hiện bởi Jake Hofman
--lrq
tùy chọn vw (với tùy chọn bỏ học) đã được Paul Minero triển khai
- vowpal wmus (aka vw) là đứa con tinh thần của John Langford