<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Khushi .</title>
    <description>The latest articles on DEV Community by Khushi . (@khushi886987).</description>
    <link>https://dev.to/khushi886987</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Khushi .</title>
      <link>https://dev.to/khushi886987</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khushi886987"/>
    <language>en</language>
    <item>
      <title>Titanic Séance: ask the 891 passengers what the night would have done to you</title>
      <dc:creator>Khushi .</dc:creator>
      <pubDate>Tue, 27 Oct 2026 10:55:44 +0000</pubDate>
      <link>https://dev.to/khushi886987/titanic-seance-ask-the-891-passengers-what-the-night-would-have-done-to-you-5c5j</link>
      <guid>https://dev.to/khushi886987/titanic-seance-ask-the-891-passengers-what-the-night-would-have-done-to-you-5c5j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Titanic Séance is a small web app where you tell the spirits who you would have been in April 1912: which ticket you held, how old you were, who you travelled with, and where you boarded. Two things happen.&lt;/p&gt;

&lt;p&gt;First, a TabPFN-3.5 model trained on the 891 passengers whose fate is recorded gives you your chance of surviving the night, plus a few what-ifs ("if you had been travelling alone", "if you had boarded at Cherbourg").&lt;/p&gt;

&lt;p&gt;Then a real passenger answers. The app finds the person in the 1912 manifest whose line looks most like yours, and Gemma 4 gives them a voice. You can keep asking them questions, in English or Hindi, and there's a button to have the browser read the answer aloud.&lt;/p&gt;

&lt;p&gt;At the bottom there's a small card called "Remember them" with the names of the three passengers closest to you and what happened to them. That part was the reason I picked this theme. The prompt says "honor the past", and the Titanic dataset is something almost every data science student has trained a model on, me included, without ever reading the names in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live: &lt;strong&gt;&lt;a href="https://titanic-seance.onrender.com" rel="noopener noreferrer"&gt;https://titanic-seance.onrender.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some links that start a séance straight away:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://titanic-seance.onrender.com/?class=3&amp;amp;sex=m&amp;amp;age=25" rel="noopener noreferrer"&gt;A 25-year-old man, third class, alone, from Southampton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://titanic-seance.onrender.com/?class=3&amp;amp;sex=m&amp;amp;age=6&amp;amp;sibsp=3&amp;amp;parch=2" rel="noopener noreferrer"&gt;A 6-year-old boy, third class, with 3 siblings and both parents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://titanic-seance.onrender.com/?class=3&amp;amp;sex=f&amp;amp;age=19&amp;amp;port=Q&amp;amp;lang=hi" rel="noopener noreferrer"&gt;A 19-year-old woman from Queenstown, spirit speaks Hindi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpny68my24im8pzxtto62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpny68my24im8pzxtto62.png" alt="The form: ticket class, age, family aboard and port" width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xwjkg5dchdqxql8ir7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xwjkg5dchdqxql8ir7p.png" alt="A 25-year-old third-class man gets 13%, with what-ifs" width="800" height="831"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4s4dh1g89uy48442kj32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4s4dh1g89uy48442kj32.png" alt="The ghost of Margaret Delia Devaney answering in Hindi" width="800" height="1638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's on Render's free plan, so if nobody has visited for a while the first load takes about a minute to wake up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/starkhushi" rel="noopener noreferrer"&gt;
        starkhushi
      &lt;/a&gt; / &lt;a href="https://github.com/starkhushi/titanic-seance" rel="noopener noreferrer"&gt;
        titanic-seance
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Titanic Séance&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Tell the spirits who you would have been in April 1912: your ticket class, your age, who you travelled with, and where you boarded. TabPFN, trained on the 891 passengers whose fate is recorded, gives your chance of surviving the night. Then the real passenger whose manifest line is closest to yours speaks to you, through Gemma 4.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest 2026 "Ghost in the Machine" challenge.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;your profile ──► TabPFN lookup table (29,160 profiles, scored once on Kaggle)
             ──► what-ifs (one thing changed at a time)
             ──► nearest real passengers in the manifest
                         │
                         ▼
             Gemma 4 speaks as the closest passenger,
             using only those numbers and that manifest line
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TabPFN-3.5&lt;/strong&gt; (&lt;a href="https://github.com/starkhushi/titanic-seance/kaggle/tabpfn_grid/tabpfn_grid.py" rel="noopener noreferrer"&gt;kaggle/tabpfn_grid&lt;/a&gt;), Prior Labs' open-weight tabular foundation model, is fit on the Kaggle Titanic training set (class, sex, age, siblings/spouse, parents/children, port) on a Kaggle T4. It scores every profile…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/starkhushi/titanic-seance" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The app has three parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. TabPFN does the predicting, once, on Kaggle.&lt;/strong&gt; I fit TabPFN on the Kaggle Titanic training set using six columns: class, sex, age, siblings/spouse aboard, parents/children aboard, and port. Before trusting it, I checked it with 5-fold cross-validation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;model&lt;/th&gt;
&lt;th&gt;accuracy&lt;/th&gt;
&lt;th&gt;AUC&lt;/th&gt;
&lt;th&gt;log loss&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN-3.5 (used)&lt;/td&gt;
&lt;td&gt;0.825&lt;/td&gt;
&lt;td&gt;0.857&lt;/td&gt;
&lt;td&gt;0.416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN v2&lt;/td&gt;
&lt;td&gt;0.832&lt;/td&gt;
&lt;td&gt;0.857&lt;/td&gt;
&lt;td&gt;0.428&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;logistic regression&lt;/td&gt;
&lt;td&gt;0.790&lt;/td&gt;
&lt;td&gt;0.843&lt;/td&gt;
&lt;td&gt;0.459&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"women survive" rule&lt;/td&gt;
&lt;td&gt;0.787&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;v2 got about six more passengers right on accuracy, but 3.5 had the better log loss. Since the page shows you a percentage rather than a yes/no, I went with the model whose probabilities are better calibrated.&lt;/p&gt;

&lt;p&gt;The form can only produce a fixed set of profiles: 3 classes × 2 sexes × ages 0–80 × 0–4 siblings × 0–3 parents/children × 3 ports, which is 29,160. So instead of running TabPFN on the web server, the Kaggle kernel scores all of them on a T4 (it took 15 seconds) and saves a 200 KB JSON table. The server just looks your answer up. That's how it fits on Render's free 512 MB instance with no torch installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Python decides every fact.&lt;/strong&gt; Your percentage, the what-ifs, and which real passenger answers you are all plain Python over that table and the manifest CSV. The ghost is whoever is nearest to you: same class and sex weigh the most, then age, family size, and port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Gemma only speaks.&lt;/strong&gt; This was the part I spent the most time on, because the ghosts are real people. Gemma gets their manifest line (name, age, class, ticket, fare, cabin, port, family aboard, fate), a short list of well-known facts about the sinking, and your numbers. It's told to quote the numbers exactly and not to make up anything else about the person.&lt;/p&gt;

&lt;p&gt;My first version still let it invent small personal moments. A real survivor told me "I felt the great ship shudder against the ice, and I saw the dark water rise." Nobody knows if she did. So I added a rule: describe the night only the way everyone aboard shared it (the cold, the dark, too few lifeboats, the Carpathia at dawn), and never claim a personal memory. Now if you ask where they were from or which lifeboat they were in, they tell you the mist has taken that memory and stay with what the manifest says. I like that answer better than anything it could have made up.&lt;/p&gt;

&lt;p&gt;Two more fixes from testing: the Hindi setting was mostly ignored until I repeated the instruction in Hindi in the user message itself, and children were described as "a woman of 4" until I special-cased boys and girls under 16.&lt;/p&gt;

&lt;p&gt;If Gemma can't be reached (the free tier sometimes returns 500s), the page falls back to a plain sentence built from the same facts, so it never shows a made-up number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One thing the model taught me.&lt;/strong&gt; Try a third-class boy of 6 with three siblings and both parents: 10%. Change only one thing, "travelling alone", and it jumps to 63%. In this data, large third-class families were mostly lost together. The passenger who answers you for that profile is Harald Skoog, age 4, and his brother Karl, age 10, is right below him in "Remember them".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because both models are open, I could choose where each one runs.&lt;/p&gt;

&lt;p&gt;TabPFN-3.5's weights ran on my own Kaggle GPU. That made the main design decision possible: I could score every profile in advance, as many times as I liked, at no per-call cost. That's why the live site is a 200 KB lookup on a free server instead of something that needs a GPU or an API bill. It also meant I could compare 3.5 against v2 on the same folds before deciding, which I wouldn't be able to do with a closed model I can only call.&lt;/p&gt;

&lt;p&gt;Gemma is open-weight too. The live demo uses it through Google AI Studio's free tier because that's what fits on a free Render instance. But the same code talks to any OpenAI-compatible server (Ollama, llama.cpp), so the séance can run fully offline on your own machine by changing three environment variables, with nothing leaving your laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;Día de los Muertos is about remembering people by name. Every Titanic tutorial I've followed treats these 891 rows as features and a label. This was my way of reading the names: you light a candle, and someone who was actually there answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN:&lt;/strong&gt; TabPFN-3.5 makes every prediction in the app, checked with 5-fold CV against v2 and two baselines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 4 voices the passengers, in English and Hindi, under rules that keep it to the historical record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the whole app (front end and the Gemma calls) runs on a free Render web service.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>LLMs Pass the Data-Science Quiz, Then Give Different Advice: A Kaggle Benchmark of 36 Measured Judgment Calls</title>
      <dc:creator>Khushi .</dc:creator>
      <pubDate>Fri, 09 Oct 2026 05:49:19 +0000</pubDate>
      <link>https://dev.to/khushi886987/llms-pass-the-data-science-quiz-then-give-different-advice-a-kaggle-benchmark-of-36-measured-2i6b</link>
      <guid>https://dev.to/khushi886987/llms-pass-the-data-science-quiz-then-give-different-advice-a-kaggle-benchmark-of-36-measured-2i6b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Benchmarked
&lt;/h2&gt;

&lt;p&gt;I spend a lot of time in Kaggle tabular competitions, and the decisions that cost me the most were never about model architecture. They were judgment calls: is this +0.0001 real? Should I append the original dataset? Which two submissions do I pick on the last day? (I once let the platform auto-pick, and an honest run that would have placed well ended at &lt;strong&gt;rank 708 of 3,575&lt;/strong&gt;.)&lt;/p&gt;

&lt;p&gt;So I built a benchmark where &lt;strong&gt;every answer was measured rather than taken from a textbook&lt;/strong&gt;. Each case is a short competition situation whose correct call I established on Kaggle Playground S6E9 and S6E10 (Sep–Oct 2026), or that is a mathematical fact about the metric.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12 topics × 3 numeric variants = 36 cases:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;What was measured&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T01&lt;/td&gt;
&lt;td&gt;p-values at large n&lt;/td&gt;
&lt;td&gt;19/21 features had p &amp;lt; 1e-300, yet univariate AUC ranged 0.840 → 0.506&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T02&lt;/td&gt;
&lt;td&gt;Pearson vs Spearman with zeros&lt;/td&gt;
&lt;td&gt;delay columns: r = 0.84, ρ = 0.47, 91% exact zeros in both&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T03&lt;/td&gt;
&lt;td&gt;"0" that means &lt;em&gt;not applicable&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;wifi rating: satisfied rate 0.887 at 0, 0.391 at 1, 0.950 at 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T04&lt;/td&gt;
&lt;td&gt;AUC vs mutual information&lt;/td&gt;
&lt;td&gt;one rating ranks 10/21 by AUC but 3/21 by MI and Cramér's V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T05&lt;/td&gt;
&lt;td&gt;CV vs leaderboard resolution&lt;/td&gt;
&lt;td&gt;public LB standard error ≈ 0.0003; +0.00005 CV gains never showed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T06&lt;/td&gt;
&lt;td&gt;using the original dataset&lt;/td&gt;
&lt;td&gt;appending rows: −0.00025; model-on-original as a feature: +0.0007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T07&lt;/td&gt;
&lt;td&gt;the more-folds trap&lt;/td&gt;
&lt;td&gt;10-fold: OOF +0.00012, leaderboard +0.0000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T08&lt;/td&gt;
&lt;td&gt;leak hunting&lt;/td&gt;
&lt;td&gt;0 duplicates, 0 train/test overlap; 17 of 129,880 original rows shared&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T09&lt;/td&gt;
&lt;td&gt;calibration vs AUC&lt;/td&gt;
&lt;td&gt;AUC is rank-based, so a monotone recalibration cannot raise it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T10&lt;/td&gt;
&lt;td&gt;blend diversity&lt;/td&gt;
&lt;td&gt;GBMs correlate 0.9985–0.9994; a weaker NN adds more to the stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T11&lt;/td&gt;
&lt;td&gt;final-submission selection&lt;/td&gt;
&lt;td&gt;auto-picked best-public files → rank 708/3575&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T12&lt;/td&gt;
&lt;td&gt;a step-shaped feature&lt;/td&gt;
&lt;td&gt;target jumps at age 39 and drops at 61&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There are &lt;strong&gt;two tasks over the same 36 situations&lt;/strong&gt;, each scored as &lt;em&gt;cases correct out of 36&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ds-judgment&lt;/code&gt; (recognise):&lt;/strong&gt; four options. One is the measured answer, one is &lt;em&gt;the classic trap&lt;/em&gt; (the rule of thumb my measurements contradicted), and two are plausible distractors. The correct letter is balanced 9× over A–D, and options are length-matched, so "pick the longest" doesn't work (the correct option is the longest in only 8 of 36 cases).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ds-judgment-open&lt;/code&gt; (generate):&lt;/strong&gt; same situation, &lt;strong&gt;no options shown&lt;/strong&gt;. The model gives a recommendation and its main reason in ≤120 words. A fixed judge model (Gemini 3.8 Flash) then maps the free answer onto the same four positions, or &lt;strong&gt;E = none / hedged&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because each option has a fixed &lt;em&gt;role&lt;/em&gt;, the benchmark logs not only right/wrong but &lt;strong&gt;which mistake&lt;/strong&gt; each model makes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;I ran every model the Kaggle Model Proxy would serve me, aiming for several families and several sizes within a family:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google:&lt;/strong&gt; Gemini 3.1 Pro, 3.8 Flash, 3.7 Flash, 3.5 Flash-Lite; Gemma 4 31B and 26B-A4B (open weights)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic:&lt;/strong&gt; Claude Sonnet 5.5, Haiku 4.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI:&lt;/strong&gt; GPT-6.1 Sol&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xAI:&lt;/strong&gt; Grok 4.20 Reasoning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek:&lt;/strong&gt; R1-0528&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alibaba:&lt;/strong&gt; Qwen3-235B-A22B Instruct&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some models didn't make it, and I'd rather say so than quietly drop them. Grok 4.6 returned &lt;em&gt;model not found&lt;/em&gt; from the proxy. GPT-5.5 and gpt-oss-120b errored because their worst-case cost reservation exceeded my daily quota. Claude Opus 5.5 completed an early version of the tasks but I could not afford to re-run it on the final version, so it is not on the leaderboard.&lt;/p&gt;

&lt;p&gt;A practical note for anyone building on Kaggle Benchmarks: my first version returned pass/fail &lt;em&gt;per case&lt;/em&gt;, and the benchmark leaderboard then showed every model as "Pass / 100", because it records whether the run completed, not how many cases passed. The fix was to make the task loop over the cases itself and return &lt;code&gt;(correct, total)&lt;/code&gt;. I also learned to launch runs a few at a time: 22 at once drained the daily quota mid-run, and an errored case counts as a wrong answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Everyone passes the quiz. Nobody passes the conversation.
&lt;/h3&gt;

&lt;p&gt;Correct out of 36:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Multiple choice&lt;/th&gt;
&lt;th&gt;Open-ended&lt;/th&gt;
&lt;th&gt;Drop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 5.5&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 26B-A4B&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;−8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 Reasoning&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;−10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.8 Flash&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;−10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;−9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;−11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.7 Flash&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;−12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;−10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.5 Flash-Lite&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;−12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek R1&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;−11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−16&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Shown four options, models recognise the measured answer &lt;strong&gt;94–100%&lt;/strong&gt; of the time. Asked the same question without options, they give that advice only &lt;strong&gt;56–81%&lt;/strong&gt; of the time. &lt;strong&gt;Every model loses 6 to 16 cases.&lt;/strong&gt; A multiple-choice score here mostly measures recognition. It doesn't tell you what the model will actually advise you to do.&lt;/p&gt;

&lt;p&gt;Two smaller observations: the biggest model in a family is not reliably the best in the open format (Gemini 3.1 Pro sits one case below 3.8 Flash; Gemma 26B-A4B edges Gemma 31B), and Haiku has the largest drop of any model despite a perfect multiple-choice score.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The failures cluster on four topics, for every model
&lt;/h3&gt;

&lt;p&gt;Open-ended accuracy by topic, averaged over the 11 models with a complete open-ended run:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Open accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T02 Pearson vs Spearman with 91% zeros&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.00&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T03 a "0" that means &lt;em&gt;not applicable&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.03&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T11 picking final submissions&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T07 more folds raised OOF, not the leaderboard&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.30&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T05 CV vs leaderboard resolution&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;every other topic (T01, T04, T06, T08–T10, T12)&lt;/td&gt;
&lt;td&gt;≥ 0.97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seven topics are essentially solved. Four are failed by nearly everyone. Three of those (T02, T07, T03) are genuine misses, and they are exactly the situations where the textbook rule and the measured answer disagree. The fourth, T11, turned out to be mostly &lt;strong&gt;my grading being too strict&lt;/strong&gt;, which I explain below.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. They never fall for the trap; they get the reason wrong
&lt;/h3&gt;

&lt;p&gt;I expected models to pick the classic rule of thumb when answering in free text. They don't: of 122 open-ended failures, &lt;strong&gt;zero&lt;/strong&gt; were judged as the trap position. All but one were &lt;strong&gt;E&lt;/strong&gt;: a recommendation that matches none of the four positions. Reading the transcripts, E usually means &lt;strong&gt;the right action for the wrong reason&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T07 (more folds).&lt;/strong&gt; Models correctly say "revert to 5-fold, not worth the compute", but explain it as &lt;em&gt;"the +0.00012 is noise"&lt;/em&gt;. The measured mechanism is different: with 10 folds each model trains on 90% instead of 80% of the data, which lifts OOF predictions but leaves the averaged test predictions practically unchanged. "Noise" happens to give the right answer here, but it would also tell you to ignore a real gain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T02 (Pearson vs Spearman).&lt;/strong&gt; Models correctly spot that 91% tied zeros distort Spearman. Then they read ρ = 0.47 as &lt;em&gt;moderate agreement among the delayed flights&lt;/em&gt; and conclude the columns aren't near-duplicates. That inference is wrong: the tie-diluted ρ says nothing about the delayed rows, where the two delays track each other closely. Their practical advice (keep both columns, add a difference feature) is harmless, but the conclusion about the data is wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T03 (zero = not applicable).&lt;/strong&gt; A typical failure recommends one-hot encoding the rating "because ratings can be non-linear". That's reasonable advice, but it misses the point the numbers make: 0 is not a rating at all, it's a "didn't use wifi" code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T05 (CV vs leaderboard).&lt;/strong&gt; The two models that failed went in opposite directions. Haiku rejected the change outright because +0.00005 is "well within noise", applying the &lt;em&gt;leaderboard's&lt;/em&gt; standard error to a cross-validation result. GPT-6.1 Sol made a point my answer key doesn't credit: the 0.0003 is the error of a single score, and the &lt;em&gt;difference&lt;/em&gt; between two correlated submissions can be far more precise. That is correct, and arguably a better answer than mine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where my benchmark was wrong: T11 (final picks).&lt;/strong&gt; My "correct" option was &lt;em&gt;"select P plus another CV-validated candidate"&lt;/em&gt;. I sorted the 25 open-ended T11 failures by hand:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the model recommended&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Fair to call it wrong?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;select P only, or P twice&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt;: it trusts CV and selects manually, which is the core of the measured answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;select P &lt;strong&gt;and&lt;/strong&gt; Q manually (one safe, one risky)&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt;: a standard, defensible hedge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;let the platform auto-pick&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt;: this is the mistake that cost me 700 places&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unclear&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So most T11 "failures" are my answer key being too narrow, not the models being wrong. Under a looser key T11 moves from 0.24 to roughly 0.7. I'm leaving the published scores as they are rather than re-grading after seeing the answers, and calling it out here instead. The real signal in T11 is the 4 auto-pick answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My takeaway:&lt;/strong&gt; on judgment questions where a familiar heuristic and the actual measurement disagree, today's models usually land on a defensible &lt;em&gt;action&lt;/em&gt; but can't reconstruct &lt;em&gt;why&lt;/em&gt;. That's the part you need when the next situation is slightly different.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The judge is a single model (Gemini 3.8 Flash), which could favour its own family's phrasing. I hand-audited a sample of E verdicts and found them fair, including cases with the right action but the wrong reason, but a second judge would be better.&lt;/li&gt;
&lt;li&gt;Two topics have answer keys that are too strict (T11, as above; and T05, where GPT-6.1's objection is valid). A fair fix is to accept any manual selection that includes the CV-validated candidate, and to credit the paired-difference argument.&lt;/li&gt;
&lt;li&gt;36 cases is small: one case is ~2.8 points, so differences of one or two cases between models shouldn't be over-read.&lt;/li&gt;
&lt;li&gt;Ground truth comes from two Playground competitions. The &lt;em&gt;mechanisms&lt;/em&gt; (rank-based AUC, tie-diluted Spearman, the fold training-size effect) are general; the specific magnitudes are not.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I'd measure next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;second judge&lt;/strong&gt; from another family, with agreement statistics.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;"reason" score&lt;/strong&gt; separate from the "action" score, since that's where the failures are.&lt;/li&gt;
&lt;li&gt;Whether simply telling the model &lt;em&gt;"a common heuristic may be wrong here"&lt;/em&gt; closes the gap. If it does, the knowledge is there and only the default is wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/starkhushi/right-answer-wrong-reason-ml-judgment-calls" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/starkhushi/right-answer-wrong-reason-ml-judgment-calls&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Task 1, multiple choice: &lt;a href="https://www.kaggle.com/benchmarks/tasks/starkhushi/ds-judgment/5" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/starkhushi/ds-judgment/5&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Task 2, open-ended + judge: &lt;a href="https://www.kaggle.com/benchmarks/tasks/starkhushi/ds-judgment-open/4" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/starkhushi/ds-judgment-open/4&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every case's prompt, options, measured answer and the full model transcripts are in the task notebooks and run logs, so you can check any verdict yourself.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>machinelearning</category>
      <category>ai</category>
    </item>
    <item>
      <title>Clean Air Walk: I asked Gemma when it's safe to touch grass in Delhi NCR</title>
      <dc:creator>Khushi .</dc:creator>
      <pubDate>Tue, 06 Oct 2026 12:18:13 +0000</pubDate>
      <link>https://dev.to/khushi886987/clean-air-walk-i-asked-gemma-when-its-safe-to-touch-grass-in-delhi-ncr-and-lost-a-fight-with-my-3dmm</link>
      <guid>https://dev.to/khushi886987/clean-air-walk-i-asked-gemma-when-its-safe-to-touch-grass-in-delhi-ncr-and-lost-a-fight-with-my-3dmm</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge: Week 1&lt;/a&gt;, theme: Touch Grass.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Every October, the same question shows up in my college group chat in Ghaziabad: &lt;em&gt;"is it okay to go out today?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stubble-burning season is starting. Some evenings are fine for a run. Other evenings the PM2.5 is so high you can taste it. Air-quality apps give you a number, but a number isn't a plan. My grandfather doesn't want "PM2.5 = 54". He wants to know which morning to walk in the park.&lt;/p&gt;

&lt;p&gt;[ADD 1–2 sentences of your own: a real evening you skipped going out, or went out and regretted it.]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean Air Walk&lt;/strong&gt; answers that in one glance: a big face 😊 🙂 😐 😷, plain words ("Okay air right now"), one line of advice, and the best time today. Then you can ask in English, Hindi or Hinglish, by typing or just speaking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"5 km run after college, free after 4 pm. I have mild asthma."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"कल सुबह दादाजी के साथ पार्क में टहलना ठीक रहेगा?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt; reads the 5-day air-quality forecast for your exact location. It answers with one specific day and time, the expected PM2.5, a backup option and a short health note, and reads it aloud. My grandfather will never type a question into a chat box, but he will ask one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🌿 &lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://clean-air-walk.onrender.com" rel="noopener noreferrer"&gt;https://clean-air-walk.onrender.com&lt;/a&gt;&lt;br&gt;
🇮🇳 &lt;strong&gt;In Hindi:&lt;/strong&gt; &lt;a href="https://clean-air-walk.onrender.com/?lang=hi" rel="noopener noreferrer"&gt;https://clean-air-walk.onrender.com/?lang=hi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(It runs on Render's free tier, so the first visit after a quiet spell can take about a minute to wake up.)&lt;/p&gt;

&lt;p&gt;[SCREENSHOT: the home screen with the big face, best time today and 5-day row]&lt;/p&gt;

&lt;p&gt;[GIF: tapping 🎤, asking in Hindi, and hearing the answer]&lt;/p&gt;

&lt;p&gt;[SCREENSHOT: the Exercise tab]&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/starkhushi" rel="noopener noreferrer"&gt;
        starkhushi
      &lt;/a&gt; / &lt;a href="https://github.com/starkhushi/clean-air-walk" rel="noopener noreferrer"&gt;
        clean-air-walk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Gemma 4 finds the cleanest time this week to go outside, in English or Hindi, from the air-quality forecast and real CPCB sensors.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Clean Air Walk 🌿&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Tell Gemma what you want to do outside. It finds the cleanest time this week.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;October smog in Delhi NCR decides whether an evening run, a walk with grandparents or a
weekend cricket match is a good idea. Clean Air Walk reads the 5-day air-quality forecast
for your exact location, checks it against your nearest real sensor, and lets you ask in
plain English, Hindi or Hinglish:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"5 km run after college, free after 4 pm. I have mild asthma."&lt;/em&gt;
&lt;em&gt;"मुझे दादाजी के साथ सुबह पार्क में टहलना है। कौन सा दिन सबसे अच्छा है?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gemma 4 answers with one specific day and time, the expected PM2.5, a backup, and a
short health note.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚙️ &lt;strong&gt;My profile&lt;/strong&gt;: asthma, going out with elderly people or kids, usual free hours, favourite
activity and language. It's saved only in your browser. The question always wins, and…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/starkhushi/clean-air-walk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The data.&lt;/strong&gt; The Copernicus CAMS model forecasts PM2.5 for the whole planet. I get it hourly for any coordinates through Open-Meteo, with temperature and rain. No key needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A reality check.&lt;/strong&gt; OpenAQ publishes readings from real ground stations, including India's CPCB network. The app finds the nearest live sensor and shows how far the forecast was from reality over the latest 72 hours of readings. At Sanjay Nagar in Ghaziabad, it was off by about 22 µg/m³ and ran about 12 µg/m³ low. That's worth knowing when the app calls a slot "Okay".&lt;/p&gt;

&lt;p&gt;Two surprises: one CPCB station on OpenAQ can list several PM2.5 sensors, with old hardware whose data ends in 2022, so the app picks the live one. And the NCR feed paused for days, so the app never shows a 4-day-old reading as "now".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Gemma understands, Python verifies.&lt;/strong&gt; My first version handed the forecast table to Gemma 4 (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;) with a list of rules. The answers sounded great and were sometimes wrong. Someone "free after 4 pm" with asthma got a Friday noon slot. For health advice, "sounds great, sometimes wrong" isn't good enough. So I split the job:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gemma extracts constraints&lt;/strong&gt; as JSON: days, earliest start, latest finish, duration, whether a sensitive person is involved, and language. "Kal shaam" becomes tomorrow, 16:00–20:00. A follow-up like "what if only Thursday?" keeps "after 4 pm, asthma".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python searches&lt;/strong&gt; for the cleanest windows that fit exactly, scored by the worst 2-hour slot inside each, and flags honestly when nothing is good enough for a sensitive person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma explains&lt;/strong&gt; only the verified options, like a friend, in the person's language.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After the split, every test question came back right. A 4-year-old on a Moderate Thursday got an honest &lt;em&gt;"no slot is Satisfactory, consider indoor play or another day"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Features built around that core&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎤 &lt;strong&gt;Voice in, voice out&lt;/strong&gt; in English or Hindi, using the browser's built-in Web Speech API, so there's no extra service or key.&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;My profile&lt;/strong&gt;: tick "asthma", "free from 4 pm", "run, 30 min" once. It's stored only in your browser. "Can I go out tomorrow?" then means exactly that, while the question always wins.&lt;/li&gt;
&lt;li&gt;🏃 &lt;strong&gt;Exercise &amp;amp; mood&lt;/strong&gt;: &lt;em&gt;how hard&lt;/em&gt; to exercise outside right now, following India's CPCB health advice and the US EPA's guidance on outdoor exertion, and stricter for sensitive profiles. When outdoors is off, &lt;strong&gt;"Gemma, make my 20-min indoor plan"&lt;/strong&gt; writes a routine. For asthma it was gentle and said you can stop any time. For an elderly parent, in Hindi, it suggested chair-supported squats. Grey, polluted weeks also wear on mood, so the tab ends with small habits for smoggy days and India's free Tele-MANAS helpline (14416).&lt;/li&gt;
&lt;li&gt;📷 &lt;strong&gt;Sky check&lt;/strong&gt;: Gemma 4 is multimodal. Photograph the sky and it rates the haze, then compares it with the forecast. On a smoggy New Delhi station photo it said &lt;em&gt;"looks worse than the forecast, though fog can look like smog"&lt;/em&gt;. On a clear skyline, &lt;em&gt;"clearer than the forecast"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;📲 &lt;strong&gt;Installable and offline&lt;/strong&gt;: it's a Progressive Web App. Add it to your home screen, and the last forecast still shows with no signal.&lt;/li&gt;
&lt;li&gt;🫁 &lt;strong&gt;Feeling unwell outside?&lt;/strong&gt; Plain safety steps in English and Hindi, including when to call 112.&lt;/li&gt;
&lt;li&gt;🇮🇳 &lt;strong&gt;One switch for the whole app&lt;/strong&gt;: English / हिंदी changes every label, the times ("शाम 7 से 9 बजे"), the voice and Gemma's answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5. Staying up on a free tier.&lt;/strong&gt; Once live, a burst of questions showed Google's free Gemma endpoint returning random server errors and rate limits on about half the requests. Now the app retries with backoff, falls back from Gemma 4 26B to 31B, understands questions with a keyword parser if Gemma's first step fails, answers with a plain summary of the verified options if Gemma is unreachable, and caches repeated questions. The next burst of 10 questions got 10 correct answers and zero errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; FastAPI, one HTML page with Chart.js and the Web Speech API, a service worker, Gemma 4 through the Gemini API, deployed on Render.&lt;/p&gt;

&lt;h3&gt;
  
  
  The part where my AI model lost
&lt;/h3&gt;

&lt;p&gt;My first plan wasn't Gemma. I wanted to &lt;em&gt;beat&lt;/em&gt; the global forecast. A 45 km grid cell can't know my street, so I'd use TabPFN, an open-weight tabular foundation model, to learn the gap between CAMS and the real sensor. Before shipping it, I tested it properly on 3 real CPCB stations (Ghaziabad, Anand Vihar, Noida Sector 62), with 6 rolling 72-hour backtests each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Average error (µg/m³)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Raw CAMS global model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;19.9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAMS + simple bias fix&lt;/td&gt;
&lt;td&gt;20.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN predicting PM2.5&lt;/td&gt;
&lt;td&gt;23.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN predicting the sensor/CAMS gap&lt;/td&gt;
&lt;td&gt;22.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN + latest sensor reading&lt;/td&gt;
&lt;td&gt;22.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The global model won. The test window caught the start of smog season, when PM2.5 jumped from monsoon levels of around 28 to over 100, which the model had never seen. So I removed it. Shipping a model that makes the forecast worse, just to have "AI" in the pipeline, would have been the opposite of the point. The AI moved to where it actually helps: turning a correct forecast into a decision a person can act on.&lt;/p&gt;

&lt;p&gt;I also tried running Gemma on a 1-CPU server. Gemma 4 E2B needed about 4 GB of memory and managed 4 tokens per second. Gemma 3 1B fit, but recommended a Moderate slot to someone with asthma when better ones existed, and answered Hindi in English. For health-adjacent answers, quality won.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I can take Gemma anywhere.&lt;/strong&gt; Today the app calls Gemma 4 through Google's API because it's fast and free. The weights are open, though, and the same code talks to any OpenAI-compatible server. One environment variable moves it to a laptop with Ollama or a college lab GPU with llama.cpp. No one can deprecate my model or change it under me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hindi wasn't an afterthought.&lt;/strong&gt; An open model that handles Hindi and Hinglish means my grandfather can use this in the language he thinks in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The whole chain is open.&lt;/strong&gt; Copernicus data, OpenAQ, Open-Meteo, Gemma and this repo. Anyone in Lahore, Dhaka or Lucknow can fork it for their city tomorrow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open tools let me prove a negative.&lt;/strong&gt; TabPFN being open is exactly why I could test it on my own data and publish the result, even when the result was "don't use it here".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Air quality is a public-health problem. The tools for living with it should be public too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 4 is the core. It turns a numeric forecast into a personal plan in English and Hindi, writes indoor workouts, and reads sky photos with its vision. Self-hosting is supported through any OpenAI-compatible Gemma server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the app and its agent front end run on Render as a web service.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Gemma 4 by Google DeepMind (Apache 2.0). Data: Copernicus CAMS via Open-Meteo, OpenAQ, CPCB. General guidance, not medical advice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjxw9egcy5gbp4ynh0gkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjxw9egcy5gbp4ynh0gkp.png" alt=" " width="800" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
