{"id":37067795,"url":"https://github.com/recess-eu-project/jeli","last_synced_at":"2026-01-14T07:58:09.852Z","repository":{"id":245257992,"uuid":"813161201","full_name":"RECeSS-EU-Project/JELI","owner":"RECeSS-EU-Project","description":"Joint Embedding-classifier Learning for improved Interpretability (JELI)","archived":false,"fork":false,"pushed_at":"2025-02-20T12:39:03.000Z","size":46,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-04T18:58:25.152Z","etag":null,"topics":["collaborative-filtering","drug-repurposing","factorization-machine","interpretability"],"latest_commit_sha":null,"homepage":"https://recess-eu-project.github.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RECeSS-EU-Project.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":"codemeta.json","zenodo":".zenodo.json"}},"created_at":"2024-06-10T15:28:13.000Z","updated_at":"2025-02-20T12:39:07.000Z","dependencies_parsed_at":"2025-02-20T13:32:01.520Z","dependency_job_id":"4d58a21b-4d3e-4c70-983b-fef0e3885c10","html_url":"https://github.com/RECeSS-EU-Project/JELI","commit_stats":null,"previous_names":["recess-eu-project/jeli"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/RECeSS-EU-Project/JELI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RECeSS-EU-Project%2FJELI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RECeSS-EU-Project%2FJELI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RECeSS-EU-Project%2FJELI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RECeSS-EU-Project%2FJELI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RECeSS-EU-Project","download_url":"https://codeload.github.com/RECeSS-EU-Project/JELI/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RECeSS-EU-Project%2FJELI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28413527,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["collaborative-filtering","drug-repurposing","factorization-machine","interpretability"],"created_at":"2026-01-14T07:58:09.349Z","updated_at":"2026-01-14T07:58:09.834Z","avatar_url":"https://github.com/RECeSS-EU-Project.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![funding logo](https://raw.githubusercontent.com/RECeSS-EU-Project/RECeSS-EU-Project.github.io/main/assets/images/header%2BEU_rescale.jpg)\n\n# Joint Embedding-classifier Learning for improved Interpretability (JELI) Python Package\n\nThis repository is a part of the EU-funded [RECeSS project](https://recess-eu-project.github.io) (#101102016), and hosts the code for the open-source Python package *JELI* for the collaborative filtering approach.\n\n[![Python Version](https://img.shields.io/badge/python-3.8%7C3.9-pink)](https://img.shields.io/badge/python-3.8%7C3.9-pink) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.12193722.svg)](https://doi.org/10.5281/zenodo.12193722) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Build Status](https://github.com/recess-eu-project/jeli/actions/workflows/post-push-test.yml/badge.svg)](https://github.com/recess-eu-project/jeli/actions/workflows/post-push-test.yml) [![Codecov](https://codecov.io/github/recess-eu-project/jeli/coverage.svg?branch=master)](https://codecov.io/github/recess-eu-project/jeli?branch=master) [![Codefactor](https://www.codefactor.io/repository/github/recess-eu-project/jeli/badge?style=plastic)](https://www.codefactor.io/repository/github/recess-eu-project/jeli) \n\n## Statement of need \n\nInterpretability is a topical question in recommender systems, especially in healthcare applications. In drug repurposing, the goal is to identify novel therapeutic indications as drug-disease pairs. An interpretable drug repurposing algorithm quantifies the importance of each input feature for the predicted therapeutic drug-disease association in a non-ambiguous fashion, using post hoc methods. Unfortunately, different importance score-based approaches lead to different results, yielding unreliable interpretations.\n\nWe introduce the novel Joint Embedding Learning-classifier for improved Interpretability (JELI). It features a new structured recommender system and trains it jointly on a drug-disease-gene knowledge graph completion task. In particular, JELI simultaneously (a) learns the gene, drug, and disease embeddings; (b) predicts new drug-disease associations based on those embeddings; (c) provides importance scores for each gene. The drug and disease embeddings have a structure that depends on the gene embeddings. Therefore, JELI allows the introduction of graph-based priors on the connections between diseases, drugs, and genes in a generic fashion to recommend and argue for novel therapeutic drug-disease associations. \n\nContrary to prior works, the recommender system explicitly includes the importance scores, strengthening the link between the recommendations and the extracted scores while allowing the use of a generic embedding model. The recommendation strategy in JELI can also be readily applied beyond the task of drug repurposing for any sets of items, users, and features.\n\n## Install the latest release\n\n### Using pip\n\n```bash\npip install jeli\n```\n\n### Docker\n\n```bash\n#Build Docker image\ndocker build -t jeli .\n#Run Docker image built in previous step and drop into SSH\ndocker run -it --expose 3000  -p 3000:3000 jeli\n```\n\n### Dependencies\n\nOS: developed and tested on Debian Linux.\n\nThe complete list of dependencies for *JELI* can be found at [requirements.txt](https://raw.githubusercontent.com/RECeSS-EU-Project/JELI/master/pip/requirements.txt) (pip).\n\n## Usage\n\n```python\nfrom jeli.JELI import JELI\n\nfrom stanscofi.utils import load_dataset\nfrom stanscofi.training_testing import random_simple_split\nimport pandas as pd\n\n## loads the Gottlieb drug repurposing data set\ndata_args = load_dataset(\"Gottlieb\", \"./\")\ndataset = Dataset(**data_args)\n\n## splits in training and testing sets without leakage\n(train_folds, test_folds), _ = random_simple_split(dataset, 0.2, random_state=1234)\ntrain = dataset.subset(train_folds)\ntest = dataset.subset(test_folds)\n\nclassifier = JELI({\"cuda_on\": False, \"n_dimensions\": 10, \"random_state\": 1234, \"epochs\": 25})\n\n## trains JELI on the training set\nclassifier.fit(train)\n\n## predicts on the testing set\nscores = classifier.predict_proba(test)\nclassifier.print_scores(scores)\npredictions = classifier.predict(scores, threshold=0.5)\nclassifier.print_classification(predictions)\n\n## computes an embedding i (item/drug)\nitem = pd.DataFrame(dataset.items.toarray()[:,0],index=dataset.item_features,columns=[\"0\"])\ni = model.transform(item, is_item=True)\n\n## computes an embedding u (user/disease)\nuser = pd.DataFrame(dataset.users.toarray()[:,0],index=dataset.user_features,columns=[\"0\"])\nu = model.transform(user, is_item=False)\n\n## computes the feature-wise importance scores from embeddings\nembs = classifier.model[\"feature_embeddings\"]\nfeature_scores = embs.sum(axis=1)\n```\n\n## Licence\n\nThis repository is under an [OSI-approved](https://opensource.org/licenses/) [MIT license](https://raw.githubusercontent.com/RECeSS-EU-Project/JELI/master/LICENSE). \n\n## Citation\n\nIf you use *JELI* in academic research, please cite it as follows\n\n```\n@article{reda2025joint,\n  title={Joint embedding--classifier learning for interpretable collaborative filtering},\n  author={R{\\'e}da, Cl{\\'e}mence and Vie, Jill-J{\\^e}nn and Wolkenhauer, Olaf},\n  journal={BMC bioinformatics},\n  volume={26},\n  number={1},\n  pages={26},\n  year={2025},\n  publisher={Springer}\n}\n\n```\n\n## Community guidelines with respect to contributions, issue reporting, and support\n\n[Pull requests](https://github.com/RECeSS-EU-Project/JELI/pulls) and [issue flagging](https://github.com/RECeSS-EU-Project/JELI/issues) are welcome, and can be made through the GitHub interface. Support can be provided by reaching out to ``recess-project[at]proton.me``. However, please note that contributors and users must abide by the [Code of Conduct](https://github.com/RECeSS-EU-Project/JELI/blob/master/CODE%20OF%20CONDUCT.md).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecess-eu-project%2Fjeli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frecess-eu-project%2Fjeli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecess-eu-project%2Fjeli/lists"}