{"id":13396380,"url":"https://github.com/SeniorSA/hybrid-rs-trainner","last_synced_at":"2025-03-13T23:30:54.059Z","repository":{"id":96202397,"uuid":"73423336","full_name":"SeniorSA/hybrid-rs-trainner","owner":"SeniorSA","description":"Conjunto de scripts para treinar um Sistema de Recomendação Híbrido baseado nos algoritmos do scikit-learn","archived":false,"fork":false,"pushed_at":"2016-11-14T17:30:09.000Z","size":308,"stargazers_count":15,"open_issues_count":0,"forks_count":5,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-07-31T18:17:11.217Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SeniorSA.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-11-10T21:44:42.000Z","updated_at":"2024-07-16T21:11:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"8494b5ba-5409-4ad1-86a8-27bcdb8ee188","html_url":"https://github.com/SeniorSA/hybrid-rs-trainner","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeniorSA%2Fhybrid-rs-trainner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeniorSA%2Fhybrid-rs-trainner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeniorSA%2Fhybrid-rs-trainner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SeniorSA%2Fhybrid-rs-trainner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SeniorSA","download_url":"https://codeload.github.com/SeniorSA/hybrid-rs-trainner/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243499867,"owners_count":20300705,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T18:00:48.742Z","updated_at":"2025-03-13T23:30:53.749Z","avatar_url":"https://github.com/SeniorSA.png","language":"Python","funding_links":[],"categories":["C","C语言"],"sub_categories":["Tools","[Tools](#tools-1)"],"readme":"# hybrid-rs-trainner #\nTreine suas engines de recomendação with zero code! :)\n\n## Sumário\n* [Sistemas de Recomendação](#sistemas-de-recomendação)\n  * [Collaborative Filtering](#collaborative-filtering)\n  * [Content-Based Filtering](#content-based-filtering)\n  * [Hybrid Filtering](#hybrid-filtering)\n  * [Diferenças entre essas taxonomias](#diferenças-entre-essas-taxonomias)\n  * [Escolha de técnicas para gerar recomendações](#escolha-de-técnicas-para-gerar-recomendações)\n* [Preparação do Ambiente](#preparação-do-ambiente)\n* [Sobre a library](#sobre-a-library)\n  * [Features suportadas](#features-suportadas)\n  * [Features pendentes](#features-pendentes)\n  * [Funcionamento do algoritmo](#funcionamento-do-algoritmo)\n  * [Como fazer o treinamento do algoritmo](#como-fazer-o-treinamento-do-algoritmo)\n* [Referências](#referências)\n* [License](#license)\n\n## Sistemas de Recomendação \n\nEssse 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). \n\n### Collaborative Filtering\nÉ 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`.\n\nPara explicar melhor, imagina-se a seguinte situação:\n - Usuário `u1` tem 18 anos e solteiro\n - Usuário `u2` tem 33 anos e é casado\n - Usuário `u3` tem 21 anos e é solteiro\n - Usuário `u4` tem 19 anos e é casado\n - Usuário `u5` tem 45 anos e é casado\n  \n - `u1` assiste os filmes `Mercenários`, `Mercenários 2`,  `Mercenários 3` e `Atração Perigosa`, `Rambo`\n - `u2` assiste os filmes `Mercenários`, `Mercenários 2`, `American PIE` e `Velozes e Furiosos`, `Se beber, não case`\n - `u3` assiste os filmes `American PIE`, `Mercenários 2`, `Mercenários 3`, `Atração Perigosa`\n - `u4` assiste os filmes `Mercenários`, `Mercenários 3` e `Atração Perigosa`, `Rambo`, `American PIE, `Se beber, não case`, `Velozes e Furiosos`\n - `u5` não assiste nenhum filme ( \nFica claro que o `u3` é semelhante ao `u1`, pois eles __assistiram 3 filmes iguais__. Seguindo a premissa da CF, um dos filmes recomendados para o usuário `u3` seria `Mercenários`.\n\n### Content-Based Filtering\nAssim 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.\nGeralmente é 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`.\n\n### Hybrid Filtering\nOs 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.\n\nAssim, 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.\n\n### Diferenças entre essas taxonomias\nDiferentes 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 -.\nA 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 -.\n\n### Escolha de técnicas para gerar recomendações\nEvidentemente 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.\n\nAlgumas das estratégias mais comuns para tratar o problemas de recomendação são:\n - Agrupamento\n - Classificação\n - Regressão\n - Com combinações das técnicas acima\n\nEm alguns casos, foi tratado com o uso de técnicas de\n - Problema de Satisfação de Restrição (PSR)\n - Sistemas Especialistas\n - Raciocínio Baseado em Caso\n\n## Preparação do ambiente\nConforme 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:\n   `pip install -r [endereço do arquivo requirements que se encontra no diretório raíz do projeto]`\n\n## Sobre a library\nO 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 :)\n\nNo 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__.\n\nNo 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.\n\nAlém disso, as seguintes técnicas serão suportados:\n - classificação\n - regressão\n - outros algoritmos de agrupamento\n - e a combinação destes\n\n### Features suportadas\n * KNN (instance-based ou lazy learning) User User Collaborative Filtering \n\n### Features pendentes\n * KNN (instance-based ou lazy learning) Item-Item Collaborative Filtering \n * KNN CBF\n * Algoritmos de classificação\n * Algoritmos de regressão\n * Algoritmos de agrupamento  \n\n### Funcionamento do algoritmo\nAtualmente é 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`.\n\nO 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).\n\nA matriz está ilustrada abaixo:\n\n       Mercenários | Mercenários 2 | Mercenários 3 | Atração Perigosa | Rambo | American PIE | Se beber, não case | Velozes e Furiosos\n    u1     1       |       1       |       1       |         1        |   1   |       0      |          0         |         0\n    u2     1       |       1       |       0       |         0        |   0   |       1      |          1         |         1\n    u3     0       |       1       |       1       |         1        |   0   |       1      |          0         |         0\n    u4     1       |       0       |       1       |         1        |   1   |       1      |          1         |         1\n    u5     0       |       0       |       0       |         0        |   0   |       0      |          0         |         0\n\nAssim, usando o algoritmo com as configurações padrões e k=2, as recomendações para o `u4` seriam:\n\n    D(u4, u1) = 4\n    D(u4, u2) = 4\n    D(u4, u3) = 5\n\n`u5` __não foi utilizado no cálculo porque não há informação colaborativa a respeito dele__.\n\nOs `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:\n\n    Recomendações = \n    \n    Mercenários | Mercenários 2 | Mercenários 3 | Atração Perigosa | Rambo | American PIE | Se beber, não case | Velozes e Furiosos  \n        1       |       1       |       1       |         1        |   1   |       1      |          1         |         1\n\n### Como fazer o treinamento do algoritmo\nDentro 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:\n - --distance-metric [metrica escolhida]. As métricas estão disponíveis [aqui](http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.DistanceMetric.html)\n - --kfold [inteiro descrevendo o número de folds usado na validação cruzada] \n - --alg [o algoritmo utilizado para fazer o cálculo dos k vizinhos mais próxixos] disponível [em](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbor-algorithms)\n - --n-neighbors [inteiro descrevendo o número de vizinhos mais próximos]\n - --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)\n - --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\n - --weights [string definindo a função de peso utilizada na predição] default: 'uniform'. [Mais informações](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbor-algorithms)\n - --p [inteiro definindo a potência utilizada para fazer o cálculo da distância] [mais informações](http://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbor-algorithms)\n\nApó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`.\nAlé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).\n\n\n## REFERÊNCIAS\n * [Recommender systems survey](http://romisatriawahono.net/lecture/rm/survey/information%20retrieval/Bobadilla%20-%20Recommender%20Systems%20-%202013.pdf)\n * [An Empirical Analysis of Design Choices in Neighborhood](https://www.researchgate.net/profile/Jon_Herlocker/publication/226021885_An_Empirical_Analysis_of_Design_Choices_in_Neighborhood-Based_Collaborative_Filtering_Algorithms/links/00b7d539756e3b1c49000000.pdf)\n * [Recommender Systems Handbook]()\n * [Recommendation Systems](http://infolab.stanford.edu/~ullman/mmds/ch9.pdf)\n * [Similarity and recommender systems](http://www.inf.ed.ac.uk/teaching/courses/inf2b/learnnotes/inf2b-learn-note02-2up.pdf)\n * [Semi-Supervised Learning for Personalized Web Recommender](http://cai.type.sk/content/2010/4/semi-supervised-lear\\ning-for-personalized-web-recommender-system/11052.pdf)\n * [Learning From Labeled And Unlabeled Data: An Empirical Study Across Techniques And Domains](https://www.jair.org/media/1509/live-1509-2348-jair.pdf)\n * [Is trust robuts? An Analysis of Trust-Based Recommendation](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.476.7184\u0026rep=rep1\u0026type=pdf)\n \n## License\nCopyright 2016 Senior Sistemas S.A.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSeniorSA%2Fhybrid-rs-trainner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSeniorSA%2Fhybrid-rs-trainner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSeniorSA%2Fhybrid-rs-trainner/lists"}