8 cose che la maggior parte dei programmi di data science non insegnano (ma dovresti sapere) – Parte 1
8 cose che i programmi di data science spesso ignorano - Parte 1
Data Science 101
Il MIT lo chiama “il semestre mancante della tua formazione in informatica”

Forse hai già sentito parlare o hai già sperimentato la regola 80/20 della data science:
Solo il 20% del tempo dei data scientist viene dedicato all’analisi. La maggior parte del tempo, l’80%, viene invece trascorsa semplicemente preparando i dati.
Credo che nel mio caso potrebbe essere addirittura 90/10. Questa è solo la realtà del mio lavoro: lavoriamo con set di dati molto complessi.
Tuttavia, questo non è ciò per cui vengono preparati la maggior parte dei programmi, dei boot camp e dei corsi di data science.
- Pandas Come codificare i dati con One-Hot Encoding
- Come risolvere i problemi di ottimizzazione utilizzando la programmazione lineare
- 3 Modi Per Superare le Sfide della Qualità dei Dati in un Progetto di Analisi
Probabilmente hai imparato come utilizzare modelli predittivi complessi, raggruppare dati non strutturati e analizzare serie temporali. Senza queste competenze non sei un data scientist.
Ma l’80% del tuo tempo non sarà dedicato all’utilizzo di queste tecniche. Invece, raccoglierai, sposterai e pulirai i dati, creerai database, gestirai ambienti di calcolo remoti e ti occuperai di molte altre attività non analitiche.
Il problema è che non conoscere gli strumenti disponibili per affrontare queste attività può avere un grande impatto sulla tua produttività e potenzialmente sui risultati del progetto. Infatti, questo è un problema così diffuso che il MIT ha un corso dedicato proprio a colmare questa lacuna: il corso si chiama “il semestre mancante della tua formazione in informatica”. (Si tratta di un ottimo corso che ha ispirato il modo in cui penso a alcuni degli argomenti trattati qui.)
Questo post è l’inizio di una serie in cui parlerò di alcune lezioni pratiche che ho imparato (per lo più) lavorando nell’80% delle attività. L’obiettivo è esplorare gli strumenti disponibili per affrontare queste attività e condividere alcune buone pratiche che ho imparato nella mia carriera.
Ecco cosa affronteremo:
Parte 1 (questo post):
- Sentiti a tuo agio nell’utilizzare Linux
- Saper utilizzare in modo efficace i sistemi di calcolo remoti
- Utilizza un ambiente Python separato per ogni progetto
- Saper individuare e risolvere i bug e profilare il tuo codice
Parte 2 (prossimamente):
- Aiuta il tuo futuro te stesso preoccupandoti della riproducibilità
- Versiona tutto, compresi i dati e i modelli
- Organizza i tuoi esperimenti con gli strumenti di tracciamento degli esperimenti di machine learning
- Testa e documenta il tuo codice
In futuri post separati approfondirò ciascuno di questi argomenti.
1. Sentiti a tuo agio nell’utilizzare Linux
Anche se il tuo sistema operativo preferito è Windows, ci sono molti motivi per cui una conoscenza di base di Linux può essere molto utile.
Gli ambienti di calcolo condivisi come AWS e GCP di solito funzionano su Linux. Linux include anche una shell, che è uno strumento potente che può aiutarti a risolvere molti compiti con pochi comandi semplici.
Ecco cosa dice Software Carpentry, le cui workshop iniziano di solito con un corso di base sulla shell:
“La shell Unix esiste da più tempo di quanto la maggior parte dei suoi utenti sia viva. È sopravvissuta perché è uno strumento potente che consente agli utenti di eseguire compiti complessi e potenti, spesso con pochi tasti o poche righe di codice. Aiuta gli utenti ad automatizzare compiti ripetitivi e a combinare facilmente compiti più piccoli in flussi di lavoro più ampi e potenti. L’uso della shell è fondamentale per una vasta gamma di compiti di calcolo avanzati, compresa l’elaborazione ad alte prestazioni.”
Ecco una lista di nozioni di base che ti aiuteranno a diventare un utente efficace di Linux. Questi sono strumenti che utilizzo quotidianamente.
- Comprendere e navigare nel filesystem: concetti come la struttura delle directory, la directory home, le autorizzazioni di file e directory e i collegamenti tra file.
- La variabile
$PATH
e le variabili di ambiente. - Come elencare i processi in esecuzione e interrompere o terminare un processo.
- Comandi di base della shell per lavorare con file e directory come
cd
,ls
,cat
,less
,mkdir
,mv
,rm
,grep
efind
. - Concatenare comandi e reindirizzare l’output dei comandi.
- Sapere come modificare un file nel terminale utilizzando un editor di testo come
nano
ovim
. - Creare uno script di shell di base in modo da poter salvare i tuoi comandi e ripetere facilmente.
Questo potrebbe sembrare un elenco lungo da ricordare, ma una volta che inizi ad utilizzare regolarmente questi strumenti, diventeranno una seconda natura.
2. Essere in grado di utilizzare in modo efficiente i sistemi di calcolo remoto
Gli ambienti di calcolo remoto come AWS, GCP e Azure sono utili per due ragioni principali: ti forniscono maggiori risorse di calcolo rispetto a quelle disponibili localmente e ti consentono di eseguire processi lunghi (come addestrare modelli) senza preoccuparti di mantenere il computer acceso tutto il tempo.
Un approccio popolare, rapido e facile per utilizzare i sistemi di calcolo remoto è eseguire un server di notebook Jupyter sulla macchina remota. Il lato negativo di questa soluzione è che i notebook Jupyter non sono stati progettati per eseguire processi lunghi.
Se hai mai perso alcuni dei tuoi risultati a causa di una momentanea perdita di connessione a Internet, sai di cosa sto parlando.
Fortunatamente, Linux fornisce una serie di strumenti progettati per eseguire processi lunghi. Se già utilizzi o hai intenzione di utilizzare sistemi di calcolo remoto, familiarizzare con questi strumenti può risparmiarti molti mal di testa in futuro.
Ci sono due azioni chiave che eseguirai durante l’utilizzo dei sistemi di calcolo remoto:
- Connessione tramite ssh e trasferimento dati avanti e indietro con strumenti come
scp
ersync
(rsync
è uno strumento importante da avere nel tuo kit di strumenti perché con l’opzione-P
può riprendere un trasferimento interrotto – questo può essere molto utile per file di grandi dimensioni). - Gestione dei processi in esecuzione a lungo termine utilizzando strumenti come
nohup
,screen
etmux
in modo che i processi non si interrompano quando ti disconnetti dalla macchina remota.
Con questi strumenti, dovresti essere in grado di eseguire processi su macchine remote come se fossi lì di persona.
3. Utilizzare un ambiente Python separato per ogni progetto
Credo che questa sia un’idea piuttosto semplice, ma nella mia esperienza è sorprendentemente poco comune nella pratica.
Un errore comune che fanno i data scientist è non preoccuparsi di utilizzare ambienti virtuali affatto o utilizzare un ambiente condiviso per tutti i progetti.
C’è già stato molto scritto su perché dovresti utilizzare gli ambienti virtuali di Python, ma in poche parole, non utilizzare affatto un ambiente virtuale significa che le librerie di terze parti di cui hai bisogno vengono installate direttamente nell’installazione di sistema di Python. Questo potrebbe potenzialmente influire su qualsiasi attività di sistema che dipende da Python – nel caso peggiore, potrebbe danneggiare il tuo sistema operativo.
Utilizza gli ambienti virtuali di Python (venv
, conda
, pipenv
, o qualunque sia il tuo gestore di ambienti virtuali preferito) per ogni. singolo. progetto., indipendentemente dalla sua dimensione.
È possibile che molti dei tuoi progetti condividano le stesse dipendenze, ad esempio lo stack tipico di Python per la data science. In questo caso, condividere un ambiente tra i progetti potrebbe sembrare una buona idea. Dopotutto, ti fa risparmiare tempo e spazio, giusto?
Ci sono molte ragioni per cui non dovresti farlo. Ecco alcune delle principali:
- Rischio di incontrare problemi con le versioni delle librerie tra diversi progetti. Hai mai sentito parlare di “dependency hell”? Questo potrebbe sembrare un caso limite, ma può essere più comune di quanto si pensi.
- È più difficile capire quali librerie sono necessarie per quale progetto. Questo può essere particolarmente problematico se stai lavorando su un progetto collaborativo e devi condividere il tuo ambiente con il resto del team.
Mantenere un ambiente separato per ogni progetto potrebbe sembrare un’operazione onerosa, ma oggi ci sono molti strumenti che rendono la gestione degli ambienti virtuali semplice e senza problemi (due dei miei preferiti sono virtualenvwrapper
e pipenv
). Consiglio vivamente di testare diversi strumenti per vedere quale funziona meglio con il tuo flusso di lavoro.
4. Sapere come eseguire il debug e il profiling del tuo codice
Il fatto di scrivere codice è che nessuno scrive codice perfetto.
È probabile che a un certo punto tu abbia passato ore a controllare la logica del tuo codice perché non fa quello che vuoi, solo per scoprire che hai scambiato accidentalmente delle variabili o hai dimenticato di chiamare model.eval()
. Questa è una realtà frustrante per chiunque scriva codice per vivere.
Il fatto di scrivere codice è che nessuno scrive codice perfetto.
Un primo passo naturale quando si affronta un errore strano è utilizzare una serie di istruzioni di stampa e testare iterativamente il codice. Spesso, questo è sufficiente per individuare il problema, ma non è sempre una soluzione senza problemi (hai mai trovato un’istruzione di stampa di debug dimenticata nel tuo vecchio codice?).
Entra negli strumenti di debug.
I debuggers ti consentono di eseguire il tuo codice passo dopo passo e ispezionare lo stato di ogni variabile nel tuo codice. Fondamentalmente, fanno quello che fanno le tue istruzioni di stampa, ma in modo sistematico e con un semplice clic di un pulsante.
C’è una lunga lista di debuggers con cui puoi sperimentare: Python pdb
, il debugger di PyCharm, il debugger di Visual Studio Code (il mio preferito) e molti altri. Se scrivere codice è qualcosa che fai quotidianamente, imparare ad usare un debugger può essere un investimento di tempo molto utile che può risparmiarti molti mal di testa nel lungo periodo.
Misurare il tempo e profilare il tuo codice
Forse il tuo codice funziona come previsto, ma impiega più tempo o utilizza più risorse di quanto vorresti. Nella mia programmazione personale, spesso mi concentro solo nel mettere in atto una soluzione funzionante e mi preoccupo di ottimizzare il mio codice successivamente (ovviamente, la parte di ottimizzazione non sempre avviene, ma spero che alla fine sia risolta da LLMs).
In questo caso, l’utilizzo di misurazioni di tempo e il profiling possono aiutare. Entrambi ti aiutano a fare la stessa cosa: scoprire punti deboli ed inefficienze nel tuo codice, ma utilizzando approcci diversi.
La misurazione del tempo semplicemente misura quanto tempo è trascorso tra due punti del tuo codice. Puoi utilizzarla per misurare quanto tempo impiega una determinata funzione per essere eseguita (il modulo Python timeit
ha alcuni utili esempi).
Ci sono diversi tipi di profilers, ma tutti ti aiutano a fare la stessa cosa: semplicemente, misurano quanto tempo è stato impiegato per ogni chiamata di funzione. Python ha un profiler integrato cProfile
, e ci sono anche molte opzioni di terze parti come Palanteer e Yappi.
Indipendentemente dalla scelta che fai per il profiling, se mai riscrivi ed ottimizzi il tuo codice, dovresti considerare l’aggiunta di un profiler al tuo set di strumenti Python.
Una nota sul debugging
Dove i tradizionali debuggers di codice non saranno sufficienti è il debugging degli algoritmi di apprendimento. Forse il tuo modello non converge o ha una performance troppo buona o troppo scadente. Anche se tecnicamente puoi utilizzare un debugger su un modello di regressione o su un algoritmo di clustering, a meno che tu non li abbia implementati tu stesso, l’algoritmo stesso è probabilmente corretto e il problema risiede altrove: una scelta errata dell’algoritmo di apprendimento, dati insufficienti, iperparametri inappropriati, ecc.
Il debugging degli algoritmi di data science richiede una combinazione di comprensione dei dati, intuizione su come funziona l’algoritmo e conoscenza di tecniche come l’analisi degli errori, tra le altre cose. Andrew Ng fornisce consigli per il debugging degli algoritmi di apprendimento in questa fantastica lezione. Fammi sapere nei commenti se saresti interessato a un articolo separato su questo argomento.
Se sei arrivato fin qui, grazie per aver letto! Spero che tu abbia apprezzato questo articolo. Se desideri ricevere notifiche quando pubblico un nuovo articolo, considera di iscriverti alle notifiche via email qui.