<?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: Mr_Yth</title>
    <description>The latest articles on DEV Community by Mr_Yth (@younes_tahraoui_36f70daa3).</description>
    <link>https://dev.to/younes_tahraoui_36f70daa3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4106948%2F594e452b-5225-46a6-a902-cc89f5923bc4.png</url>
      <title>DEV Community: Mr_Yth</title>
      <link>https://dev.to/younes_tahraoui_36f70daa3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/younes_tahraoui_36f70daa3"/>
    <language>en</language>
    <item>
      <title>Is a blank cell signal, or just missing?</title>
      <dc:creator>Mr_Yth</dc:creator>
      <pubDate>Thu, 03 Sep 2026 00:38:17 +0000</pubDate>
      <link>https://dev.to/younes_tahraoui_36f70daa3/is-a-blank-cell-signal-or-just-missing-54mh</link>
      <guid>https://dev.to/younes_tahraoui_36f70daa3/is-a-blank-cell-signal-or-just-missing-54mh</guid>
      <description>&lt;h1&gt;
  
  
  Is a blank cell signal, or just missing?
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Sometimes an empty cell is the most informative thing in the row. The trouble is that you&lt;br&gt;
usually only know which case you're in by reading the data dictionary — and that doesn't&lt;br&gt;
scale to 800 columns named &lt;code&gt;f_0347&lt;/code&gt;. So we measure it instead, then check the answer&lt;br&gt;
against the literature.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ames housing · 1,460 sales · 79 columns · 19 of them contain blanks&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;"Drop any column that's more than 70% missing." I've written that line into more pipelines&lt;br&gt;
than I can count. On Ames it deletes four columns — and three of them have real price&lt;br&gt;
signal sitting in the gap.&lt;/p&gt;

&lt;p&gt;The blanks in this dataset are &lt;strong&gt;structural&lt;/strong&gt;. A blank &lt;code&gt;GarageQual&lt;/code&gt; doesn't mean the value&lt;br&gt;
was lost; it means the house has no garage. A blank &lt;code&gt;Alley&lt;/code&gt; means no alley access. The&lt;br&gt;
emptiness &lt;em&gt;is&lt;/em&gt; the measurement.&lt;/p&gt;

&lt;p&gt;That's easy to see here because the columns have English names and a published data&lt;br&gt;
dictionary. It is not easy to see on a vendor feed of anonymised features, which is what&lt;br&gt;
most real projects look like. So the question worth answering isn't "does missingness carry&lt;br&gt;
signal" — it's &lt;strong&gt;can you tell, without knowing what the column means?&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;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;0.41&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;R² from the blank/not-blank pattern alone — every value discarded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AUC recovering the garage blanks from other columns' values&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;±0.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Total spread across five strategies — inside a ±1.5% CV noise band&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1 · A blank cell has a price tag
&lt;/h2&gt;

&lt;p&gt;Start with the crude check: does sale price differ between rows where a column is blank and&lt;br&gt;
rows where it isn't? Columns that go blank on the same rows describe one fact, so the five&lt;br&gt;
garage columns collapse into one.&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%2Fmk8ztfba6h4j51sm3c6t.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%2Fmk8ztfba6h4j51sm3c6t.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 1.&lt;/strong&gt; Median sale price, blank rows vs. valued rows. No garage is a $68k median&lt;br&gt;
discount on a $163k median house. Note the sign flip: houses that &lt;em&gt;have&lt;/em&gt; an alley or fence&lt;br&gt;
are the cheaper ones — those features mark older, denser blocks. "Blank = worse" is not a&lt;br&gt;
rule you can assume.&lt;/p&gt;

&lt;p&gt;Then the harder test. Throw away every value in the table and keep only a 19-column matrix&lt;br&gt;
of &lt;code&gt;True&lt;/code&gt;/&lt;code&gt;False&lt;/code&gt; — was this cell empty? Fit on that and nothing else.&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%2Ffg2iq6itgcp7kvnr370g.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%2Ffg2iq6itgcp7kvnr370g.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 2.&lt;/strong&gt; Five-fold CV. A model that has never seen a floor area, a neighbourhood or a&lt;br&gt;
year built reaches R² = 0.41 purely from which cells are empty.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The blanks are loud. But we only &lt;em&gt;understood&lt;/em&gt; them by reading the data dictionary — and&lt;br&gt;
that's the part that doesn't scale.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2 · Two questions, and most people only ask the first
&lt;/h2&gt;

&lt;p&gt;For every column that contains a blank, ask two things — neither of which requires knowing&lt;br&gt;
what the column means.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Axis 1 — does the blank move the target?&lt;/strong&gt; Standardised difference in log price between&lt;br&gt;
blank and non-blank rows, with a permutation test and a Benjamini–Hochberg correction&lt;br&gt;
across the eight column groups. This is the axis everybody already runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Axis 2 — is the blank already recoverable from other columns' values?&lt;/strong&gt; Predict &lt;em&gt;"is this&lt;br&gt;
cell blank?"&lt;/em&gt; from every other column, with every other column's own missingness destroyed&lt;br&gt;
first, so the classifier can only use values you can actually observe. &lt;strong&gt;AUC near 1.0 means&lt;br&gt;
some other column already tells you.&lt;/strong&gt; AUC near 0.5–0.8 means nothing else in the table&lt;br&gt;
knows.&lt;/p&gt;

&lt;p&gt;Axis 1 alone is a trap. A blank can be powerfully associated with the target and still be&lt;br&gt;
worth nothing, because a neighbouring column carries the same fact.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column group&lt;/th&gt;
&lt;th&gt;% blank&lt;/th&gt;
&lt;th&gt;effect&lt;/th&gt;
&lt;th&gt;adj. p&lt;/th&gt;
&lt;th&gt;recover AUC&lt;/th&gt;
&lt;th&gt;verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fence&lt;/td&gt;
&lt;td&gt;80.8&lt;/td&gt;
&lt;td&gt;+0.45&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;0.765&lt;/td&gt;
&lt;td&gt;flag it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alley&lt;/td&gt;
&lt;td&gt;93.8&lt;/td&gt;
&lt;td&gt;+0.55&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;0.942&lt;/td&gt;
&lt;td&gt;flag it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bsmt ×5&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;td&gt;−1.23&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;0.982&lt;/td&gt;
&lt;td&gt;flag it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiscFeature&lt;/td&gt;
&lt;td&gt;96.3&lt;/td&gt;
&lt;td&gt;+0.41&lt;/td&gt;
&lt;td&gt;0.0051&lt;/td&gt;
&lt;td&gt;0.983&lt;/td&gt;
&lt;td&gt;flag it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LotFrontage&lt;/td&gt;
&lt;td&gt;17.7&lt;/td&gt;
&lt;td&gt;+0.12&lt;/td&gt;
&lt;td&gt;0.0930&lt;/td&gt;
&lt;td&gt;0.824&lt;/td&gt;
&lt;td&gt;no signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MasVnrType&lt;/td&gt;
&lt;td&gt;59.7&lt;/td&gt;
&lt;td&gt;−0.79&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;0.999&lt;/td&gt;
&lt;td&gt;redundant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FireplaceQu&lt;/td&gt;
&lt;td&gt;47.3&lt;/td&gt;
&lt;td&gt;−1.02&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;redundant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Garage ×5&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;−1.41&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;redundant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fdodqcwazh2ebivf4zv7u.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%2Fdodqcwazh2ebivf4zv7u.png" alt=" " width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 3.&lt;/strong&gt; The two axes together. Bubble size is the share of rows blank. Everything in the&lt;br&gt;
shaded band is already encoded somewhere else in the table.&lt;/p&gt;

&lt;p&gt;The interesting cases sit on the left. &lt;code&gt;Fence&lt;/code&gt; at AUC 0.77 and &lt;code&gt;Alley&lt;/code&gt; at 0.94: &lt;strong&gt;nothing&lt;br&gt;
else in the table encodes them.&lt;/strong&gt; Their blanks are the sole carrier of their fact — and&lt;br&gt;
they are precisely the columns a "drop &amp;gt;70% missing" rule deletes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;LotFrontage&lt;/code&gt;, the classic "just median-impute it" column, lands at the bottom with&lt;br&gt;
adjusted p = 0.09. The screen agrees with the folklore: impute it, move on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did it get the right answer?&lt;/strong&gt; Now we allow ourselves the semantics we withheld, purely&lt;br&gt;
to check the method. A blank &lt;code&gt;GarageType&lt;/code&gt; means &lt;code&gt;GarageCars == 0&lt;/code&gt; in &lt;strong&gt;100%&lt;/strong&gt; of those&lt;br&gt;
rows. Same for &lt;code&gt;BsmtQual&lt;/code&gt; and &lt;code&gt;TotalBsmtSF&lt;/code&gt;, same for &lt;code&gt;FireplaceQu&lt;/code&gt; and &lt;code&gt;Fireplaces&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;MasVnrType&lt;/code&gt; is 98.5%.&lt;/p&gt;

&lt;p&gt;The screen found those duplicate columns by itself, without being told what a garage is.&lt;br&gt;
And for &lt;code&gt;Fence&lt;/code&gt; and &lt;code&gt;Alley&lt;/code&gt; there is no companion column anywhere in the table, which is&lt;br&gt;
exactly why they land where they do.&lt;/p&gt;




&lt;h2&gt;
  
  
  3 · And then the model refuses to care
&lt;/h2&gt;

&lt;p&gt;Five strategies, one model, nested cross-validation — the screen refit inside every&lt;br&gt;
training fold, so column selection never sees the test rows. The screen is stable: it picks&lt;br&gt;
&lt;code&gt;Fence&lt;/code&gt;, &lt;code&gt;Alley&lt;/code&gt; and &lt;code&gt;MiscFeature&lt;/code&gt; in all five folds, and never once picks the garage,&lt;br&gt;
basement or fireplace blanks.&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%2Fnzx9nuslq5lu6bea681u.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%2Fnzx9nuslq5lu6bea681u.png" alt=" " width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 4.&lt;/strong&gt; Every strategy sits inside every other strategy's error bar. Plotted as dots&lt;br&gt;
rather than bars because the differences are far smaller than the uncertainty, and a bar&lt;br&gt;
chart would imply otherwise.&lt;/p&gt;

&lt;p&gt;That's a null result, and it's the most useful thing here. Push it further — delete columns&lt;br&gt;
at every threshold from 95% down to "anything with a blank at all":&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%2Fwfb21wco9uyo1apwgagv.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%2Fwfb21wco9uyo1apwgagv.png" alt=" " width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 5.&lt;/strong&gt; You can delete all 19 columns that contain a blank and the model does not move.&lt;/p&gt;

&lt;p&gt;Section 2 predicted this before a single regression ran. The recoverability axis was pinned&lt;br&gt;
near 1.0 for every high-effect column: &lt;code&gt;GarageCars == 0&lt;/code&gt; says "no garage" perfectly, so the&lt;br&gt;
flag is a duplicate. On a table this redundant, missingness is real signal that is also&lt;br&gt;
entirely spare.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The screen's answer here was &lt;em&gt;don't bother&lt;/em&gt; — which is worth knowing before you build the&lt;br&gt;
pipeline, not after.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4 · The null had a literature-shaped explanation
&lt;/h2&gt;

&lt;p&gt;A null result is only interesting if the theory predicted something else. So before blaming&lt;br&gt;
the dataset, it is worth asking what the missing-data literature says &lt;em&gt;should&lt;/em&gt; happen here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Josse, Chen, Prost, Varoquaux &amp;amp; Scornet (2024)&lt;/strong&gt; — &lt;a href="https://arxiv.org/abs/1902.06931" rel="noopener noreferrer"&gt;&lt;em&gt;On the consistency of supervised&lt;br&gt;
learning with missing values&lt;/em&gt;&lt;/a&gt;. Constant imputation is&lt;br&gt;
Bayes-consistent — &lt;strong&gt;but only with a powerful, non-linear learner&lt;/strong&gt;. For trees, &lt;strong&gt;MIA&lt;/strong&gt;&lt;br&gt;
("missing incorporated in attributes") is the most versatile strategy, and it is what&lt;br&gt;
&lt;code&gt;HistGradientBoosting&lt;/code&gt; already does natively. Better missing-value handling mainly buys&lt;br&gt;
&lt;em&gt;sample efficiency&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Van Ness, Bosschieter, Halpin-Gregorio &amp;amp; Udell (KDD 2023)&lt;/strong&gt; — &lt;a href="https://arxiv.org/abs/2211.09259" rel="noopener noreferrer"&gt;&lt;em&gt;The Missing Indicator&lt;br&gt;
Method: From Low to High Dimensions&lt;/em&gt;&lt;/a&gt;. Indicators do not&lt;br&gt;
hurt linear models asymptotically, but &lt;em&gt;uninformative&lt;/em&gt; ones cause overfitting in high&lt;br&gt;
dimensions. Their fix, &lt;strong&gt;SMIM&lt;/strong&gt;, keeps an indicator only if &lt;code&gt;isna&lt;/code&gt; is significantly&lt;br&gt;
associated with the target — a t-test with Benjamini–Hochberg at FDR 0.1. Benefits are most&lt;br&gt;
pronounced for linear models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le Morvan &amp;amp; Varoquaux (ICLR 2025)&lt;/strong&gt; — &lt;em&gt;Imputation for prediction: beware of diminishing&lt;br&gt;
returns&lt;/em&gt;. Imputation &lt;em&gt;accuracy&lt;/em&gt; matters less with expressive models, and less when&lt;br&gt;
indicators are already present.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Two earlier results turn out to be confirmations rather than anomalies: ridge gained from&lt;br&gt;
indicators where boosting gained nothing — that is Theorem 3's condition — and&lt;br&gt;
IterativeImputer tied plain median, which is the diminishing-returns result exactly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The ablation that settles it
&lt;/h3&gt;

&lt;p&gt;Ames ships a &lt;em&gt;complete&lt;/em&gt; numeric companion for nearly every categorical quality column:&lt;br&gt;
&lt;code&gt;GarageCars&lt;/code&gt;, &lt;code&gt;TotalBsmtSF&lt;/code&gt;, &lt;code&gt;Fireplaces&lt;/code&gt;, &lt;code&gt;MasVnrArea&lt;/code&gt;. Dropping those ten — a feature&lt;br&gt;
ablation on the real data, with no synthetic missingness — gives the table Ames would have&lt;br&gt;
been without the duplication. Most real datasets look like that one.&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;full table&lt;/th&gt;
&lt;th&gt;companion-free&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ridge + indicators&lt;/td&gt;
&lt;td&gt;+0.44%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2.77%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boosting + indicators&lt;/td&gt;
&lt;td&gt;-0.35%&lt;/td&gt;
&lt;td&gt;+0.81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boosting + MIA&lt;/td&gt;
&lt;td&gt;-0.36%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1.36%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fthql4djo9xix0ctr6eaa.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%2Fthql4djo9xix0ctr6eaa.png" alt=" " width="799" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 6.&lt;/strong&gt; Left: the table as shipped — every line on zero at every sample size, so there&lt;br&gt;
is no gap for a sample-size story to explain. Right: companions removed. Ridge gains&lt;br&gt;
2.1% (±0.18 SE), and MIA's edge is largest when data is scarce&lt;br&gt;
(2.3% at n=250) and smallest at the full sample&lt;br&gt;
(0.4%) — Theorem 3 in a picture.&lt;/p&gt;

&lt;p&gt;Note the two boosting lines move in &lt;em&gt;opposite&lt;/em&gt; directions on the right. MIA's advantage&lt;br&gt;
shrinks as rows accumulate, while explicit indicators need rows before they pay — seventeen&lt;br&gt;
extra columns cost variance first and earn it back later. MIA gets the same information for&lt;br&gt;
free inside the split rule.&lt;/p&gt;

&lt;h3&gt;
  
  
  What a second axis buys over SMIM
&lt;/h3&gt;

&lt;p&gt;SMIM is &lt;em&gt;exactly&lt;/em&gt; our Axis 1. Our screen adds the recoverability axis. Head to head, both&lt;br&gt;
refit inside every training fold:&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%2Fk9xr60r39djw2rv05p43.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%2Fk9xr60r39djw2rv05p43.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 7.&lt;/strong&gt; On the full table the second axis is pure parsimony: SMIM keeps 17&lt;br&gt;
indicators, ours keeps 4, and ridge gains about the same (+0.80%&lt;br&gt;
vs +0.68%). On the companion-free table ours keeps 11 — the&lt;br&gt;
blanks it previously rejected are no longer recoverable.&lt;/p&gt;

&lt;p&gt;The screen is measuring a property of the &lt;strong&gt;table&lt;/strong&gt;, not of the column. Remove the columns&lt;br&gt;
that gave the blanks away and it starts keeping them.&lt;/p&gt;

&lt;p&gt;It also does &lt;em&gt;not&lt;/em&gt; beat plain MIM when nearly everything is informative&lt;br&gt;
(+2.43% vs +2.77%). That is the honest cost: dropping any genuinely&lt;br&gt;
informative indicator costs a little. The second axis buys a smaller feature set at roughly&lt;br&gt;
equal accuracy — not a better model. And on that table &lt;strong&gt;MIA beat every&lt;br&gt;
impute-plus-indicator variant&lt;/strong&gt; under boosting (+1.36%), which is precisely what&lt;br&gt;
Josse et al. recommend.&lt;/p&gt;

&lt;h3&gt;
  
  
  And the imputer itself?
&lt;/h3&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%2Fi0splhrjz0w1e6ypo351.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%2Fi0splhrjz0w1e6ypo351.png" alt=" " width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fig 8.&lt;/strong&gt; Signed contrasts against median imputation, paired within folds. No imputer&lt;br&gt;
contrast anywhere exceeds 0.0015 RMSE. The one that clears 2 SE — IterativeImputer&lt;br&gt;
on companion-free ridge — is worth 0.00026, against 0.00394 for the indicator&lt;br&gt;
in that same setting.&lt;/p&gt;

&lt;p&gt;This does not say what a headline would want it to. &lt;strong&gt;The imputer choice never pays.&lt;/strong&gt; A&lt;br&gt;
median, a round-robin regression model and a nearest-neighbour search are separated by at&lt;br&gt;
most 0.0015 RMSE anywhere. In the one setting where an imputer contrast clears&lt;br&gt;
2 SE, it is worth 0.00026 — against 0.00394 for the indicator in that same&lt;br&gt;
setting, about &lt;strong&gt;15× more from a one-line change&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;for gradient boosting nothing here reaches 1.5 SE&lt;/strong&gt; — not the imputers, not the&lt;br&gt;
indicators. And five folds is weak evidence either way; the properly-powered result is&lt;br&gt;
Fig 6, which repeats twelve times against a held-out test set.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prediction&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;On Ames&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Constant imputation is consistent with a powerful learner&lt;/td&gt;
&lt;td&gt;Josse Thm 3&lt;/td&gt;
&lt;td&gt;confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIA is the most versatile tree strategy&lt;/td&gt;
&lt;td&gt;Josse §5&lt;/td&gt;
&lt;td&gt;confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indicators help linear models more than powerful ones&lt;/td&gt;
&lt;td&gt;Van Ness §3&lt;/td&gt;
&lt;td&gt;confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screening keeps the gain with fewer features&lt;/td&gt;
&lt;td&gt;Van Ness Alg. 1&lt;/td&gt;
&lt;td&gt;confirmed, extended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imputation accuracy barely matters for prediction&lt;/td&gt;
&lt;td&gt;Le Morvan &amp;amp; Varoquaux&lt;/td&gt;
&lt;td&gt;confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every prediction holds. The null was a property of &lt;em&gt;this table&lt;/em&gt;, not a counterexample to&lt;br&gt;
the theory — and removing ten columns makes Ames behave exactly as the literature says it&lt;br&gt;
should.&lt;/p&gt;




&lt;h2&gt;
  
  
  Four things worth stealing
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A missingness threshold is not a triage rule.&lt;/strong&gt; It deleted the only three columns whose
blanks weren't duplicated elsewhere, and kept the ones that were.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Strong missingness effect" is not a reason to keep a flag.&lt;/strong&gt; "…and nothing else can
reconstruct it" is. That second test costs one classifier per column.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neither test needs semantics.&lt;/strong&gt; Both run on &lt;code&gt;f_0347&lt;/code&gt; exactly as well as on
&lt;code&gt;GarageQual&lt;/code&gt; — the case where you can't read the docs. Axis 1 is Van Ness et al.'s SMIM;
Axis 2 is the addition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the screen inside your CV folds.&lt;/strong&gt; Axis 1 touches the target, so selecting columns
on the full dataset leaks. It changes which columns get picked fold to fold, and that
variation is information too.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Where this flips.&lt;/strong&gt; Ames is unusually redundant — it ships a numeric companion for nearly&lt;br&gt;
every categorical quality column. Tables without that luxury are where the second axis earns&lt;br&gt;
its keep: survey non-response, lab panels ordered only when a clinician suspects something,&lt;br&gt;
credit-application fields a declining applicant left empty. There the blank is often the&lt;br&gt;
only place the fact lives. The method doesn't assume either way — it measures.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
