payload: {"action":"created","comment":{"url":"https://api.github.com/repos/metric-learn/metric-learn/pulls/comments/269499980","pull_request_review_id":219382316,"id":269499980,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2OTQ5OTk4MA==","diff_hunk":"@@ -490,20 +491,39 @@ def calibrate_threshold(self, pairs_valid, y_valid, strategy='accuracy',\n       scores_sorted = scores[scores_sorted_idces]\n       # true labels ordered by decision_function value: (higher first)\n       y_ordered = y_valid[scores_sorted_idces]\n+      # we need to add a threshold that will reject all points\n+      scores_sorted = np.concatenate([[scores_sorted[0] + 1], scores_sorted])\n+\n       # finds the threshold that maximizes the accuracy:\n       cum_tp = stable_cumsum(y_ordered == 1)  # cumulative number of true\n       # positives\n+      # we need to add the point where all samples are rejected:\n+      cum_tp = np.concatenate([[0.], cum_tp])\n       cum_tn_inverted = stable_cumsum(y_ordered[::-1] == -1)\n-      cum_tn = np.concatenate([[0], cum_tn_inverted[:-1]])[::-1]\n+      cum_tn = np.concatenate([[0.], cum_tn_inverted])[::-1]\n       cum_accuracy = (cum_tp + cum_tn) / n_samples\n       imax = np.argmax(cum_accuracy)\n       # note: we want a positive threshold (distance), so we take - threshold\n-      self.threshold_ = - scores_sorted[imax]\n+      if imax == len(scores_sorted):  # if the best is to accept all points\n+        # we set the threshold to (minus) [the lowest score - 1]\n+        self.threshold_ = - (scores_sorted[imax] - 1)\n+      else:\n+        # otherwise, we set the threshold to the mean between the lowest\n+        # accepted score and the highest accepted score\n+        self.threshold_ = - np.mean(scores_sorted[imax: imax + 2])\n+      # note: if the best is to reject all points it's already one of the\n+      # thresholds (scores_sorted[0] + 1)\n       return self\n \n     if strategy == 'f_beta':\n-      precision, recall, thresholds = precision_recall_curve(\n+      fps, tps, thresholds = _binary_clf_curve(\n           y_valid, self.decision_function(pairs_valid), pos_label=1)\n+","path":"metric_learn/base_metric.py","position":213,"original_position":44,"commit_id":"6dff15bc5a1c2abed2a01f1e9f174e89a6230ee8","original_commit_id":"ccc66eba9df2c639a86dcda1d725875b7840944b","user":{"login":"wdevazelhes","id":31916524,"node_id":"MDQ6VXNlcjMxOTE2NTI0","avatar_url":"https://avatars2.githubusercontent.com/u/31916524?v=4","gravatar_id":"","url":"https://api.github.com/users/wdevazelhes","html_url":"https://github.com/wdevazelhes","followers_url":"https://api.github.com/users/wdevazelhes/followers","following_url":"https://api.github.com/users/wdevazelhes/following{/other_user}","gists_url":"https://api.github.com/users/wdevazelhes/gists{/gist_id}","starred_url":"https://api.github.com/users/wdevazelhes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wdevazelhes/subscriptions","organizations_url":"https://api.github.com/users/wdevazelhes/orgs","repos_url":"https://api.github.com/users/wdevazelhes/repos","events_url":"https://api.github.com/users/wdevazelhes/events{/privacy}","received_events_url":"https://api.github.com/users/wdevazelhes/received_events","type":"User","site_admin":false},"body":"We need to take part of the code (but not all) from `precision_recall_curve` here because there was a section of the code in `precision_recall_curve` that deleted points when the maximum recall is attained. This was OK when we set the threshold to the the last value we accept, but it's not OK with the new computation of the threshold because we need all the points to put the threshold in the middle of two points. (Otherwise the algo can think some point is the last point of the list and so be set to this value - 1, whereas it should be the mean between this value and the next one)\r\nI can detail more this if needed","created_at":"2019-03-27T10:47:25Z","updated_at":"2019-03-27T10:50:23Z","html_url":"https://github.com/metric-learn/metric-learn/pull/168#discussion_r269499980","pull_request_url":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/metric-learn/metric-learn/pulls/comments/269499980"},"html":{"href":"https://github.com/metric-learn/metric-learn/pull/168#discussion_r269499980"},"pull_request":{"href":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168"}}},"pull_request":{"url":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168","id":250066060,"node_id":"MDExOlB1bGxSZXF1ZXN0MjUwMDY2MDYw","html_url":"https://github.com/metric-learn/metric-learn/pull/168","diff_url":"https://github.com/metric-learn/metric-learn/pull/168.diff","patch_url":"https://github.com/metric-learn/metric-learn/pull/168.patch","issue_url":"https://api.github.com/repos/metric-learn/metric-learn/issues/168","number":168,"state":"open","locked":false,"title":"[WIP] Threshold for pairs learners","user":{"login":"wdevazelhes","id":31916524,"node_id":"MDQ6VXNlcjMxOTE2NTI0","avatar_url":"https://avatars2.githubusercontent.com/u/31916524?v=4","gravatar_id":"","url":"https://api.github.com/users/wdevazelhes","html_url":"https://github.com/wdevazelhes","followers_url":"https://api.github.com/users/wdevazelhes/followers","following_url":"https://api.github.com/users/wdevazelhes/following{/other_user}","gists_url":"https://api.github.com/users/wdevazelhes/gists{/gist_id}","starred_url":"https://api.github.com/users/wdevazelhes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wdevazelhes/subscriptions","organizations_url":"https://api.github.com/users/wdevazelhes/orgs","repos_url":"https://api.github.com/users/wdevazelhes/repos","events_url":"https://api.github.com/users/wdevazelhes/events{/privacy}","received_events_url":"https://api.github.com/users/wdevazelhes/received_events","type":"User","site_admin":false},"body":"This PR fits a threshold for tuples learners to allow a predict (and scoring) on pairs\r\n\r\nFixes #131 \r\nFixes #165  \r\n\r\nFinally, we decided that it would be good to have at least  a  minimal implementation of threshold calibration inside metric-learn, so that `_PairsClassifiers` can have a threshold hence a predict directly out of the box, without the need for a MetaEstimator. A MetaEstimator could however be used outside the algorithm for more precise threshold calibration (with cross-validation). \r\n\r\nThe following features should be implemented: \r\n- [x] We should have two methods for `_PairsClassifiers`: `set_threshold()` and <strike>`calibrate_threshold(validation_set, method='max_tpr', args={'min_tnr': 0.1})`. `set_threshold` will set the threshold to a hard value, and `calibrate_threshold` will take a validation set and a method ('accuracy', 'f1'...) and will find the threshold which optimizes the metric in `method` on the validation set.</strike> We went for the same syntax that scikit-learn's PR.\r\n- [ ] At fit time, we should either have a simple rule to set a threhold (for instance median of distances, or mean between positive pairs distances mean and negative pairs distances mean), or we should return `calibrate_threshold(trainset)`, and in this case also raise a warning at the end that says that the threshold has been fitted on the trainset, so we should check scikit-learn's utilities for calibration to have a calibration less prone to overfitting. Also in this case we could allow to put arguments in `fit` like `fit(pairs, y, threshold_method='max_tpr', threshold_args={'min_tnr': 0.1})\r\n- [x] The following scores should be implemented: \r\n  - 'accuracy'\r\n  - ‘f_beta’\r\n  - ‘max_tpr’\r\n  - 'max_tnr'\r\nSee scikit-learn's calibration PR (https://github.com/scikit-learn/scikit-learn/pull/10117) for more details, and the documentation of it here https://35753-843222-gh.circle-artifacts.com/0/doc/modules/calibration.html\r\n- [x] For some estimators for which a natural threshold exist (like `ITML`: the mean between the lower threshold and the higher threshold), we should put this threshold\r\n\r\n- [ ] Decide what to do by default, rule of thumb scoring or calibration on trainset ? \r\n\r\n## Questions: \r\n\r\n- Should we do the same thing for QuadrupletsLearners ? (the natural threshold is 0, so I don't think it would make as much sense here, and users would maybe rather use the future meta estimator from scikit-learn's PR https://github.com/scikit-learn/scikit-learn/pull/10117), but since we will already have it implemented for pairs, and maybe for coherence, we could have it also for Quadruplets Learners\r\n\r\n## TODO: \r\n- [x] Implement tests that check that we can use custom scores in cross val (cf #165). This needs to have a predict hence is related to this PR. \r\n- [x] Implement API tests (that the behaviour is as expected)\r\n- [x] Implement numerical tests (on examples where we know the f_1 score etc\r\n- [x] Implement the actual method (cf. features above)\r\n- [x] Add this in the doc: also talk in the doc about the `CalibratedClassifierCV`\r\n- [x] <strike>Think about which scoring make sense with quadruplets and what impact is has on the  code </strike>\r\n- [x] <strike>Use/Adapt `CalibratedClassifierCV` or an equivalent for quadruplets</strike>\r\n- [x] <strike> Maybe test CalibratedClassifierCV that it returns a coherent value (like all that have predict_proba = 0.8 have indeed 80% success) </strike> CalibratedClassifier's behaviour should be tested in scikit-learn: in metric learn we should just test the API (but on a small draft example I tested it for ITML and it worked more or less)\r\n- [ ] Add a case (and a test case) where the best accuracy is when we need to reject all points (so threshold  = best score + 1). See if this applies too to other strategies","created_at":"2019-02-04T14:15:29Z","updated_at":"2019-03-27T10:50:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c1209daa4765e344f3b9be88b27efbc5df58c27d","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168/commits","review_comments_url":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168/comments","review_comment_url":"https://api.github.com/repos/metric-learn/metric-learn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/metric-learn/metric-learn/issues/168/comments","statuses_url":"https://api.github.com/repos/metric-learn/metric-learn/statuses/6dff15bc5a1c2abed2a01f1e9f174e89a6230ee8","head":{"label":"wdevazelhes:feat/add_threshold","ref":"feat/add_threshold","sha":"6dff15bc5a1c2abed2a01f1e9f174e89a6230ee8","user":{"login":"wdevazelhes","id":31916524,"node_id":"MDQ6VXNlcjMxOTE2NTI0","avatar_url":"https://avatars2.githubusercontent.com/u/31916524?v=4","gravatar_id":"","url":"https://api.github.com/users/wdevazelhes","html_url":"https://github.com/wdevazelhes","followers_url":"https://api.github.com/users/wdevazelhes/followers","following_url":"https://api.github.com/users/wdevazelhes/following{/other_user}","gists_url":"https://api.github.com/users/wdevazelhes/gists{/gist_id}","starred_url":"https://api.github.com/users/wdevazelhes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wdevazelhes/subscriptions","organizations_url":"https://api.github.com/users/wdevazelhes/orgs","repos_url":"https://api.github.com/users/wdevazelhes/repos","events_url":"https://api.github.com/users/wdevazelhes/events{/privacy}","received_events_url":"https://api.github.com/users/wdevazelhes/received_events","type":"User","site_admin":false},"repo":{"id":121612336,"node_id":"MDEwOlJlcG9zaXRvcnkxMjE2MTIzMzY=","name":"metric-learn","full_name":"wdevazelhes/metric-learn","private":false,"owner":{"login":"wdevazelhes","id":31916524,"node_id":"MDQ6VXNlcjMxOTE2NTI0","avatar_url":"https://avatars2.githubusercontent.com/u/31916524?v=4","gravatar_id":"","url":"https://api.github.com/users/wdevazelhes","html_url":"https://github.com/wdevazelhes","followers_url":"https://api.github.com/users/wdevazelhes/followers","following_url":"https://api.github.com/users/wdevazelhes/following{/other_user}","gists_url":"https://api.github.com/users/wdevazelhes/gists{/gist_id}","starred_url":"https://api.github.com/users/wdevazelhes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wdevazelhes/subscriptions","organizations_url":"https://api.github.com/users/wdevazelhes/orgs","repos_url":"https://api.github.com/users/wdevazelhes/repos","events_url":"https://api.github.com/users/wdevazelhes/events{/privacy}","received_events_url":"https://api.github.com/users/wdevazelhes/received_events","type":"User","site_admin":false},"html_url":"https://github.com/wdevazelhes/metric-learn","description":"Metric learning algorithms in Python","fork":true,"url":"https://api.github.com/repos/wdevazelhes/metric-learn","forks_url":"https://api.github.com/repos/wdevazelhes/metric-learn/forks","keys_url":"https://api.github.com/repos/wdevazelhes/metric-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wdevazelhes/metric-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wdevazelhes/metric-learn/teams","hooks_url":"https://api.github.com/repos/wdevazelhes/metric-learn/hooks","issue_events_url":"https://api.github.com/repos/wdevazelhes/metric-learn/issues/events{/number}","events_url":"https://api.github.com/repos/wdevazelhes/metric-learn/events","assignees_url":"https://api.github.com/repos/wdevazelhes/metric-learn/assignees{/user}","branches_url":"https://api.github.com/repos/wdevazelhes/metric-learn/branches{/branch}","tags_url":"https://api.github.com/repos/wdevazelhes/metric-learn/tags","blobs_url":"https://api.github.com/repos/wdevazelhes/metric-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wdevazelhes/metric-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wdevazelhes/metric-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/wdevazelhes/metric-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wdevazelhes/metric-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/wdevazelhes/metric-learn/languages","stargazers_url":"https://api.github.com/repos/wdevazelhes/metric-learn/stargazers","contributors_url":"https://api.github.com/repos/wdevazelhes/metric-learn/contributors","subscribers_url":"https://api.github.com/repos/wdevazelhes/metric-learn/subscribers","subscription_url":"https://api.github.com/repos/wdevazelhes/metric-learn/subscription","commits_url":"https://api.github.com/repos/wdevazelhes/metric-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/wdevazelhes/metric-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/wdevazelhes/metric-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/wdevazelhes/metric-learn/issues/comments{/number}","contents_url":"https://api.github.com/repos/wdevazelhes/metric-learn/contents/{+path}","compare_url":"https://api.github.com/repos/wdevazelhes/metric-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wdevazelhes/metric-learn/merges","archive_url":"https://api.github.com/repos/wdevazelhes/metric-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wdevazelhes/metric-learn/downloads","issues_url":"https://api.github.com/repos/wdevazelhes/metric-learn/issues{/number}","pulls_url":"https://api.github.com/repos/wdevazelhes/metric-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/wdevazelhes/metric-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/wdevazelhes/metric-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wdevazelhes/metric-learn/labels{/name}","releases_url":"https://api.github.com/repos/wdevazelhes/metric-learn/releases{/id}","deployments_url":"https://api.github.com/repos/wdevazelhes/metric-learn/deployments","created_at":"2018-02-15T09:43:10Z","updated_at":"2019-03-21T14:46:21Z","pushed_at":"2019-03-27T10:40:14Z","git_url":"git://github.com/wdevazelhes/metric-learn.git","ssh_url":"git@github.com:wdevazelhes/metric-learn.git","clone_url":"https://github.com/wdevazelhes/metric-learn.git","svn_url":"https://github.com/wdevazelhes/metric-learn","homepage":null,"size":1968,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"metric-learn:master","ref":"master","sha":"b28933cfe076a0789fbb61cd0637d76e1143eb53","user":{"login":"metric-learn","id":35635935,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1NjM1OTM1","avatar_url":"https://avatars1.githubusercontent.com/u/35635935?v=4","gravatar_id":"","url":"https://api.github.com/users/metric-learn","html_url":"https://github.com/metric-learn","followers_url":"https://api.github.com/users/metric-learn/followers","following_url":"https://api.github.com/users/metric-learn/following{/other_user}","gists_url":"https://api.github.com/users/metric-learn/gists{/gist_id}","starred_url":"https://api.github.com/users/metric-learn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/metric-learn/subscriptions","organizations_url":"https://api.github.com/users/metric-learn/orgs","repos_url":"https://api.github.com/users/metric-learn/repos","events_url":"https://api.github.com/users/metric-learn/events{/privacy}","received_events_url":"https://api.github.com/users/metric-learn/received_events","type":"Organization","site_admin":false},"repo":{"id":14063354,"node_id":"MDEwOlJlcG9zaXRvcnkxNDA2MzM1NA==","name":"metric-learn","full_name":"metric-learn/metric-learn","private":false,"owner":{"login":"metric-learn","id":35635935,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1NjM1OTM1","avatar_url":"https://avatars1.githubusercontent.com/u/35635935?v=4","gravatar_id":"","url":"https://api.github.com/users/metric-learn","html_url":"https://github.com/metric-learn","followers_url":"https://api.github.com/users/metric-learn/followers","following_url":"https://api.github.com/users/metric-learn/following{/other_user}","gists_url":"https://api.github.com/users/metric-learn/gists{/gist_id}","starred_url":"https://api.github.com/users/metric-learn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/metric-learn/subscriptions","organizations_url":"https://api.github.com/users/metric-learn/orgs","repos_url":"https://api.github.com/users/metric-learn/repos","events_url":"https://api.github.com/users/metric-learn/events{/privacy}","received_events_url":"https://api.github.com/users/metric-learn/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/metric-learn/metric-learn","description":"Metric learning algorithms in Python","fork":false,"url":"https://api.github.com/repos/metric-learn/metric-learn","forks_url":"https://api.github.com/repos/metric-learn/metric-learn/forks","keys_url":"https://api.github.com/repos/metric-learn/metric-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/metric-learn/metric-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/metric-learn/metric-learn/teams","hooks_url":"https://api.github.com/repos/metric-learn/metric-learn/hooks","issue_events_url":"https://api.github.com/repos/metric-learn/metric-learn/issues/events{/number}","events_url":"https://api.github.com/repos/metric-learn/metric-learn/events","assignees_url":"https://api.github.com/repos/metric-learn/metric-learn/assignees{/user}","branches_url":"https://api.github.com/repos/metric-learn/metric-learn/branches{/branch}","tags_url":"https://api.github.com/repos/metric-learn/metric-learn/tags","blobs_url":"https://api.github.com/repos/metric-learn/metric-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/metric-learn/metric-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/metric-learn/metric-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/metric-learn/metric-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/metric-learn/metric-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/metric-learn/metric-learn/languages","stargazers_url":"https://api.github.com/repos/metric-learn/metric-learn/stargazers","contributors_url":"https://api.github.com/repos/metric-learn/metric-learn/contributors","subscribers_url":"https://api.github.com/repos/metric-learn/metric-learn/subscribers","subscription_url":"https://api.github.com/repos/metric-learn/metric-learn/subscription","commits_url":"https://api.github.com/repos/metric-learn/metric-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/metric-learn/metric-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/metric-learn/metric-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/metric-learn/metric-learn/issues/comments{/number}","contents_url":"https://api.github.com/repos/metric-learn/metric-learn/contents/{+path}","compare_url":"https://api.github.com/repos/metric-learn/metric-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/metric-learn/metric-learn/merges","archive_url":"https://api.github.com/repos/metric-learn/metric-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/metric-learn/metric-learn/downloads","issues_url":"https://api.github.com/repos/metric-learn/metric-learn/issues{/number}","pulls_url":"https://api.github.com/repos/metric-learn/metric-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/metric-learn/metric-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/metric-learn/metric-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/metric-learn/metric-learn/labels{/name}","releases_url":"https://api.github.com/repos/metric-learn/metric-learn/releases{/id}","deployments_url":"https://api.github.com/repos/metric-learn/metric-learn/deployments","created_at":"2013-11-02T08:29:47Z","updated_at":"2019-03-26T14:02:47Z","pushed_at":"2019-03-27T10:40:16Z","git_url":"git://github.com/metric-learn/metric-learn.git","ssh_url":"git@github.com:metric-learn/metric-learn.git","clone_url":"https://github.com/metric-learn/metric-learn.git","svn_url":"https://github.com/metric-learn/metric-learn","homepage":"http://metric-learn.github.io/metric-learn/","size":2676,"stargazers_count":646,"watchers_count":646,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":155,"mirror_url":null,"archived":false,"open_issues_count":53,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":155,"open_issues":53,"watchers":646,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168"},"html":{"href":"https://github.com/metric-learn/metric-learn/pull/168"},"issue":{"href":"https://api.github.com/repos/metric-learn/metric-learn/issues/168"},"comments":{"href":"https://api.github.com/repos/metric-learn/metric-learn/issues/168/comments"},"review_comments":{"href":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168/comments"},"review_comment":{"href":"https://api.github.com/repos/metric-learn/metric-learn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/metric-learn/metric-learn/pulls/168/commits"},"statuses":{"href":"https://api.github.com/repos/metric-learn/metric-learn/statuses/6dff15bc5a1c2abed2a01f1e9f174e89a6230ee8"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"wdevazelhes"}}