← Torna ai progetti

Breast Cancer Preprocessing Pipeline

2026-04-01 · Data Engineering

Cos'è il progetto

Breast Cancer Preprocessing Pipeline è un sistema di preprocessing con scikit-learn pensato per preparare dati tabellari medicali a esperimenti di machine learning. Il progetto combina transformer custom, ColumnTransformer, FeatureUnion, selezione delle feature e PCA in un flusso riutilizzabile.

Contesto tecnico

Un dataset per lo studio del tumore al seno contiene 569 osservazioni e 30 variabili di input, ma non può essere passato direttamente a un modello di machine learning. Tutte le feature presentano valori mancanti, le distribuzioni numeriche hanno livelli di asimmetria differenti e la colonna area error è categorica.

Il problema progettuale consisteva nel trasformare questi dati eterogenei in una matrice coerente, mantenendo nello stesso flusso strategie diverse: elaborazione condizionale di un sottoinsieme, selezione supervisionata delle feature e riduzione dimensionale.

Obiettivo

L'obiettivo era costruire un sistema di preprocessing riusabile con le API di scikit-learn:

  • imputare i valori mancanti con strategie adatte al tipo di variabile;
  • distinguere feature numeriche simmetriche e asimmetriche;
  • correggere le distribuzioni con skewness superiore a 0,75;
  • codificare la variabile categorica;
  • selezionare le cinque feature più informative;
  • ridurre la dimensionalità conservando l'80% della varianza;
  • combinare i tre risultati in un unico output.

Il progetto riguarda la preparazione del dato e non addestra un classificatore diagnostico. L'output è pensato come input strutturato per sperimentazioni downstream.

Architettura

Il DataFrame sorgente contiene 31 colonne: 30 feature e una variabile target. Dopo la separazione in X e y, tre pipeline vengono eseguite in parallelo e combinate tramite FeatureUnion.

  1. Pipeline 1 applica trasformazioni differenziate al sottoinsieme con target=1;
  2. Pipeline 2 prepara l'intero dataset e seleziona cinque feature con SelectKBest;
  3. Pipeline 3 prepara le variabili numeriche e applica PCA con soglia di varianza all'80%;
  4. FeatureUnion concatena orizzontalmente i tre output;
  5. la matrice finale ha dimensione (569, 43).

Pipeline 1: trasformazione condizionale

Il primo ramo studia il sottoinsieme identificato da target=1. Sulle variabili numeriche viene calcolata la skewness e le colonne vengono divise in due gruppi:

  • feature simmetriche: imputazione con media e StandardScaler;
  • feature asimmetriche: imputazione con mediana, correzione logaritmica e standardizzazione;
  • feature categorica: imputazione con il valore più frequente e OneHotEncoder.

Il transformer personalizzato PipelineWithRowFilter esegue questa pipeline soltanto sulle righe che soddisfano la condizione. Per le altre righe genera valori pari a zero, preservando il numero complessivo di osservazioni. Questo ramo produce 30 feature.

Transformer personalizzato per la skewness

SkewnessCorrector implementa le interfacce BaseEstimator e TransformerMixin. Durante fit identifica le colonne con skewness assoluta superiore a 0,75; durante transform applica log1p soltanto a quelle colonne.

La compatibilità con l'API scikit-learn permette di inserire la trasformazione in Pipeline e ColumnTransformer, evitando passaggi manuali fuori dal flusso.

Pipeline 2: selezione delle feature

Il secondo ramo lavora su tutte le 569 osservazioni:

  • le variabili numeriche vengono imputate con la media e discretizzate in tre intervalli quantili;
  • area error viene imputata e codificata ordinalmente secondo le categorie A, B e C;
  • SelectKBest con test f_classif conserva cinque feature.

Le feature selezionate sono mean perimeter, worst perimeter, worst area, worst concavity e worst concave points.

Pipeline 3: riduzione dimensionale

Il terzo ramo utilizza esclusivamente le feature numeriche. La sequenza applica imputazione con media, correzione della skewness, standardizzazione, PCA e normalizzazione finale con MinMaxScaler.

PCA(n_components=0.80) determina automaticamente il numero di componenti necessario a conservare almeno l'80% della varianza. Sul dataset del progetto il risultato è composto da otto componenti.

Composizione con FeatureUnion

Dopo il test indipendente, le tre pipeline vengono registrate in un unico FeatureUnion. La trasformazione finale concatena:

  • 30 feature dalla Pipeline 1;
  • 5 feature dalla Pipeline 2;
  • 8 componenti dalla Pipeline 3.

L'output è un array NumPy di forma (569, 43). La struttura dimostra come strategie di preprocessing differenti possano essere isolate, testate separatamente e poi composte in un solo oggetto scikit-learn.

Risultati

  • 569 osservazioni mantenute durante l'intero flusso;
  • valori mancanti gestiti in base al tipo e alla distribuzione delle feature;
  • due transformer personalizzati compatibili con scikit-learn;
  • cinque feature selezionate tramite analisi supervisionata;
  • otto componenti PCA per rappresentare almeno l'80% della varianza;
  • 43 feature complessive prodotte da tre rami indipendenti.

Evoluzioni future

La pipeline raggiunge l'obiettivo previsto dal progetto didattico: applicare strategie di preprocessing differenti e combinarle in una matrice strutturata per analisi successive. Non era richiesto addestrare un modello predittivo né produrre metriche cliniche.

Per trasformare il notebook in un componente riutilizzabile all'interno di un workflow ML reale, le evoluzioni principali sarebbero:

  • adattare PipelineWithRowFilter affinché transform non dipenda dalle etichette target, evitando target leakage e rendendo possibile l'elaborazione di dati nuovi;
  • documentare in modo esplicito la corrispondenza tra valori numerici del target e classi della sorgente;
  • preservare nomi interpretabili per tutte le 43 feature finali;
  • aggiungere test automatici su dimensioni, valori nulli e riproducibilità;
  • serializzare la pipeline addestrata come artefatto versionato.

L'eventuale classificatore, con relative metriche e procedure di validazione, costituirebbe una fase successiva distinta dal preprocessing e non un requisito mancante di questo progetto.

FAQ tecniche

Perché usare tre pipeline invece di una sola?

I tre rami rispondono a obiettivi differenti: trasformazione condizionale, selezione supervisionata e riduzione dimensionale. Separarli rende ogni strategia leggibile e consente di combinarne gli output senza mescolare la logica.

Perché usare FeatureUnion?

FeatureUnion esegue più transformer sullo stesso input e concatena i risultati per colonne. È quindi adatto a creare una rappresentazione finale composta da feature ottenute con strategie differenti.

La pipeline effettua una diagnosi?

No. Il progetto prepara un dataset a scopo didattico. Non include un classificatore, metriche diagnostiche o validazione per uso clinico.

Qual è il principale limite del filtro per righe?

Il wrapper dipende dal target usato durante il training e lo riutilizza per decidere quali righe trasformare. Questo comportamento è sufficiente per dimostrare la logica nel notebook, ma deve essere modificato prima di usare la pipeline su dati nuovi o all'interno di train/test split e cross-validation.

Read in English