{"action":"created","comment":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/30913333","id":30913333,"diff_hunk":"@@ -393,6 +403,177 @@ def assert_raise_message(exception, message, function, *args, **kwargs):\n         exception, re.escape(message), function, *args, **kwargs)\n \n \n+def assert_array_not_equal(x, y, err_msg=\"The arrays are equal\", verbose=True):\n+    \"\"\"Raises an AssertionError if two array-like objects are equal.\"\"\"\n+    try:\n+        assert_array_equal(x, y, verbose=verbose)\n+    except AssertionError:\n+        return\n+    raise AssertionError(err_msg)\n+\n+\n+def _assert_same_model_method(method, X, estimator1, estimator2, msg=None):\n+    if hasattr(estimator1, method):\n+        m = '%r\\n\\nhas %s, but\\n\\n%r\\n\\ndoes not' % (estimator1,\n+                                                     method,\n+                                                     estimator2)\n+\n+        if not hasattr(estimator2, method):\n+            raise AttributeError(m)\n+\n+        # Check if the method(X) returns the same for both models.\n+        res1 = getattr(estimator1, method)(X)\n+        res2 = getattr(estimator2, method)(X)\n+        same_model = (res1.shape == res2.shape) and np.allclose(res1, res2)\n+\n+        if msg is None:\n+            msg = (\"Models are not equal. \\n\\n%s method returned\"\n+                   \" different results:\\n\\n%r\\n\\n and\\n\\n%r\\n\\n for :\\n\\n%r\"\n+                   \"\\n\\nand :\\n\\n%r\" % (method, res1, res2,\n+                                        estimator1, estimator2))\n+\n+        assert same_model, msg\n+\n+\n+def _not_same_model_method(method, X, estimator1, estimator2):\n+    \"\"\"Return True if both estimators return same result for given method\"\"\"\n+    if hasattr(estimator1, method):\n+        m = '%r\\n\\nhas %s, but\\n\\n%r\\n\\ndoes not' % (estimator1,\n+                                                     method,\n+                                                     estimator2)\n+\n+        if not hasattr(estimator2, method):\n+            raise AttributeError(m)\n+\n+        # Check if the method(X) returns the same result for both models.\n+        res1 = getattr(estimator1, method)(X)\n+        res2 = getattr(estimator2, method)(X)\n+        not_same_model = (res1.shape != res2.shape) or not np.allclose(res1,\n+                                                                       res2)\n+\n+        # NOTE Do not assert here. This is to facilitate checking using any()\n+        # of the results of multiple checks.\n+        return not_same_model\n+    return False  # if the method does not exist.\n+\n+\n+def assert_same_model(X, estimator1, estimator2, msg=None):\n+    \"\"\"Helper function to check if models are same\"\"\"\n+    _assert_same_model_method('predict', X, estimator1, estimator2, msg)\n+    _assert_same_model_method('transform', X, estimator1, estimator2, msg)\n+    _assert_same_model_method('decision_function',\n+                              X, estimator1, estimator2, msg)\n+    _assert_same_model_method('predict_proba',\n+                              X, estimator1, estimator2, msg)\n+\n+    assert_fitted_attributes_equal(estimator1, estimator2)\n+\n+\n+def assert_not_same_model(X, estimator1, estimator2, msg=None):\n+    \"\"\"Helper function to check if models are different\"\"\"\n+    t1 = _not_same_model_method('predict', X, estimator1, estimator2)\n+    t2 = _not_same_model_method('transform', X, estimator1, estimator2)\n+    t3 = _not_same_model_method('decision_function', X, estimator1, estimator2)\n+    t4 = _not_same_model_method('predict_proba', X, estimator1, estimator2)\n+\n+    if msg is None:\n+        msg = (\"Models are equal. Both models returned the same results for\"\n+               \" all the methods.\")\n+\n+    any_method_differed = any((t1, t2, t3, t4))\n+\n+    if not any_method_differed:\n+        # If all methods return similar results for both ests or if those\n+        # methods are not present\n+        assert_fitted_attributes_not_equal(estimator1, estimator2)\n+\n+\n+def _attributes_equal(estimator1, estimator2):\n+    \"\"\"Helper function to check if fitted model attributes are equal or not\n+\n+    Raises AssertionError if the attributes are not equal.\n+    \"\"\"\n+\n+    # A list of attributes which are known to be inconsistent.\n+    skip_attributes = ('embedding_', 'weights_')\n+    est1_dict = estimator1.__dict__\n+    est2_dict = estimator2.__dict__\n+    # TODO Add more comparables\n+    # TODO Support sparse matrices?\n+    comparables = [list, np.ndarray, np.float64, float, int, 'str']\n+\n+    # Collect all attributes from both the models\n+    for attr, value1 in est1_dict.items():\n+        if ((not attr.endswith('_')) or attr.endswith('estimator_') or\n+                attr.endswith('estimators_') or\n+                type(value1) not in comparables or\n+                attr in skip_attributes):\n+            continue","path":"sklearn/utils/testing.py","position":153,"original_position":153,"commit_id":"ec56d3fc439a5f1824d5ac43464f6fcc008778d6","original_commit_id":"ec56d3fc439a5f1824d5ac43464f6fcc008778d6","user":{"login":"rvraghav93","id":9487348,"avatar_url":"https://avatars.githubusercontent.com/u/9487348?v=3","gravatar_id":"","url":"https://api.github.com/users/rvraghav93","html_url":"https://github.com/rvraghav93","followers_url":"https://api.github.com/users/rvraghav93/followers","following_url":"https://api.github.com/users/rvraghav93/following{/other_user}","gists_url":"https://api.github.com/users/rvraghav93/gists{/gist_id}","starred_url":"https://api.github.com/users/rvraghav93/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rvraghav93/subscriptions","organizations_url":"https://api.github.com/users/rvraghav93/orgs","repos_url":"https://api.github.com/users/rvraghav93/repos","events_url":"https://api.github.com/users/rvraghav93/events{/privacy}","received_events_url":"https://api.github.com/users/rvraghav93/received_events","type":"User","site_admin":false},"body":"Could you elaborate... did you mean we should recurse if the attrs are non-comparable as in dict? In which case wouldn't it become a bit complex? :)","created_at":"2015-05-22T17:15:43Z","updated_at":"2015-05-22T17:15:43Z","html_url":"https://github.com/scikit-learn/scikit-learn/pull/3907#discussion_r30913333","pull_request_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907","_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/comments/30913333"},"html":{"href":"https://github.com/scikit-learn/scikit-learn/pull/3907#discussion_r30913333"},"pull_request":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907"}}},"pull_request":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907","id":25225369,"html_url":"https://github.com/scikit-learn/scikit-learn/pull/3907","diff_url":"https://github.com/scikit-learn/scikit-learn/pull/3907.diff","patch_url":"https://github.com/scikit-learn/scikit-learn/pull/3907.patch","issue_url":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/3907","number":3907,"state":"open","locked":false,"title":"[MRG] Adding tests for estimators implementing `partial_fit` and a few other related fixes / enhancements","user":{"login":"rvraghav93","id":9487348,"avatar_url":"https://avatars.githubusercontent.com/u/9487348?v=3","gravatar_id":"","url":"https://api.github.com/users/rvraghav93","html_url":"https://github.com/rvraghav93","followers_url":"https://api.github.com/users/rvraghav93/followers","following_url":"https://api.github.com/users/rvraghav93/following{/other_user}","gists_url":"https://api.github.com/users/rvraghav93/gists{/gist_id}","starred_url":"https://api.github.com/users/rvraghav93/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rvraghav93/subscriptions","organizations_url":"https://api.github.com/users/rvraghav93/orgs","repos_url":"https://api.github.com/users/rvraghav93/repos","events_url":"https://api.github.com/users/rvraghav93/events{/privacy}","received_events_url":"https://api.github.com/users/rvraghav93/received_events","type":"User","site_admin":false},"body":"Fixes #3896 \r\n\r\n**New `partial_fit` tests:**\r\nThe below tests are based off @arjoly's [suggestion](https://github.com/scikit-learn/scikit-learn/issues/3896#issuecomment-64862823).\r\n\r\n- [x] 1. General tests\r\n  * Assert that `partial_fit` returns `self`. - Thanks @jnothman for [the suggestion.]\r\n(https://github.com/scikit-learn/scikit-learn/issues/3896#issue-50330161)\r\n  * Clone test... `assert clone(est).partial_fit == est.partial_fit`\r\n\r\n- [x] 2. Check that an error is raised if the number of features changes.\r\n\r\n- [x] 3. Estimator reset test\r\n  * Check that doing `fit` after a set of `fit` / `partial_fit` restarts the estimator.\r\n  * Assert that `partial_fit` and then `fit` with a different number of features works without raising any Exceptions... - Thanks @amueller for [the suggestion](https://github.com/scikit-learn/scikit-learn/pull/3907#issuecomment-68411916)\r\n\r\n- [x] 4. Check if `partial_fit` does not overwrite the previous model.\r\n  * Based on @jnothman [suggestion](https://github.com/scikit-learn/scikit-learn/pull/3907#issuecomment-68478630)\r\n\r\n- [x] 5. Check that classifier handles correctly the classes argument in the `partial_fit`.\r\n  * a. Check if mismatch between `classes` argument and `np.unique(y_i)` raises `ValueError`.\r\n  * b. Check that error is raised if `classes` is not specified during first `partial_fit` call.\r\n  * c. Check error is not raised if `classes` is not specified during subsequent calls.\r\n\r\n- [x] Helper functions\r\n  * `_validate_y_against_classes` - Check label mismatch between `y` and `classes` arg\r\n  * `assert_same_model(X, est1, est2)`\r\n  * `assert_not_same_model(X, est1, est2)`\r\n      * Use `predict`, `transform`, `decision_function` and `predict_proba` to check equality of models.\r\n  * In `sklearn.utils.estimator_checks` `_partial_fit` and `_fit` to use the appropriate parameters.\r\n  * `assert_attributes_equal(est1, est2)`\r\n  * `assert_attributes_not_equal(est1, est2)`\r\n  * `assert_array_not_equal`\r\n\r\n**Refs**\r\nAlso see #406 - This PR fixes 1st under not so easy for pfit-able estimators, via 3a ( of this PR )","created_at":"2014-11-29T17:50:48Z","updated_at":"2015-05-22T17:15:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6c73f23e6c015846fc564783a27c5605218e6c14","assignee":null,"milestone":{"url":"https://api.github.com/repos/scikit-learn/scikit-learn/milestones/15","html_url":"https://github.com/scikit-learn/scikit-learn/milestones/0.17","labels_url":"https://api.github.com/repos/scikit-learn/scikit-learn/milestones/15/labels","id":995666,"number":15,"title":"0.17","description":"","creator":{"login":"amueller","id":449558,"avatar_url":"https://avatars.githubusercontent.com/u/449558?v=3","gravatar_id":"","url":"https://api.github.com/users/amueller","html_url":"https://github.com/amueller","followers_url":"https://api.github.com/users/amueller/followers","following_url":"https://api.github.com/users/amueller/following{/other_user}","gists_url":"https://api.github.com/users/amueller/gists{/gist_id}","starred_url":"https://api.github.com/users/amueller/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amueller/subscriptions","organizations_url":"https://api.github.com/users/amueller/orgs","repos_url":"https://api.github.com/users/amueller/repos","events_url":"https://api.github.com/users/amueller/events{/privacy}","received_events_url":"https://api.github.com/users/amueller/received_events","type":"User","site_admin":false},"open_issues":11,"closed_issues":3,"state":"open","created_at":"2015-02-25T18:59:07Z","updated_at":"2015-05-20T15:06:56Z","due_on":"2015-07-01T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907/commits","review_comments_url":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907/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/3907/comments","statuses_url":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/ec56d3fc439a5f1824d5ac43464f6fcc008778d6","head":{"label":"rvraghav93:partial_fit_testing_3896","ref":"partial_fit_testing_3896","sha":"ec56d3fc439a5f1824d5ac43464f6fcc008778d6","user":{"login":"rvraghav93","id":9487348,"avatar_url":"https://avatars.githubusercontent.com/u/9487348?v=3","gravatar_id":"","url":"https://api.github.com/users/rvraghav93","html_url":"https://github.com/rvraghav93","followers_url":"https://api.github.com/users/rvraghav93/followers","following_url":"https://api.github.com/users/rvraghav93/following{/other_user}","gists_url":"https://api.github.com/users/rvraghav93/gists{/gist_id}","starred_url":"https://api.github.com/users/rvraghav93/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rvraghav93/subscriptions","organizations_url":"https://api.github.com/users/rvraghav93/orgs","repos_url":"https://api.github.com/users/rvraghav93/repos","events_url":"https://api.github.com/users/rvraghav93/events{/privacy}","received_events_url":"https://api.github.com/users/rvraghav93/received_events","type":"User","site_admin":false},"repo":{"id":26038110,"name":"scikit-learn","full_name":"rvraghav93/scikit-learn","owner":{"login":"rvraghav93","id":9487348,"avatar_url":"https://avatars.githubusercontent.com/u/9487348?v=3","gravatar_id":"","url":"https://api.github.com/users/rvraghav93","html_url":"https://github.com/rvraghav93","followers_url":"https://api.github.com/users/rvraghav93/followers","following_url":"https://api.github.com/users/rvraghav93/following{/other_user}","gists_url":"https://api.github.com/users/rvraghav93/gists{/gist_id}","starred_url":"https://api.github.com/users/rvraghav93/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rvraghav93/subscriptions","organizations_url":"https://api.github.com/users/rvraghav93/orgs","repos_url":"https://api.github.com/users/rvraghav93/repos","events_url":"https://api.github.com/users/rvraghav93/events{/privacy}","received_events_url":"https://api.github.com/users/rvraghav93/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rvraghav93/scikit-learn","description":"scikit-learn: machine learning in Python","fork":true,"url":"https://api.github.com/repos/rvraghav93/scikit-learn","forks_url":"https://api.github.com/repos/rvraghav93/scikit-learn/forks","keys_url":"https://api.github.com/repos/rvraghav93/scikit-learn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rvraghav93/scikit-learn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rvraghav93/scikit-learn/teams","hooks_url":"https://api.github.com/repos/rvraghav93/scikit-learn/hooks","issue_events_url":"https://api.github.com/repos/rvraghav93/scikit-learn/issues/events{/number}","events_url":"https://api.github.com/repos/rvraghav93/scikit-learn/events","assignees_url":"https://api.github.com/repos/rvraghav93/scikit-learn/assignees{/user}","branches_url":"https://api.github.com/repos/rvraghav93/scikit-learn/branches{/branch}","tags_url":"https://api.github.com/repos/rvraghav93/scikit-learn/tags","blobs_url":"https://api.github.com/repos/rvraghav93/scikit-learn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rvraghav93/scikit-learn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rvraghav93/scikit-learn/git/refs{/sha}","trees_url":"https://api.github.com/repos/rvraghav93/scikit-learn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rvraghav93/scikit-learn/statuses/{sha}","languages_url":"https://api.github.com/repos/rvraghav93/scikit-learn/languages","stargazers_url":"https://api.github.com/repos/rvraghav93/scikit-learn/stargazers","contributors_url":"https://api.github.com/repos/rvraghav93/scikit-learn/contributors","subscribers_url":"https://api.github.com/repos/rvraghav93/scikit-learn/subscribers","subscription_url":"https://api.github.com/repos/rvraghav93/scikit-learn/subscription","commits_url":"https://api.github.com/repos/rvraghav93/scikit-learn/commits{/sha}","git_commits_url":"https://api.github.com/repos/rvraghav93/scikit-learn/git/commits{/sha}","comments_url":"https://api.github.com/repos/rvraghav93/scikit-learn/comments{/number}","issue_comment_url":"https://api.github.com/repos/rvraghav93/scikit-learn/issues/comments{/number}","contents_url":"https://api.github.com/repos/rvraghav93/scikit-learn/contents/{+path}","compare_url":"https://api.github.com/repos/rvraghav93/scikit-learn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rvraghav93/scikit-learn/merges","archive_url":"https://api.github.com/repos/rvraghav93/scikit-learn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rvraghav93/scikit-learn/downloads","issues_url":"https://api.github.com/repos/rvraghav93/scikit-learn/issues{/number}","pulls_url":"https://api.github.com/repos/rvraghav93/scikit-learn/pulls{/number}","milestones_url":"https://api.github.com/repos/rvraghav93/scikit-learn/milestones{/number}","notifications_url":"https://api.github.com/repos/rvraghav93/scikit-learn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rvraghav93/scikit-learn/labels{/name}","releases_url":"https://api.github.com/repos/rvraghav93/scikit-learn/releases{/id}","created_at":"2014-11-01T00:56:31Z","updated_at":"2015-05-03T17:08:25Z","pushed_at":"2015-05-18T22:35:20Z","git_url":"git://github.com/rvraghav93/scikit-learn.git","ssh_url":"git@github.com:rvraghav93/scikit-learn.git","clone_url":"https://github.com/rvraghav93/scikit-learn.git","svn_url":"https://github.com/rvraghav93/scikit-learn","homepage":"http://scikit-learn.org","size":63806,"stargazers_count":0,"watchers_count":0,"language":"Python","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":0,"default_branch":"master"}},"base":{"label":"scikit-learn:master","ref":"master","sha":"d7475414db9eda7a855268008fc386fa234f1d65","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-05-22T17:05:40Z","pushed_at":"2015-05-22T13:44:17Z","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":128530,"stargazers_count":6083,"watchers_count":6083,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3643,"mirror_url":null,"open_issues_count":659,"forks":3643,"open_issues":659,"watchers":6083,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907"},"html":{"href":"https://github.com/scikit-learn/scikit-learn/pull/3907"},"issue":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/3907"},"comments":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/issues/3907/comments"},"review_comments":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/pulls/3907/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/3907/commits"},"statuses":{"href":"https://api.github.com/repos/scikit-learn/scikit-learn/statuses/ec56d3fc439a5f1824d5ac43464f6fcc008778d6"}}}}