$30 off During Our Annual Pro Sale. View Details »

Recommendation.jl: Building Recommender Systems in Julia

Recommendation.jl: Building Recommender Systems in Julia

Takuya Kitazawa

July 23, 2019
Tweet

More Decks by Takuya Kitazawa

Other Decks in Programming

Transcript

  1. Recommenda)on.jl
    Building Recommender Systems in Julia
    Takuya Kitazawa

    View Slide

  2. julia> using Pkg; Pkg.add(“Recommendation”)
    github.com/takuti/Recommendation.jl

    View Slide

  3. mutable struct Event
    user::Int
    item::Int
    value::Float64
    end
    item
    user
    value
    Explicit: Ra)ng feedback
    Implicit: Unary feedback

    View Slide

  4. • User-item matrix:
    • Series of events for more users/items:
    Data := User-Item Interac)ons
    using Recommendation
    using SparseArrays
    data = DataAccessor(sparse([1 0 0; 4 5 0]))
    n_user, n_item = 5, 10
    events = [Event(1, 2, 1.0), Event(3, 2, 1.0), Event(2, 6, 4.0)]
    data = DataAccessor(events, n_user, n_item)
    Explicit
    ra)ngs

    View Slide

  5. recommender = MostPopular(data)
    build!(recommender)
    recommend(recommender, 4, 2, collect(1:n_item))
    # for user#4, pick top-2 from all items
    Common interfaces
    Recommenda5on algorithm
    data

    View Slide

  6. • Coun)ng frequency of…
    Most frequently co-observed items with i_ref
    Most frequently observed items
    • Weigh)ng items by…
    % of observed values that are greater than th
    Mean of observed values across all users
    Mean of observed values across all items
    Quick math… Non-Personalized Baseline Recommender
    CoOccurrence(data, i_ref)
    MostPopular(data)
    ThresholdPercentage(data, th)
    UserMean(data)
    ItemMean(data)

    View Slide

  7. Bit more… Collabora)ve Filtering (CF)
    UserKNN(data, k)
    ItemKNN(data, k)

    View Slide

  8. And more! SVD & Matrix Factoriza)on (MF)
    SVD(data, k)
    recommender = MF(data, k)
    build!(recommender, learning_rate=1e-3, max_iter=100)

    View Slide

  9. Evalua)on
    recall = cross_validation(
    5, # N-fold
    Recall, # Metric
    5, # Top-k recommendation
    MostPopular, # Recommender
    data, # Data Accessor
    args… # Hyperparameters
    )
    Ra5ng metric:
    - MAE
    - RMSE
    Ranking metric:
    - AUC
    - Mean Average Precision
    - Mean Percen)le Rank
    - NDCG
    - Precision
    - Recall
    - Reciprocal Rank

    View Slide

  10. Recommender Systems + Julia =
    • Vector/matrix-friendly syntax
    • High simplicity and modularity
    • Efficient numerical compu)ng, especially for matrices
    • Good ecosystem surrounding mathema)cal tools
    - Recommender system is not only about ML

    View Slide

  11. Recommender Systems + Julia = …
    • Integra)on with real-world applica)ons
    - Con)nuously observed new events
    - Scheduled model update and recommenda)on
    - Can be real-)me
    - Scalability

    View Slide

  12. Keep minimal under…
    But make customizable

    View Slide

  13. using LinearAlgebra
    using LowRankApprox
    struct PartialQR <: Recommender
    data::DataAccessor
    rank::Int
    Q::AbstractMatrix
    R::AbstractMatrix
    p::AbstractVector
    function PartialQR(data::DataAccessor, rank::Int)
    n_user, n_item = size(data.R)
    Q = matrix(n_user, rank)
    R = matrix(rank, n_item)
    p = vector(n_item, Int)
    new(data, rank, Q, R, p)
    end
    end
    JuliaMatrices/LowRankApprox.jl
    (Hyper-)Parameters

    View Slide

  14. isbuilt(recommender::PartialQR) = isfilled(recommender.Q)
    function build!(recommender::PartialQR)
    # NaNs are filled by zeros for now
    R = copy(recommender.data.R)
    R[isnan.(R)] .= 0
    F = pqrfact(R, rank=recommender.rank)
    recommender.Q[:] = F.Q[:]
    recommender.R[:] = F.R[:]
    recommender.p[:] = F.p[:]
    end
    function Recommendation.predict(recommender::PartialQR, u::Int, i::Int)
    check_build_status(recommender)
    dot(recommender.Q[u, :], recommender.R[:, recommender.p][:, i])
    end
    Low rank approxima)on

    View Slide

  15. julia> using Pkg; Pkg.add(“Recommendation”)
    github.com/takuti/Recommendation.jl

    View Slide