{"action":"created","comment":{"url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/comments/42884238","id":42884238,"diff_hunk":"@@ -0,0 +1,295 @@\n+=====================================\n+Transformers that modify their target\n+=====================================\n+\n+.. topic:: **Summary**\n+\n+    Transformers implement::\n+\n+        self = estimator.fit(X, y=None)\n+        X_transform = estimator.transform(X)\n+        estimator.fit(X, y=None).transform(X) == estimator.fit_transform(X, y)\n+\n+    Many usecases require modifying y. How do we support this?\n+\n+.. sectnum::\n+\n+.. contents:: Table of contents\n+   :depth: 2\n+\n+Rational\n+==========\n+\n+Summary of the contract of transformers\n+----------------------------------------\n+\n+* .transform(...) returns a data matrix X\n+\n+* .transform(...) returns one feature vector for each sample of the input\n+\n+* .fit_transform(...) is the same and .fit(...).transform(...)\n+\n+Examples of usecases targetted\n+-------------------------------\n+\n+#. Over sampling:\n+\n+   #. Class rembalancing: over sampling the minority class in\n+      unbalanced dataset\n+   #. Data enhancement (nudgging images for instance)\n+\n+#. Under-sampling\n+\n+   #. Stateless undersampling: Take one sample out of two\n+   #. Stateful undersampling: apply clustering and transform to cluster\n+      centers\n+   #. Coresets: return a smaller number of samples and associated sample\n+      weights\n+\n+#. Outlier detection:\n+\n+   #. Remove outlier from train set\n+   #. Create a special class 'y' for outliers\n+\n+#. Completing y:\n+\n+   #. Missing data imputation on y\n+   #. Semi-supervised learning (related to above)\n+\n+#. Data loading / conversion\n+\n+   #. Pandas in => (X, y) out\n+   #. Filename in => (X, y) with multiple samples (very useful in\n+      combination with online learning)\n+   #. Database query => (X, y) out\n+\n+#. Aggregate statistics over multiple samples\n+\n+   #. Windowing-like functions on time-series\n+  \n+   In a sense, these are dodgy with scikit-learn's cross-validation API\n+   that knows nothing about sample structure. But the refactor of the CV\n+   API is really helping in this regard.\n+\n+____\n+\n+These usecases pretty much require breaking the contract of the\n+Transformer, as detailed above.\n+\n+The intuition driving this enhancement proposal is that the more the\n+data-processing pipeline becomes rich, the more the data grow, the more\n+the usecases above become important.\n+\n+Enhancements proposed\n+=======================\n+\n+Option A: meta-estimators\n+---------------------------\n+\n+Proposal\n+........\n+\n+This option advocates that any transformer-like usecase that wants to\n+modify y or the number of samples should not be a transformer-like but a\n+specific meta-estimator. A core-set object would thus look like:\n+\n+* From the user perspective::\n+\n+     from sklearn.sample_shrink import BirchCoreSet\n+     from sklearn.ensemble import RandomForest\n+     estimator = BirchCoreSet(RandomForest())\n+\n+* From the developer perspective::\n+\n+     class BirchCoreSet(BaseEstimator):\n+\n+        def fit(self, X, y):\n+            # The logic here is wrong, as we need to handle y:\n+            super(BirchCoreSet, self).fit(X)\n+            X_red = self.subcluster_centers_\n+            self.estimator_.fit(X_red)\n+\n+Benefits\n+.........\n+\n+#. No change to the existing API\n+\n+#. The meta-estimator pattern is very powerful, and pretty much anything\n+   is possible.\n+\n+Limitations\n+............\n+\n+The different limitations listed below are variants of the same\n+conceptual difficulty\n+\n+#. It is hard to have mental models and garantees of what a\n+   meta-estimator does, as it is by definition super versatile\n+\n+   This is both a problem for the beginner, that needs to learn them on\n+   an almost case-by-case basis, and for the advanced user, that needs to\n+   maintain a set of case-specific code\n+\n+#. The \"estimator heap\" problem. \n+\n+   Here the word heap is used to denote the multiple pipelines and\n+   meta-estimators. It corresponds to what we would naturally call a\n+   \"data processing pipeline\", but we use \"heap\" to avoid confusion with\n+   the pipeline object.\n+\n+   Stacks combining many steps of pipelines and meta-estimators become\n+   very hard to inspect and manipulate, both for the user, and for\n+   pipeline-management (aka \"heap-management\") code. Currently, these\n+   difficulties are mostly in user code, so we don't see them too much in\n+   scikit-learn. Here are concrete examples\n+\n+   #. Trying to retrieve coefficients from a models estimated in a\n+      \"heap\". Solving this problem requires \n+      https://github.com/scikit-learn/scikit-learn/issues/2562#issuecomment-27543186\n+      (this enhancement proposal is not advocating to solve the problem\n+      above, but pointing it out as an illustration)\n+\n+   #. DaskLearn has modified the logic of pipeline to expose it as a\n+      computation graph. The reason that it was relatively easy to do is\n+      that there was mostly one object to modify to do the dispatching,\n+      the Pipeline object.\n+\n+   #. A future, out-of-core \"conductor\" object to fit a \"stack\" in out of\n+      core by connecting it to a data-store would need to have a\n+      representation of the stack. For instance, when chaining random\n+      projections with Birch coresets and finally SGD, the user would\n+      need to specify that random projections are stateless, birch needs\n+      to do one pass of the data, and SGD a few. Given this information,\n+      the conductor could orchestrate pull the data from the data source,\n+      and sending it to the various steps. Such an object is much harder\n+      to implement if the various steps are to be combined in a heap.\n+\n+      Note that this is not a problem in non out-of-core settings, in the\n+      sense that the BirchCoreSet meta-estimator would take care of doing\n+      a pass on the data before feeding it to its sub estimator.\n+\n+In conclusion, meta-estimators are harder to comprehend (problem 1) and\n+write (problem 2).\n+\n+That said, we will never get rid of meta estimators. It is a very\n+powerful pattern. The discussion here is about extending a bit the\n+estimator API to have a less pressing need for meta-estimators.\n+\n+Option B: transformer-like that modify y\n+------------------------------------------\n+\n+.. note:: Two variants of this option exist:\n+\n+    1. Changing the semantics of transformers to modify y and return\n+       something more complex than a data matrix X\n+\n+    2. Introducing a new type of object\n+\n+    Their is an emerging consensus for option 2.\n+\n+Proposal\n+.........\n+\n+Introduce a `TransformPipe` type of object with the following API\n+(names are discussed below):\n+\n+* `X_new, y_new = estimator.fit_pipe(X, y)`\n+\n+* `X_new, y_new = estimator.transform_pipe(X, y)`\n+\n+Or:\n+\n+* `X_new, y_new, sample_props = estimator.fit_pipe(X, y)`\n+\n+* `X_new, y_new, sample_props = estimator.transform_pipe(X, y)`\n+\n+Contracts (these are weaker contracts than the transformer:\n+\n+* Neither `fit_pipe` nor `transform_pipe` are guarantied to keep the\n+  number of samples unchanged.\n+\n+* transform_pipe is not equivalent to .fit_pipe.transform\n+\n+Design questions\n+....................\n+\n+#. Should there be a fit method?\n+\n+   In such estimators, it may not be a good idea to call fit rather than\n+   fit_pipe (for instance in coreset).\n+\n+\n+#. At test time, how does a pipeline use such an object?\n+\n+   #. Should there be a transform method used at test time?\n+\n+   #. What to do with objects that implement both `transform` and\n+      `transform_pipe`?\n+\n+   For some usecases, test time needs to modify the number of samples\n+   (for instance data loading from a file). However, these will by\n+   construction a problem for eg cross-val-score, as they need to","path":"slep001/discussion.rst","position":null,"original_position":231,"commit_id":"fdfe4211e1d4714df93fe2185b6d2c2072bb8216","original_commit_id":"f6afffbfda052709646973c62e1b1565b2d675b7","user":{"login":"GaelVaroquaux","id":208217,"avatar_url":"https://avatars.githubusercontent.com/u/208217?v=3","gravatar_id":"","url":"https://api.github.com/users/GaelVaroquaux","html_url":"https://github.com/GaelVaroquaux","followers_url":"https://api.github.com/users/GaelVaroquaux/followers","following_url":"https://api.github.com/users/GaelVaroquaux/following{/other_user}","gists_url":"https://api.github.com/users/GaelVaroquaux/gists{/gist_id}","starred_url":"https://api.github.com/users/GaelVaroquaux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GaelVaroquaux/subscriptions","organizations_url":"https://api.github.com/users/GaelVaroquaux/orgs","repos_url":"https://api.github.com/users/GaelVaroquaux/repos","events_url":"https://api.github.com/users/GaelVaroquaux/events{/privacy}","received_events_url":"https://api.github.com/users/GaelVaroquaux/received_events","type":"User","site_admin":false},"body":"> ooohhh. for some reason I thought that worked. We can make\n> Pipeline.score work. But using a custom scorer it's a bit unclear.\n\n+1. But maybe with crazy ideas of having pipeline accept a scorer it's\npossible.\n","created_at":"2015-10-23T16:20:33Z","updated_at":"2015-10-23T16:20:33Z","html_url":"https://github.com/scikit-learn/enhancement_proposals/pull/2#discussion_r42884238","pull_request_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/comments/42884238"},"html":{"href":"https://github.com/scikit-learn/enhancement_proposals/pull/2#discussion_r42884238"},"pull_request":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2","id":48459641,"html_url":"https://github.com/scikit-learn/enhancement_proposals/pull/2","diff_url":"https://github.com/scikit-learn/enhancement_proposals/pull/2.diff","patch_url":"https://github.com/scikit-learn/enhancement_proposals/pull/2.patch","issue_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues/2","number":2,"state":"open","locked":false,"title":"WIP: transformers that modify y","user":{"login":"GaelVaroquaux","id":208217,"avatar_url":"https://avatars.githubusercontent.com/u/208217?v=3","gravatar_id":"","url":"https://api.github.com/users/GaelVaroquaux","html_url":"https://github.com/GaelVaroquaux","followers_url":"https://api.github.com/users/GaelVaroquaux/followers","following_url":"https://api.github.com/users/GaelVaroquaux/following{/other_user}","gists_url":"https://api.github.com/users/GaelVaroquaux/gists{/gist_id}","starred_url":"https://api.github.com/users/GaelVaroquaux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GaelVaroquaux/subscriptions","organizations_url":"https://api.github.com/users/GaelVaroquaux/orgs","repos_url":"https://api.github.com/users/GaelVaroquaux/repos","events_url":"https://api.github.com/users/GaelVaroquaux/events{/privacy}","received_events_url":"https://api.github.com/users/GaelVaroquaux/received_events","type":"User","site_admin":false},"body":"This is almost ready for early discussion:\r\n\r\nBest way to look at the proposal is:\r\nhttps://github.com/GaelVaroquaux/enhancement_proposals/blob/transform_y/slep001/discussion.rst","created_at":"2015-10-22T13:50:29Z","updated_at":"2015-10-23T16:20:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"37748fdb061c9762968e5c31d64e06f706536836","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2/commits","review_comments_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2/comments","review_comment_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues/2/comments","statuses_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/statuses/fdfe4211e1d4714df93fe2185b6d2c2072bb8216","head":{"label":"GaelVaroquaux:transform_y","ref":"transform_y","sha":"fdfe4211e1d4714df93fe2185b6d2c2072bb8216","user":{"login":"GaelVaroquaux","id":208217,"avatar_url":"https://avatars.githubusercontent.com/u/208217?v=3","gravatar_id":"","url":"https://api.github.com/users/GaelVaroquaux","html_url":"https://github.com/GaelVaroquaux","followers_url":"https://api.github.com/users/GaelVaroquaux/followers","following_url":"https://api.github.com/users/GaelVaroquaux/following{/other_user}","gists_url":"https://api.github.com/users/GaelVaroquaux/gists{/gist_id}","starred_url":"https://api.github.com/users/GaelVaroquaux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GaelVaroquaux/subscriptions","organizations_url":"https://api.github.com/users/GaelVaroquaux/orgs","repos_url":"https://api.github.com/users/GaelVaroquaux/repos","events_url":"https://api.github.com/users/GaelVaroquaux/events{/privacy}","received_events_url":"https://api.github.com/users/GaelVaroquaux/received_events","type":"User","site_admin":false},"repo":{"id":44748136,"name":"enhancement_proposals","full_name":"GaelVaroquaux/enhancement_proposals","owner":{"login":"GaelVaroquaux","id":208217,"avatar_url":"https://avatars.githubusercontent.com/u/208217?v=3","gravatar_id":"","url":"https://api.github.com/users/GaelVaroquaux","html_url":"https://github.com/GaelVaroquaux","followers_url":"https://api.github.com/users/GaelVaroquaux/followers","following_url":"https://api.github.com/users/GaelVaroquaux/following{/other_user}","gists_url":"https://api.github.com/users/GaelVaroquaux/gists{/gist_id}","starred_url":"https://api.github.com/users/GaelVaroquaux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GaelVaroquaux/subscriptions","organizations_url":"https://api.github.com/users/GaelVaroquaux/orgs","repos_url":"https://api.github.com/users/GaelVaroquaux/repos","events_url":"https://api.github.com/users/GaelVaroquaux/events{/privacy}","received_events_url":"https://api.github.com/users/GaelVaroquaux/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/GaelVaroquaux/enhancement_proposals","description":"Enhancement proposals for scikit-learn: structured discussions and rational for large additions and modifications","fork":true,"url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals","forks_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/forks","keys_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/teams","hooks_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/hooks","issue_events_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/issues/events{/number}","events_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/events","assignees_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/assignees{/user}","branches_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/branches{/branch}","tags_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/tags","blobs_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/git/refs{/sha}","trees_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/statuses/{sha}","languages_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/languages","stargazers_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/stargazers","contributors_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/contributors","subscribers_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/subscribers","subscription_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/subscription","commits_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/commits{/sha}","git_commits_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/git/commits{/sha}","comments_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/comments{/number}","issue_comment_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/issues/comments{/number}","contents_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/contents/{+path}","compare_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/merges","archive_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/downloads","issues_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/issues{/number}","pulls_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/pulls{/number}","milestones_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/milestones{/number}","notifications_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/labels{/name}","releases_url":"https://api.github.com/repos/GaelVaroquaux/enhancement_proposals/releases{/id}","created_at":"2015-10-22T13:48:52Z","updated_at":"2015-10-22T11:06:45Z","pushed_at":"2015-10-23T16:15:09Z","git_url":"git://github.com/GaelVaroquaux/enhancement_proposals.git","ssh_url":"git@github.com:GaelVaroquaux/enhancement_proposals.git","clone_url":"https://github.com/GaelVaroquaux/enhancement_proposals.git","svn_url":"https://github.com/GaelVaroquaux/enhancement_proposals","homepage":null,"size":0,"stargazers_count":0,"watchers_count":0,"language":null,"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":"6931f7a7e614b6a2ffcb9b0162323955b9304968","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":44739348,"name":"enhancement_proposals","full_name":"scikit-learn/enhancement_proposals","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/enhancement_proposals","description":"Enhancement proposals for scikit-learn: structured discussions and rational for large additions and modifications","fork":false,"url":"https://api.github.com/repos/scikit-learn/enhancement_proposals","forks_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/forks","keys_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/teams","hooks_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/hooks","issue_events_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues/events{/number}","events_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/events","assignees_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/assignees{/user}","branches_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/branches{/branch}","tags_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/tags","blobs_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/git/refs{/sha}","trees_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/statuses/{sha}","languages_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/languages","stargazers_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/stargazers","contributors_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/contributors","subscribers_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/subscribers","subscription_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/subscription","commits_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/commits{/sha}","git_commits_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/git/commits{/sha}","comments_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/comments{/number}","issue_comment_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues/comments{/number}","contents_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/contents/{+path}","compare_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/merges","archive_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/downloads","issues_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues{/number}","pulls_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls{/number}","milestones_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/milestones{/number}","notifications_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/labels{/name}","releases_url":"https://api.github.com/repos/scikit-learn/enhancement_proposals/releases{/id}","created_at":"2015-10-22T10:49:07Z","updated_at":"2015-10-22T11:06:45Z","pushed_at":"2015-10-23T16:15:09Z","git_url":"git://github.com/scikit-learn/enhancement_proposals.git","ssh_url":"git@github.com:scikit-learn/enhancement_proposals.git","clone_url":"https://github.com/scikit-learn/enhancement_proposals.git","svn_url":"https://github.com/scikit-learn/enhancement_proposals","homepage":null,"size":0,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2"},"html":{"href":"https://github.com/scikit-learn/enhancement_proposals/pull/2"},"issue":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues/2"},"comments":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/scikit-learn/enhancement_proposals/statuses/fdfe4211e1d4714df93fe2185b6d2c2072bb8216"}}}}