{"id":39493875,"url":"https://github.com/code-dot-org/ml-playground","last_synced_at":"2026-01-18T05:39:38.917Z","repository":{"id":45570258,"uuid":"279679609","full_name":"code-dot-org/ml-playground","owner":"code-dot-org","description":"This is the repo for AI Lab from Code.org.","archived":false,"fork":false,"pushed_at":"2023-05-18T22:50:38.000Z","size":31586,"stargazers_count":5,"open_issues_count":0,"forks_count":8,"subscribers_count":20,"default_branch":"main","last_synced_at":"2024-08-21T23:50:38.504Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/code-dot-org.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-14T19:51:20.000Z","updated_at":"2024-08-21T23:50:38.504Z","dependencies_parsed_at":"2024-06-19T22:49:07.747Z","dependency_job_id":"f6b228e9-2a27-418f-bf75-cc1eb26dda8b","html_url":"https://github.com/code-dot-org/ml-playground","commit_stats":{"total_commits":969,"total_committers":15,"mean_commits":64.6,"dds":0.6388028895768834,"last_synced_commit":"2c53d3c6ff97b61bed323c0bdca658ac92163753"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/code-dot-org/ml-playground","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-dot-org%2Fml-playground","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-dot-org%2Fml-playground/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-dot-org%2Fml-playground/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-dot-org%2Fml-playground/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/code-dot-org","download_url":"https://codeload.github.com/code-dot-org/ml-playground/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code-dot-org%2Fml-playground/sbom","scorecard":{"id":295594,"data":{"date":"2025-08-11","repo":{"name":"github.com/code-dot-org/ml-playground","commit":"07f5171195dae794ada82e3e5b1176a84e292659"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":7,"reason":"Found 7/10 approved changesets -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/code-dot-org/ml-playground/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/code-dot-org/ml-playground/main.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"99 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p","Warn: Project is vulnerable to: GHSA-phwq-j96m-2c2q","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-r9p9-mrjm-926w","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-8hfj-j24r-96c4","Warn: Project is vulnerable to: GHSA-wc69-rhjr-hc9g","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-h9rv-jmmf-4pgx","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-394c-5j6w-4xmx","Warn: Project is vulnerable to: GHSA-78cj-fxph-m83p","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-9m6j-fcg5-2442","Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc","Warn: Project is vulnerable to: GHSA-rqff-837h-mm52","Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2","Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j","Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp","Warn: Project is vulnerable to: GHSA-mpwj-fcr6-x34c"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T19:24:53.772Z","repository_id":45570258,"created_at":"2025-08-17T19:24:53.772Z","updated_at":"2025-08-17T19:24:53.772Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531185,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-18T05:39:38.241Z","updated_at":"2026-01-18T05:39:38.910Z","avatar_url":"https://github.com/code-dot-org.png","language":"JavaScript","readme":"# ml-playground\n\nThis is the repo for AI Lab from Code.org.\n\nLike the [Dance Party](https://github.com/code-dot-org/dance-party) and [AI for Oceans](https://github.com/code-dot-org/ml-activities) repos, it is a standalone repo that is published and consumed by the [main repo](https://github.com/code-dot-org/code-dot-org).\n\nAI Lab is a highly configurable environment providing a student experience for doing the following:\n\n- loading tabular data (from a pre-loaded CSV with JSON metadata, or from a user-uploaded CSV)\n- choosing which column to predict (the label)\n- choosing which column(s) to use for the prediction (the features)\n- handling both categorical and continuous (numerical) columns\n- viewing per-column graphs and metadata\n- viewing custom [CrossTab](https://github.com/code-dot-org/ml-playground/pull/62) tables for comparing categorical columns\n- viewing scatter plot graphs for comparing continuous columns\n- using KNN classification or KNN regression to train a model\n- choosing the subset of data to reserve for validation\n- measuring accuracy of the resulting trained model using reserved data\n- using the trained model by doing predictions\n- saving the trained model to the server for use in App Lab\n\nIt can be run standalone for more rapid development, though its ultimate destination is to appear in [Code Studio](https://studio.code.org/).  When run standalone, it does not have all of the styling of Code Studio.  It also calls stub functions for completion, saving a trained model, and indicating which [Dynamic](https://github.com/code-dot-org/code-dot-org/pull/39384) [Instruction](https://github.com/code-dot-org/ml-playground/pull/97) should be shown.  The standalone runtime does have a dropdown for selecting which set of level parameters are used, in lieu of a level providing these parameters, and it also shows the current Dynamic Instruction identifier.\n\nThe standalone runtime is also deployed to https://code-dot-org.github.io/ml-playground/ though we might vary which branch is published there.\n\n## Demo recording\n\nhttps://user-images.githubusercontent.com/2205926/125634349-a30d64f3-6e05-41ac-a2fc-b82ab794b18f.mov\n\n## Design notes\n\n#### Navigation\nThe app uses a scene-by-scene approach, similar to AI for Oceans.  It has centralized logic to handle whether the Previous and Next buttons should show, and separately whether they should be enabled.  The app enforces a lot of required user actions simply by not enabling a button until a state has been set.  For example, the user can't navigate forward from label selection until they have selected a label.\n\n#### Dynamic Instructions\nWe wanted to make use of the existing instructions infrastructure provided by the main repo, which has things like text-to-speech support and authoring UI in levelbuilder.  But we also wanted a way to provide dynamic instructions tailored to each scene in the app.  We experimented with a variety of combinations, but they often led to a busy combination of lengthy instructions (since they were addressing every step in AI Lab) in the regular instruction panel at the top, along with custom instructions below in the AI Lab app area.\n\nThe creation of [Dynamic Instructions](https://github.com/code-dot-org/code-dot-org/pull/39384) was the breakthrough that gave us the best of both worlds.  They can be authored in levelbuilder, use the existing text-to-speech system, and can also be used outside of AI Lab.  They encourage instructions to be written for just the current panel on the screen.  (They can also be triggered by other states in the app for specific instructions at those moments in time.)  They do not dynamically resize, so the screen below them does not shift around, and they are guaranteed to always be fully readable without needing scrolling.  And best of all, they empower curriculum designers to explain what's happening in each level with minimal changes required in the app itself.  (That said, adding new Dynamic Instructions for specific states in the app is very easy.)\n\n#### Responsiveness\nThe app is horizontally responsive, though it doesn't need to collapse all the way to mobile widths because our host site manages the viewport on mobile devices and also enforces landscape viewing.\n\nThe app is vertically responsive, and uses flexbox to fill the vertical space with a combination of fixed- and variable-height elements.\n\n#### Adding a dataset\nTo add a new \"pre-canned\" dataset to the tool, add three files - `.csv`, `.json`, and `.jpg` - to [this directory](https://github.com/code-dot-org/ml-playground/tree/951bbad5562e01fa0c81279aab0239db26d17f15/public/datasets).  Then add the dataset to [this file](https://github.com/code-dot-org/ml-playground/blob/12c25ce5257e69fbcc6f94ccdba3670f120a5631/src/datasetManifest.js).\n\nTake care that each column is correctly listed in the `.json` file, and test that it's working in the tool by highlighting each column and ensuring that its metadata shows correctly in the panel on the right.\n\n### Scenes:\n\n#### Select dataset\nThis is usually the first scene, and can offer selection of both \"pre-canned\" datasets, which have accompanying metadata, or user-uploaded CSV.  The tiles use an art style somewhat consistent with that used elsewhere in our product.  There is a fun \"grow\" animation on tile hover, just to feel a little more interactive, which is reused for the A.I. bot head elsewhere in the app.\n\n#### Data display (label \u0026 features)\nThis scene went through major iteration, before settling on the current implementation.  The scene is used twice, once to select a label and again to select features.  It tries to achieve a number of objectives:\n- it centers the tabular data in the student experience;\n- it allows the construction of a statement (\"Predict [feature] based on [labels].\") which carries across the experience;\n- it allows for the exploration of columns and their properties before they are selected.\n\nWhen selecting a label, the properties panel on the right shows information for the highlighted column:\n- a bar graph for categorical data;\n- min/max/range for numerical data.\n\nWhen selecting a feature, it shows the above properties for the highlighted column, but also attempts to show information about the relationship between that column and the previously-selected label:\n- a custom CrossTab when both label and feature are categorical data;\n- a scatterplot when both label and feature are numerical data.\n\nFor student-uploaded CSV files, we attempt to guess the column type based on the type of data detected in the column, but provide a way for the student to override this.\n\n#### Train Model\nA.I., the bot from AI for Oceans, is back.  Here, we attempt to illustrate the training process, in which a large amount of the original tabular data is given to the bot, row by row.  The animation is done by updating the React state 30 times a second to trigger a re-render each time.  The scene supports very small datasets, finishing early, as well as larger datasets, fading out after showing a few iterations of the animation.\n\n#### Generate Results\nIn this scene we attempt to show A.I. generating results, again inspired by the way we presented it in AI for Oceans.  Here, the bot is making predictions on rows that were reserved for this purpose: it takes the features and predicts the label for each of those rows.  As in the previous scene, it handles both very small and larger datasets.\n\n#### Results\nThis screen does a few things:\n- It shows the result for the most recent set of predictions.  That is, it shows the statement (\"Predict [feature] based on [labels].\") along with the accuracy (which is how well it predicted labels in the previous scene, when comparing those labels against their actual values, since this prediction was done using a reserved set of data from the original tabular data).\n- It shows the results of previous sets of predictions, with their respective statements.  This way the student can compare statements to see which have the highest \"predictive power\".\n- It lets the student view details of the most recent set of predictions, which shows in a pop-up.  This view has a toggle between showing correct and incorrect predictions.  In the table, the student can examine each row of reserved data to see how the label's actual value compares to what was predicted.\n- The student can \"Try it out!\" and run their own predictions.  The interface here is very similar to what they can see in App Lab once they import the saved model there.  The A.I. bot makes a reappearance here, because it's popular!\n\n#### Save Model\nThe student can fill out the \"model card\" and then save the model, along with the model card information, to the server.  This model can then be imported in App Lab.  The model card information is seen in App Lab when previewing the model prior to importing it.  [Model cards](https://modelcards.withgoogle.com/about) serve as an accessible reference for an AI model.  They allow the student to document decisions.  And analyzing model cards in the curriculum helps students to [explore](https://codeorg.medium.com/code-org-curriculum-now-teaches-ai-to-every-student-f4d09895be15) issues of bias and ethics.\n\n#### Model Summary\nThe student can see a summary of the model that they have just saved.  Proceeding from here will go to the next level in the progression.\n\n## Common operations\n\n### First time:\n\n```\ngit clone git@github.com:code-dot-org/ml-playground.git\ncd ml-playground\nnvm install\nnvm use\nyarn install\nyarn start\n```\n\nThe app will be running at http://localhost:8080.\n\n### Running a local standalone server\n\nBorrowing one step from above:\n\n```\nyarn start\n```\n\nThe app will be running at http://localhost:8080.\n\n### First time integration with local Code Studio\n\nIn this repo:\n\n```\nyarn link\n```\n\nIn main repo's `apps/` directory:\n\n```\nyarn link @code-dot-org/ml-playground\n```\n\nThis will set up a symlink in main repo's `apps/node_modules/` to point at your local changes.\n\nRun\n\n```\nyarn run build\n```\n\nin this repo, and then the main repo's `apps` build should pick the changes up next time it builds.\n\nIf you are running `yarn start` for continuous builds in the main repo, it will pick up the changes once the build in this repo has completed.\n\n\n### Building changes for a local Code Studio\nIn main repo:\n\n``` \nbin/dashboard-server \n``` \n\nIn main repo's `apps/` directory: \n``` \nyarn start \n```\n\nIf you see an error, run `yarn` before running `yarn start` again.\n\nIn this repo:\n```\nyarn run build\n```\n\nThen the local Code Studio apps build will pick up changes. \n\nSee AI Lab changes at http://localhost-studio.code.org:3000/s/allthethings/stage/43/puzzle/1.\n\nNote that running `yarn start` will erase this build, and so for now it seems best to alternate between using `yarn start` for testing the standalone build, and using `yarn run build` to make a single build for consumption by the main repo.\n\n### Publishing a new version\n\nOnce we want the official main repo build to get the latest updates from this repo, we need to publish the changes.\n\nIn this repo, modify `package.json` with the incremented version number.\n\nThen produce a build:\n\n```\nnpm run build\n```\n\nThen publish the build, skipping the option to adjust the build version.\nUser name and password for shared account are available in password manager:\n\n```\nyarn publish\n```\n\nThen commit the changed `package.json` for posterity.\n\nIn the main repo, modify `package.json` to use the new version of `ml-playground`.\n\nPick up the new version:\n\n```\nyarn\n```\n\nThen commit the changed `package.json` and `yarn.lock` files so that the official build pipeline uses the new version.\n\n### Verifying a symlink exists between the main repo and ML playground\nIn main repo: \n``` \n cd apps/node_modules/@code-dot-org \n ls -l \n```\nIn the output, you should see something like this: `ml-playground -\u003e ../../../../../.config/yarn/link/@code-dot-org/ml-playground`\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode-dot-org%2Fml-playground","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcode-dot-org%2Fml-playground","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode-dot-org%2Fml-playground/lists"}