Treine suas engines de recomendação with zero code! :)
Essse repositório contém um conjunto de scripts com a finalidade de treinar um Sistema de Recomendação Híbrido -Collaborative Filtering (CF) e Content-Based Filtering (CBF)- genérico o suficiente para fazer recomendações para de itens para usuários (conhecidos ou novos).
É uma das taxonomias (bastante comum) utilizadas para distinguir os Sistemas de Recomendação. A premissa básica por trás da CF é a de que se um usuário u1
é semelhante a um usuário u2
com base em conteúdo colaborativo, então pode-se gerar recomendações para o usuário u2
com base no usuário u1
.
Para explicar melhor, imagina-se a seguinte situação:
-
Usuário
u1
tem 18 anos e solteiro -
Usuário
u2
tem 33 anos e é casado -
Usuário
u3
tem 21 anos e é solteiro -
Usuário
u4
tem 19 anos e é casado -
Usuário
u5
tem 45 anos e é casado -
u1
assiste os filmesMercenários
,Mercenários 2
,Mercenários 3
eAtração Perigosa
,Rambo
-
u2
assiste os filmesMercenários
,Mercenários 2
,American PIE
eVelozes e Furiosos
,Se beber, não case
-
u3
assiste os filmesAmerican PIE
,Mercenários 2
,Mercenários 3
,Atração Perigosa
-
u4
assiste os filmesMercenários
,Mercenários 3
eAtração Perigosa
,Rambo
,American PIE,
Se beber, não case,
Velozes e Furiosos` -
u5
não assiste nenhum filme ( Fica claro que ou3
é semelhante aou1
, pois eles assistiram 3 filmes iguais. Seguindo a premissa da CF, um dos filmes recomendados para o usuáriou3
seriaMercenários
.
Assim como a CF é uma taxonomia para distinguir os Sistemas de Recomendação. Esta, por sua vez, faz o estudo de ténicas para gerar recomendações para usuários com base nas características dos mesmos.
Geralmente é utilizada quando não há informações colaborativas (diga-se coletivas) a respeito de um item ou usuário. Desse modo, para u4
seria recomendado os filmes que u2
assistiu, pois com base nas características dos usuários (idade e estado civil) o u2
é o mais mais semelhante ao u4
.
Os Sistemas de Recomendação Híbridos fazem uso tanto de técnicas presentes em CF, quanto em CBF. Na verdade, na maioria das vezes, tomam-se como prioridade as técnicas utilizadas na CF, e caso não haja informações a respeito (usuário ou item novo) utilizam-se técnicas de CBF.
Assim, um Sistema de Recomendação Híbrido seria capaz de gerar recomendações para todos os usuários disponíveis (u1
, u2
, u3
, u4
). Para o u3
, por exemplo, seria recomendado Mercenários
, e para o u5
seria recomendado os filmes que o u2
assistiu. Os Híbridos geralmente (almost like everything, não é há convenção na literatura) geram suas recomendações com base nas técnicas de CF, pois estas são mais efetivas (geramente), e caso não haja informações colaborativas, então usam-se técnicas de CBF.
Diferentes técnicas de Inteligência Artificial (IA) são utilizadas para tratar esses problemas - em alguns casos é utilizado a mesma técnica em CF e CBF. O exemplo mais clássico disso é o uso de algoritmo KNearestNeighbor -. A principal distinção entre elas está no uso dos dados para gerar as recomendações - CF usa dados colaborativos para determinar a similaridade e gerar recomendações com base nos itens ou usuários mais similares, enquanto que CBF usa dados individuais para determinar as recomendações para os itens ou usuários mais similares -.
Evidentemente não há uma solução para comum para todos os casos. Cada problema é um problema, e como tal, deve ser tratado de forma singular. Portanto, para determinar qual técnica é melhor para um conjunto de dados (domínio), deve-se fazer uma análise dos dados e posteriormente a elaboração e validação de hipóteses.
Algumas das estratégias mais comuns para tratar o problemas de recomendação são:
- Agrupamento
- Classificação
- Regressão
- Com combinações das técnicas acima
Em alguns casos, foi tratado com o uso de técnicas de
- Problema de Satisfação de Restrição (PSR)
- Sistemas Especialistas
- Raciocínio Baseado em Caso
Conforme mecionado anteriormente, esta library faz uso dos algoritmos presentes no scikit-learn, portanto, ela foi escrita em Python. Para executar o projeto, basta instalar a versão o Python 2.7.12 e adicionar o no Path da máquina - durante o desenvolvimetno deste projeto foi utilizado Anaconda 4.1.1 -, em seguida basta digitar o segunite comando no console:
pip install -r [endereço do arquivo requirements que se encontra no diretório raíz do projeto]
O objetivo desse projeto é fornecer um conjunto de scripts e implementações para treinar diferentes engines de Sistemas de Recomendação (CF, CBF ou híbrido) with zero zode :)
No momento essa library só suporta User-User Collaborative Filtering - uma matriz de usuários x itens, onde cada célula representa um rating de um usuário para um item -. As recomendações são geradas observando a similaridade entre os usuários.
No futuro será adicionada a features User-Item Collaborative Filtering - cria-se uma matriz de item x item, onde cada célula armazena a similaridade de um item i1
com um i2
. Nesse caso, para gerar as predições de i1
, percorre-se a matriz e toma-se as recomendações dos itens mais semelhantes.
Além disso, as seguintes técnicas serão suportados:
- classificação
- regressão
- outros algoritmos de agrupamento
- e a combinação destes
- KNN (instance-based ou lazy learning) User User Collaborative Filtering
- KNN (instance-based ou lazy learning) Item-Item Collaborative Filtering
- KNN CBF
- Algoritmos de classificação
- Algoritmos de regressão
- Algoritmos de agrupamento
Atualmente é suportado a recomendação baseada em filtragem colaborativa de usuário para usuário (User-User Collaborative Filtering). Para tal, cria-se uma matriz (a matriz foi binarizada por questões didáticas) onde as linhas são os usuários e as colunas os filmes. Se o usuário u
assistiu o filme f
, então o valor é 1. Do contrário é zero (não assistiu). Portanto, será criado uma matriz de ordem usuários x filmes
.
O treinamento do algoritmo ocorre com o cálculo da distância de cada usuário em relação os outros. O cálculo é feito pela implementação escolhida do algoritmo KNN. Para fazer a predição (recomendação) é feito o cálculo dos k vizinhos mais próximos, e então é realizado a união entre as características (se o filme foi assistido ou não) desses vizinhos e então é gerado a recomendação (união das características dos k vizinhos).
A matriz está ilustrada abaixo:
Mercenários | Mercenários 2 | Mercenários 3 | Atração Perigosa | Rambo | American PIE | Se beber, não case | Velozes e Furiosos
u1 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0
u2 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1
u3 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0
u4 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1
u5 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
Assim, usando o algoritmo com as configurações padrões e k=2, as recomendações para o u4
seriam:
D(u4, u1) = 4
D(u4, u2) = 4
D(u4, u3) = 5
u5
não foi utilizado no cálculo porque não há informação colaborativa a respeito dele.
Os k=2
vizinhos mais próximos são u1
e u2
, logo as recomendações serão a união (nesssa library está implementado como união, porém no futur, será implementado outras estratégias, como por exemplo recomendar somente os filmes que possuem maior frequência - modas) das características desses vizinhos:
Recomendações =
Mercenários | Mercenários 2 | Mercenários 3 | Atração Perigosa | Rambo | American PIE | Se beber, não case | Velozes e Furiosos
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
Dentro do mesmo diretório onde o projeto foi clonado, basta digitar o comando python train_recommender.py
passando os parâmetros disponíveis. Os parâmetros disponíveis são:
- --distance-metric [metrica escolhida]. As métricas estão disponíveis aqui
- --kfold [inteiro descrevendo o número de folds usado na validação cruzada]
- --alg [o algoritmo utilizado para fazer o cálculo dos k vizinhos mais próxixos] disponível em
- --n-neighbors [inteiro descrevendo o número de vizinhos mais próximos]
- --top-items [número descrevendo o número dos top items para um usuário de acordo com sua relevância] (AINDA NÃO É SUPORTADO)
- --leaf-size [inteiro que determina o número de nó folhas utilizado na poda] default: 30. Parâmetro só é utilizado quando quando --alg=kd_tree ou --alg=ball_tree
- --weights [string definindo a função de peso utilizada na predição] default: 'uniform'. Mais informações
- --p [inteiro definindo a potência utilizada para fazer o cálculo da distância] mais informações
Após o término do treinamento, será escolhido a versão com as melhores métricas e será salvo em disco. O nome do arquivo será user_user_cf_knn-[dia-mes-ano-hora-minuto-segundo].pkl
.
Além disso, também será gerado um log com o nome user_user_cf_knn-[dia-mes-ano-hora-minuto-segundo].log
contendo as métricas coletadas durante o treinamento dos k
modelos (kfolds).
- Recommender systems survey
- An Empirical Analysis of Design Choices in Neighborhood
- Recommender Systems Handbook
- Recommendation Systems
- Similarity and recommender systems
- Semi-Supervised Learning for Personalized Web Recommender
- Learning From Labeled And Unlabeled Data: An Empirical Study Across Techniques And Domains
- Is trust robuts? An Analysis of Trust-Based Recommendation
Copyright 2016 Senior Sistemas S.A.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.