{"action":"created","comment":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/25029179","id":25029179,"diff_hunk":"@@ -0,0 +1,113 @@\n+\"\"\"Testing for Gaussian process regression \"\"\"\n+\n+# Author: Jan Hendrik Metzen <jhm@informatik.uni-bremen.de>\n+# Licence: BSD 3 clause\n+\n+from copy import deepcopy\n+\n+import numpy as np\n+\n+from scipy.optimize import approx_fprime\n+\n+from sklearn.gaussian_process import GaussianProcessRegression\n+from sklearn.gaussian_process.kernels import RBF\n+\n+from sklearn.utils.testing import (assert_true, assert_greater,\n+                                   assert_almost_equal)\n+\n+\n+f = lambda x: x * np.sin(x)\n+X = np.atleast_2d([1., 3., 5., 6., 7., 8.]).T\n+X2 = np.atleast_2d([2., 4., 5.5, 6.5, 7.5]).T\n+y = f(X).ravel()\n+\n+\n+kernels = [RBF(0.1), RBF((1e-3, 1.0, 1e3)),\n+           (1e-2, 1.0, 1e2) * RBF((1e-3, 0.1, 1e3)),\n+           (1e-2, 1.0, 1e2) * RBF((1e-3, 0.1, 1e3)) + (None, 0.0, None),\n+           (1e-2, 0.1, 1e2) * RBF((1e-3, 0.1, 1e3)) + (None, 0.0, None)]\n+\n+def test_gpr_interpolation():\n+    \"\"\"Test the interpolating property for different kernels.\"\"\"\n+    for kernel in kernels:\n+        kernel = deepcopy(kernel)\n+        gpr = GaussianProcessRegression(kernel=kernel).fit(X, y)\n+        y_pred, y_cov = gpr.predict(X, return_cov=True)\n+\n+        assert_true(np.allclose(y_pred, y))\n+        assert_true(np.allclose(np.diag(y_cov), 0.))\n+\n+\n+def test_lml_improving():\n+    \"\"\" Test that hyperparameter-tuning improves log-marginal likelihood. \"\"\"\n+    for kernel in kernels:\n+        if not kernel.has_bounds:\n+            continue\n+        kernel = deepcopy(kernel)\n+        params_initial = kernel.params\n+        gpr = GaussianProcessRegression(kernel=kernel).fit(X, y)\n+        assert_greater(gpr.log_marginal_likelihood(kernel.params),\n+                       gpr.log_marginal_likelihood(params_initial))\n+\n+\n+def test_converged_to_local_maximum():\n+    \"\"\" Test that we are in local maximum after hyperparameter-optimization. \"\"\"\n+    for kernel in kernels:\n+        if not kernel.has_bounds:\n+            continue\n+        kernel = deepcopy(kernel)\n+        gpr = GaussianProcessRegression(kernel=kernel).fit(X, y)\n+\n+        lml, lml_gradient = gpr.log_marginal_likelihood(kernel.params, True)\n+\n+        assert_almost_equal(lml_gradient, 0, 5)\n+\n+\n+def test_lml_gradient():\n+    \"\"\" Compare analytic and numeric gradient of log marginal likelihood. \"\"\"\n+    for kernel in kernels:\n+        kernel = deepcopy(kernel)\n+        params = kernel.params\n+        gpr = GaussianProcessRegression(kernel=kernel).fit(X, y)\n+\n+        lml, lml_gradient = gpr.log_marginal_likelihood(params, True)\n+        lml_gradient_approx = \\\n+            approx_fprime(params,\n+                          lambda theta: gpr.log_marginal_likelihood(theta,\n+                                                                    False),\n+                          1e-10)\n+\n+        assert_almost_equal(lml_gradient, lml_gradient_approx, 3)\n+\n+\n+def test_prior():\n+    \"\"\" Test that GP prior has mean 0 and identical variances.\"\"\"\n+    for kernel in kernels:\n+        kernel = deepcopy(kernel)\n+        gpr = GaussianProcessRegression(kernel=kernel)\n+\n+        y_mean, y_cov = gpr.predict(X, return_cov=True)\n+\n+        assert_almost_equal(y_mean, 0, 5)\n+        if len(kernel.params) > 1:\n+            # XXX: quite hacky, works only for current kernels\n+            assert_almost_equal(np.diag(y_cov), kernel.params[0] , 5)\n+        else:\n+            assert_almost_equal(np.diag(y_cov), 1, 5)\n+\n+\n+def test_sample_statistics():\n+    \"\"\" Test that statistics of samples drawn from GP are correct.\"\"\"\n+    for kernel in kernels:\n+        kernel = deepcopy(kernel)\n+        gpr = GaussianProcessRegression(kernel=kernel).fit(\n+            X, y)\n+\n+        y_mean, y_cov = gpr.predict(X2, return_cov=True)\n+\n+        samples = gpr.sample(X2, 1000000)","path":"sklearn/gaussian_process/tests/test_gpr.py","position":108,"original_position":108,"commit_id":"b5d2d16b20166734d8f3583fc75807e2a2ebc7de","original_commit_id":"b5d2d16b20166734d8f3583fc75807e2a2ebc7de","user":{"login":"eickenberg","id":1306635,"avatar_url":"https://avatars.githubusercontent.com/u/1306635?v=3","gravatar_id":"","url":"https://api.github.com/users/eickenberg","html_url":"https://github.com/eickenberg","followers_url":"https://api.github.com/users/eickenberg/followers","following_url":"https://api.github.com/users/eickenberg/following{/other_user}","gists_url":"https://api.github.com/users/eickenberg/gists{/gist_id}","starred_url":"https://api.github.com/users/eickenberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eickenberg/subscriptions","organizations_url":"https://api.github.com/users/eickenberg/orgs","repos_url":"https://api.github.com/users/eickenberg/repos","events_url":"https://api.github.com/users/eickenberg/events{/privacy}","received_events_url":"https://api.github.com/users/eickenberg/received_events","type":"User","site_admin":false},"body":"Would the test work with less samples?","created_at":"2015-02-19T21:48:13Z","updated_at":"2015-02-19T21:48:13Z","html_url":"https://github.com/scikit-learn/scikit-learn/pull/4270#discussion_r25029179","pull_request_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270","_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/25029179"},"html":{"href":"https://github.com/scikit-learn/scikit-learn/pull/4270#discussion_r25029179"},"pull_request":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270"}}},"pull_request":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270","id":29643833,"html_url":"https://github.com/scikit-learn/scikit-learn/pull/4270","diff_url":"https://github.com/scikit-learn/scikit-learn/pull/4270.diff","patch_url":"https://github.com/scikit-learn/scikit-learn/pull/4270.patch","issue_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/4270","number":4270,"state":"open","locked":false,"title":"[WIP] Gaussian process revisited","user":{"login":"jmetzen","id":1116263,"avatar_url":"https://avatars.githubusercontent.com/u/1116263?v=3","gravatar_id":"","url":"https://api.github.com/users/jmetzen","html_url":"https://github.com/jmetzen","followers_url":"https://api.github.com/users/jmetzen/followers","following_url":"https://api.github.com/users/jmetzen/following{/other_user}","gists_url":"https://api.github.com/users/jmetzen/gists{/gist_id}","starred_url":"https://api.github.com/users/jmetzen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmetzen/subscriptions","organizations_url":"https://api.github.com/users/jmetzen/orgs","repos_url":"https://api.github.com/users/jmetzen/repos","events_url":"https://api.github.com/users/jmetzen/events{/privacy}","received_events_url":"https://api.github.com/users/jmetzen/received_events","type":"User","site_admin":false},"body":"This PR intents to address some of the points on the wish list for Gaussian processes that have been discussed on the mailing list recently.  Among the features are\r\n * kernel engineering (combining basic kernels using \"+\" and \"*\" operators)\r\n * gradient-based hyperparameter optimization\r\n * estimating the global noise level as part of the hyperparameter optimization (using a \"WhiteKernel\")\r\n * Gaussian process classification\r\n * sampling of functions from GP prior and GP posterior\r\n\r\nExamples for this PR are (for the moment) in examples/gaussian_process/new. \r\n\r\nThis PR deliberately avoids any interdependency with the existing GP code and starts completely from scratch. This is surely debatable but in my opinion the interface of the existing GP is part of the problem as it separates the specification of the kernel and its parameters which makes more complex kernels close to impossible to specify. Moreover, the existing code is not amenable for extensions, in my opinion. \r\n\r\nThis PR is still in an early state with several open issues and incomplete documentation. Feedback is very welcome. There are definitely some open questions left in this PR, in particular:\r\n * how could we make a transition from the \"old\" GP code to the new one? Do we want to do that or should this code live rather as an extension module outside of sklearn? So far, I haven't removed any of the old code.\r\n * clarify the details of specifying advanced kernels, in particular the lower and upper boundary for the hyperparameters. If someone has an alternative idea to the current triple-based notation (preliminary documentation of this in kernel.py), I am very open for changing it.\r\n\r\nList of todos:\r\n  - [ ] explicit basis function for GPR (GPML book, chapter 2.7)\r\n  - [ ] support multiple restarts of gradient-based optimization\r\n  - [ ] replace deepcopy(kernel) by kernel_with_params()\r\n  - [ ] test kernels for stationarity\r\n  - [ ] implement special method __eq__ for GPs\r\n  - [ ] check dimensionality of returned value of GPC.predict_proba()\r\n  - [ ] complete documentation\r\n  - [ ] check with pep8 and pyflakes\r\n  - [ ] fix failing unit tests\r\n\r\nSome plots:\r\nGP classification\r\n![gpc](https://cloud.githubusercontent.com/assets/1116263/6274705/bde22c48-b879-11e4-9522-dfce288ccba8.png)\r\n\r\nEstimation of noise-level:\r\n![noise-estimation](https://cloud.githubusercontent.com/assets/1116263/6274724/d4dc711a-b879-11e4-9582-43eaaa3dfed2.png)\r\n\r\nIllustration of GP prior and GP posterior based on sample-function:\r\n![prior_posterior](https://cloud.githubusercontent.com/assets/1116263/6274736/eb01f2b2-b879-11e4-9b68-4976be198cd7.png)\r\n\r\n","created_at":"2015-02-19T20:03:01Z","updated_at":"2015-02-19T21:48:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fcd3f58de5264a720ca6f3a7ce467048ca5f9f90","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270/commits","review_comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270/comments","review_comment_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/{number}","comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/4270/comments","statuses_url":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/b5d2d16b20166734d8f3583fc75807e2a2ebc7de","head":{"label":"jmetzen:gp_new","ref":"gp_new","sha":"b5d2d16b20166734d8f3583fc75807e2a2ebc7de","user":{"login":"jmetzen","id":1116263,"avatar_url":"https://avatars.githubusercontent.com/u/1116263?v=3","gravatar_id":"","url":"https://api.github.com/users/jmetzen","html_url":"https://github.com/jmetzen","followers_url":"https://api.github.com/users/jmetzen/followers","following_url":"https://api.github.com/users/jmetzen/following{/other_user}","gists_url":"https://api.github.com/users/jmetzen/gists{/gist_id}","starred_url":"https://api.github.com/users/jmetzen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmetzen/subscriptions","organizations_url":"https://api.github.com/users/jmetzen/orgs","repos_url":"https://api.github.com/users/jmetzen/repos","events_url":"https://api.github.com/users/jmetzen/events{/privacy}","received_events_url":"https://api.github.com/users/jmetzen/received_events","type":"User","site_admin":false},"repo":{"id":15583876,"name":"scikit-learn","full_name":"jmetzen/scikit-learn","owner":{"login":"jmetzen","id":1116263,"avatar_url":"https://avatars.githubusercontent.com/u/1116263?v=3","gravatar_id":"","url":"https://api.github.com/users/jmetzen","html_url":"https://github.com/jmetzen","followers_url":"https://api.github.com/users/jmetzen/followers","following_url":"https://api.github.com/users/jmetzen/following{/other_user}","gists_url":"https://api.github.com/users/jmetzen/gists{/gist_id}","starred_url":"https://api.github.com/users/jmetzen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmetzen/subscriptions","organizations_url":"https://api.github.com/users/jmetzen/orgs","repos_url":"https://api.github.com/users/jmetzen/repos","events_url":"https://api.github.com/users/jmetzen/events{/privacy}","received_events_url":"https://api.github.com/users/jmetzen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jmetzen/scikit-learn","description":"scikit-learn: machine learning in Python","fork":true,"url":"https://api.github.com/repos/jmetzen/scikit-learn","forks_url":"https://api.github.com/repos/jmetzen/scikit-learn/forks","keys_url":"https://api.github.com/repos/jmetzen/scikit-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jmetzen/scikit-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jmetzen/scikit-learn/teams","hooks_url":"https://api.github.com/repos/jmetzen/scikit-learn/hooks","issue_events_url":"https://api.github.com/repos/jmetzen/scikit-learn/issues/events{/number}","events_url":"https://api.github.com/repos/jmetzen/scikit-learn/events","assignees_url":"https://api.github.com/repos/jmetzen/scikit-learn/assignees{/user}","branches_url":"https://api.github.com/repos/jmetzen/scikit-learn/branches{/branch}","tags_url":"https://api.github.com/repos/jmetzen/scikit-learn/tags","blobs_url":"https://api.github.com/repos/jmetzen/scikit-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jmetzen/scikit-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jmetzen/scikit-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/jmetzen/scikit-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jmetzen/scikit-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/jmetzen/scikit-learn/languages","stargazers_url":"https://api.github.com/repos/jmetzen/scikit-learn/stargazers","contributors_url":"https://api.github.com/repos/jmetzen/scikit-learn/contributors","subscribers_url":"https://api.github.com/repos/jmetzen/scikit-learn/subscribers","subscription_url":"https://api.github.com/repos/jmetzen/scikit-learn/subscription","commits_url":"https://api.github.com/repos/jmetzen/scikit-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/jmetzen/scikit-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/jmetzen/scikit-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/jmetzen/scikit-learn/issues/comments/{number}","contents_url":"https://api.github.com/repos/jmetzen/scikit-learn/contents/{+path}","compare_url":"https://api.github.com/repos/jmetzen/scikit-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jmetzen/scikit-learn/merges","archive_url":"https://api.github.com/repos/jmetzen/scikit-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jmetzen/scikit-learn/downloads","issues_url":"https://api.github.com/repos/jmetzen/scikit-learn/issues{/number}","pulls_url":"https://api.github.com/repos/jmetzen/scikit-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/jmetzen/scikit-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/jmetzen/scikit-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jmetzen/scikit-learn/labels{/name}","releases_url":"https://api.github.com/repos/jmetzen/scikit-learn/releases{/id}","created_at":"2014-01-02T13:13:12Z","updated_at":"2015-02-18T16:00:17Z","pushed_at":"2015-02-19T14:56:44Z","git_url":"git://github.com/jmetzen/scikit-learn.git","ssh_url":"git@github.com:jmetzen/scikit-learn.git","clone_url":"https://github.com/jmetzen/scikit-learn.git","svn_url":"https://github.com/jmetzen/scikit-learn","homepage":"http://scikit-learn.org","size":59407,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"scikit-learn:master","ref":"master","sha":"1a88eb01ac8dc09b97cd9403d285a92612478ba0","user":{"login":"scikit-learn","id":365630,"avatar_url":"https://avatars.githubusercontent.com/u/365630?v=3","gravatar_id":"","url":"https://api.github.com/users/scikit-learn","html_url":"https://github.com/scikit-learn","followers_url":"https://api.github.com/users/scikit-learn/followers","following_url":"https://api.github.com/users/scikit-learn/following{/other_user}","gists_url":"https://api.github.com/users/scikit-learn/gists{/gist_id}","starred_url":"https://api.github.com/users/scikit-learn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scikit-learn/subscriptions","organizations_url":"https://api.github.com/users/scikit-learn/orgs","repos_url":"https://api.github.com/users/scikit-learn/repos","events_url":"https://api.github.com/users/scikit-learn/events{/privacy}","received_events_url":"https://api.github.com/users/scikit-learn/received_events","type":"Organization","site_admin":false},"repo":{"id":843222,"name":"scikit-learn","full_name":"scikit-learn/scikit-learn","owner":{"login":"scikit-learn","id":365630,"avatar_url":"https://avatars.githubusercontent.com/u/365630?v=3","gravatar_id":"","url":"https://api.github.com/users/scikit-learn","html_url":"https://github.com/scikit-learn","followers_url":"https://api.github.com/users/scikit-learn/followers","following_url":"https://api.github.com/users/scikit-learn/following{/other_user}","gists_url":"https://api.github.com/users/scikit-learn/gists{/gist_id}","starred_url":"https://api.github.com/users/scikit-learn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scikit-learn/subscriptions","organizations_url":"https://api.github.com/users/scikit-learn/orgs","repos_url":"https://api.github.com/users/scikit-learn/repos","events_url":"https://api.github.com/users/scikit-learn/events{/privacy}","received_events_url":"https://api.github.com/users/scikit-learn/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scikit-learn/scikit-learn","description":"scikit-learn: machine learning in Python","fork":false,"url":"https://api.github.com/repos/scikit-learn/scikit-learn","forks_url":"https://api.github.com/repos/scikit-learn/scikit-learn/forks","keys_url":"https://api.github.com/repos/scikit-learn/scikit-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scikit-learn/scikit-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scikit-learn/scikit-learn/teams","hooks_url":"https://api.github.com/repos/scikit-learn/scikit-learn/hooks","issue_events_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/events{/number}","events_url":"https://api.github.com/repos/scikit-learn/scikit-learn/events","assignees_url":"https://api.github.com/repos/scikit-learn/scikit-learn/assignees{/user}","branches_url":"https://api.github.com/repos/scikit-learn/scikit-learn/branches{/branch}","tags_url":"https://api.github.com/repos/scikit-learn/scikit-learn/tags","blobs_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/scikit-learn/scikit-learn/languages","stargazers_url":"https://api.github.com/repos/scikit-learn/scikit-learn/stargazers","contributors_url":"https://api.github.com/repos/scikit-learn/scikit-learn/contributors","subscribers_url":"https://api.github.com/repos/scikit-learn/scikit-learn/subscribers","subscription_url":"https://api.github.com/repos/scikit-learn/scikit-learn/subscription","commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/comments/{number}","contents_url":"https://api.github.com/repos/scikit-learn/scikit-learn/contents/{+path}","compare_url":"https://api.github.com/repos/scikit-learn/scikit-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scikit-learn/scikit-learn/merges","archive_url":"https://api.github.com/repos/scikit-learn/scikit-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scikit-learn/scikit-learn/downloads","issues_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues{/number}","pulls_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/scikit-learn/scikit-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/scikit-learn/scikit-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scikit-learn/scikit-learn/labels{/name}","releases_url":"https://api.github.com/repos/scikit-learn/scikit-learn/releases{/id}","created_at":"2010-08-17T09:43:38Z","updated_at":"2015-02-19T14:16:06Z","pushed_at":"2015-02-19T13:48:13Z","git_url":"git://github.com/scikit-learn/scikit-learn.git","ssh_url":"git@github.com:scikit-learn/scikit-learn.git","clone_url":"https://github.com/scikit-learn/scikit-learn.git","svn_url":"https://github.com/scikit-learn/scikit-learn","homepage":"http://scikit-learn.org","size":112014,"stargazers_count":5090,"watchers_count":5090,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2992,"mirror_url":null,"open_issues_count":581,"forks":2992,"open_issues":581,"watchers":5090,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270"},"html":{"href":"https://github.com/scikit-learn/scikit-learn/pull/4270"},"issue":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/4270"},"comments":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/4270/comments"},"review_comments":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270/comments"},"review_comment":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/4270/commits"},"statuses":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/b5d2d16b20166734d8f3583fc75807e2a2ebc7de"}}}}