Share
Embed
Criando sistemas de recomendação com Python
Palestra dada no The Developer's conference
Jose Fernando
June 07, 2021
Transcript
49 slides
-
Globalcode – Open4education Trilha – Python Criando sistemas de recomendação
com Python José Fernando Tavares Booknando Livros -
Globalcode – Open4education JFTavares [email protected] booknando.com.br • Formação humanista (filosofia
e Teologia) • Especialista em livros digitais • Consultor de acessibilidade • Cursando mestrado Ciência da Computação • Cursando MBA em tecnologia para negócios • Apaixonado por Python JOSÉ FERNANDO TAVARES -
Globalcode – Open4education Modelos tradicionais SISTEMAS NÃO PERSONALIZADOS • Listas
de mais vendidos • Listas de melhor avaliados • Listas de lançamentos • etc… -
Globalcode – Open4education BASEADOS EM CONTEÚDO FILTRAGEM COLABORATIVA Lido pelo
usuário Itens semelhantes Recomendado para o usuário Usuários semelhantes Lido por ela Recomendando para ele -
Globalcode – Open4education © Copyright 2015, Nicolas Hug. Comunidade ativa
no Github Licença BSD 3-Clause Surprise é um add-on SciPy para construir e analizar sistemas de recomendação baseados em filtragem colaborativa Scikit Surprise -
Globalcode – Open4education Excelente para uso acadêmico ou em âmbitos
de estudos dos algoritmos -
Globalcode – Open4education Fácil de Usar from __future__ import (absolute_import,
division, print_function, unicode_literals) from surprise import SVD from surprise import Dataset from surprise import accuracy from surprise.model_selection import train_test_split data = Dataset.load_builtin('ml-1m') trainset, testset = train_test_split(data, test_size=.15) algoritmo = SVD(n_epochs=20) algoritmo.fit(trainset) uid = str(103) iid = str(1499) pred = algoritmo.predict(uid, iid, r_ui=1, verbose=True) test_pred = algoritmo.test(testset) print("Avaliação RMSE: ") accuracy.rmse(test_pred, verbose=True) print("Avaliação MAE: ") accuracy.mae(test_pred, verbose=True) -
Globalcode – Open4education Matrix factorization-based SVD SVD++ NMF Neighborhood methods
(KNN) KNNBasic KNNWithMeans KNNWithZScore SlopeOne Co-Clustering -
Globalcode – Open4education Possui base de dados já implementado (MovieLens,
Jester) Muito simples adicionar ou usar outra entrada de dados Não possui ferramentas para preparar os dados de entrada Flexibilidade dos dados de entrada -
Globalcode – Open4education Possui um módulo que facilita a criação
de novos algoritmos -
Globalcode – Open4education Excelente Documentação O suporte é dado apenas
pela documentação e pela página do GitHub -
Globalcode – Open4education Não possui ferramenta específica para lidar com
grande quantidade de dados. -
Globalcode – Open4education Movie Lens 1M 6.040 usuários 3.706 filmes
1.000.209 avaliações -
Globalcode – Open4education Movielens 1M RMSE MAE Time SVD++ 0,862
0,672 6:12:38 SVD 0,874 0,686 0:05:28 k-NN Baseline 0,895 0,706 0:16:39 Slope One 0,907 0,715 0:08:23 Co-Clustering 0,916 0,718 0:01:59 Baseline 0,909 0,719 0:00:38 NMF 0,917 0,725 0:05:31 k-NN 0,923 0,727 0:15:11 k-NN With Means 0,929 0,738 0:16:02 Random 1.506 1.207 0:00:36 -
Globalcode – Open4education Rating Alto: ID 49, idade entre 18
e 24 anos, programador e mora em Huston no Texas (USA). Ele deu um rating alto (4) para o filme The Negotiator (1998), um filme de ação Ação e Thriller Rating Baixo: ID 103 idade entre 45 e 49 anos um executivo/manager com que mora em San Diego. Ele avaliou com um rating baixo (1) o filme Anaconda (1997), um filme de ação/aventura/Thriller -
Globalcode – Open4education from __future__ import (absolute_import, division, print_function, unicode_literals)
from surprise import KNNBasic from surprise import Dataset from surprise import accuracy from surprise.model_selection import train_test_split # Load the movielens-100k dataset UserID::MovieID::Rating::Timestamp data = Dataset.load_builtin('ml-1m') trainset, testset = train_test_split(data, test_size=.5) -
Globalcode – Open4education algoritmo = KNNBasic(k=50, sim_options={'name': 'pearson', 'user_based': True,
'verbose' : True}) algoritmo.fit(trainset) uid = str(49) iid = str(2058) pred = algoritmo.predict(uid, iid, r_ui=4, verbose=True) -
Globalcode – Open4education # run the trained model against the
testset test_pred = algoritmo.test(testset) # Avalia RMSE print("Avaliação RMSE: ") accuracy.rmse(test_pred, verbose=True) # Avalia MAE print("Avaliação MAE: ") accuracy.mae(test_pred, verbose=True) -
Globalcode – Open4education Predição de avaliação: user: 49 item: 2058
r_ui = 4.00 est = 3.55 -
Globalcode – Open4education User Item r_ui est Epochs Test RMSE
MAE 49 2058 4 3,52 20 0,15 0,8583 0,6693 49 2058 4 3,68 5 0,15 0,8854 0,6974 49 2058 4 3,62 5 0,15 0,888 0,7002 Para Rating ALTO: SVD++ -
Globalcode – Open4education SVD++ Para Rating Baixo: User Item r_ui
est Epochs Test RMSE MAE 103 1499 1 2,62 20 0,15 0,8583 0,6693 103 1499 1 3,06 5 0,15 0,867 0,6806 103 1499 1 3,08 5 0,15 0,8878 0,7 -
Globalcode – Open4education KNNWithMeans Para Rating alto: Use r Item
r_ui est actual_k Test Av.RMSE Av.MAE 49 2058 4 3,76 40 0,15 0,9132 0,7184 49 2058 4 3,66 40 0,15 0,9159 0,7208 49 2058 4 3,77 30 0,15 0,9215 0,7263 49 2058 4 3,9 30 0,15 0,9237 0,728 49 2058 4 3,9 10 0,15 0,957 0,7548 49 2058 4 3,69 10 0,15 0,9575 0,7549 49 2058 4 3,39 10 0,15 0,9578 0,7563 -
Globalcode – Open4education KNNWithMeans Para Rating Baixo: User Item r_ui
est actual _k Test Av.RMS E Av.MAE 103 1499 1 1,63 10 0,15 0,9592 0,7564 103 1499 1 1,27 10 0,15 0,9587 0,7564 103 1499 1 1,84 10 0,15 0,959 0,757 -
Globalcode – Open4education KNNWithMeans X SVDpp para Rating Baixo: estimativa
próxima MAE ALTO estimativa distante MAE BAIXO SVDpp 103 1499 1 2,62 20 0,15 0,8583 0,6693 KNNWithMeans 103 1499 1 1,27 10 0,15 0,9587 0,7564 -
Globalcode – Open4education SVD User Item r_ui est Epochs Test
Av.RMS E Av.MAE 49 2058 4 3,48 10 0,15 0,8874 0,7003 49 2058 4 3,72 10 0,15 0,8874 0,7015 49 2058 4 3,53 10 0,15 0,8883 0,7017 49 2058 4 3,6 5 0,15 0,9115 0,7233 49 2058 4 3,56 5 0,15 0,9128 0,7237 49 2058 4 3,49 5 0,15 0,9145 0,7246 Para Rating alto: -
Globalcode – Open4education SlopOne: User Item r_ui est Test Av.RMSE
Av.MAE 49 2058 4 3,54 0,15 0,9029 0,7126 49 2058 4 3,48 0,15 0,9064 0,7146 49 2058 4 3,55 0,15 0,9079 0,716 Para Rating alto: -
Globalcode – Open4education 103 1499 1 3,09 0,15 0,9047 0,7128
103 1499 1 2,99 0,15 0,906 0,7146 103 1499 1 3,01 0,15 0,9049 0,7131 Para Rating Baixo: SlopOne: -
Globalcode – Open4education É importante entender bem o conjunto de
dados e como cada algoritmo interage com eles. É provável que um mesmo algoritmo que deu bons resultados neste conjunto de dados pode não dar os mesmos resultados com outro. O scikit-surprise se demonstrou uma boa ferramenta para o estudo dos algoritmos e estudos off-line de dataset. Mesmo com poucos conhecimento de Python é possível iniciar a estudar os algoritmos por trás dos sistemas de recomendação.