Il miglior strumento di riproducibilità è creare un registro delle tue azioni, qualcosa del genere:
experiment/input ; expected ; observation/output ; current hypothesis and if supported or rejected
exp1 ; expected1 ; obs1 ; some fancy hypothesis, supported
Questo può essere scritto su un documento, ma, se i tuoi esperimenti si inseriscono in un framework computazionale, puoi utilizzare strumenti computazionali per automatizzare parzialmente o completamente quel processo di registrazione (in particolare aiutandoti a tracciare i set di dati di input che possono essere enormi e l'output figure).
Un ottimo strumento di riproducibilità per Python con una curva di apprendimento bassa è ovviamente Notebook IPython / Jupyter (non dimenticare le magie % di accesso e% di avvio ). Suggerimento: per assicurarsi che il notebook sia riproducibile, riavvia il kernel e prova a eseguire tutte le celle dall'alto verso il basso (pulsante Esegui tutte le celle): se funziona, salva tutto in un file di archivio ("blocco"), altrimenti, in particolare se è necessario eseguire celle in modo non lineare, non sequenziale e non ovvio per evitare errori, è necessario rielaborare un po '.
Un altro ottimo strumento molto recente (2015) è recipy , che è molto simile a Sumatra (vedi sotto), ma realizzato appositamente per Python. Non so se funziona con i Notebook Jupyter, ma so che l'autore li usa frequentemente, quindi suppongo che se non è attualmente supportato, lo sarà in futuro.
Anche Git è fantastico e non è legato a Python. Ti aiuterà non solo a conservare una cronologia di tutti i tuoi esperimenti, codice, set di dati, figure, ecc., Ma ti fornirà anche strumenti per mantenere ( git piccone ), collaborare ( incolpare ) e debug ( git - bisect ) usando un metodo scientifico metodo di debug (chiamato delta debugging ). Ecco la storia di un ricercatore immaginario che cerca di creare i propri esperimenti con il sistema di registrazione, fino a quando non diventa un facsimile di Git.
Un altro strumento generale lavorare con qualsiasi linguaggio (con un API Python su PyPI ) è di Sumatra , che è specificamente progettato per aiutarti a fare replicabile ricerca ( replicabili mira a produrre gli stessi risultati dato lo stesso codice e software esatto, mentre riproducibilità mira a produrre il stessi risultati dato qualsiasi mezzo, che è molto più difficile e richiede tempo e non automatizzabile).
Ecco come funziona Sumatra: per ogni esperimento che conduci attraverso Sumatra, questo software agirà come uno "stato di gioco salvato" che si trova spesso nei videogiochi. Più precisamente, salverà:
- tutti i parametri che hai fornito;
- l'esatto stato del codice sorgente dell'intera applicazione sperimentale e dei file di configurazione;
- l'output / grafici / risultati e anche qualsiasi file prodotto dalla tua applicazione sperimentale.
Costruirà quindi un database con il timestamp e altre metadate per ciascuno dei tuoi esperimenti, che potrai successivamente scansionare usando la webGUI. Poiché Sumatra ha salvato l'intero stato della tua applicazione per un esperimento specifico in un determinato momento, puoi ripristinare il codice che ha prodotto un risultato specifico in qualsiasi momento desiderato, quindi hai una ricerca replicabile a basso costo (tranne per l'archiviazione se lavori su enormi set di dati, ma puoi configurare eccezioni se non vuoi salvare tutto ogni volta).
Un altro fantastico strumento è Zeitgeist di GNOME (precedentemente codificato in Python ma ora portato su Vala), un sistema di journaling di azioni onnicomprensivo, che registra tutto ciò che fai e può usare l'apprendimento automatico per riassumere per un periodo di tempo che desideri la relazione tra elementi basati su modelli di somiglianza e utilizzo, ad esempio rispondendo a domande come "Qual è stato più rilevante per me, mentre stavo lavorando al progetto X, per un mese l'anno scorso?" . È interessante notare che Zim Desktop Wiki , un'app per prendere appunti simile a Evernote, ha un plugin per lavorare con Zeitgeist.
Alla fine, puoi utilizzare Git o Sumatra o qualsiasi altro software che desideri, ti forniranno circa lo stesso potere di replicabilità, ma Sumatra è specificamente progettato per la ricerca scientifica, quindi fornisce alcuni strumenti fantasiosi come una GUI Web per la scansione i tuoi risultati, mentre Git è più mirato alla manutenzione del codice (ma ha strumenti di debug come git-bisect, quindi se i tuoi esperimenti riguardano codici, potrebbe effettivamente essere migliore). O ovviamente puoi usare entrambi!
/ EDIT: dsign ha toccato un punto molto importante qui: la replicabilità della tua configurazione è importante quanto la replicabilità della tua applicazione. In altre parole, dovresti almeno fornire un elenco completo delle librerie e dei compilatori che hai usato insieme alle loro esatte versioni e ai dettagli della tua piattaforma .
Personalmente, nell'informatica scientifica con Python, ho scoperto che impacchettare un'applicazione insieme alle librerie è troppo doloroso, quindi ora uso solo un pacchetto di pitone scientifico all-in-one come Anaconda (con l'eccezionale conda gestore pacchetti ), e consiglia agli utenti di usare lo stesso pacchetto. Un'altra soluzione potrebbe essere quella di fornire uno script per generare automaticamente un virtualenv o impacchettare tutto usando l' applicazione Docker commerciale come citata da dsign o il Vagrant di opensource (con ad esempio pylearn2-in-a-box che usa Vagrant per produrre un ridistribuibile facilmente pacchetto ambiente virtuale).
Infine, per assicurarti davvero di avere un ambiente completamente funzionante ogni volta che ne hai bisogno, puoi creare una macchina virtuale (vedi VirtualBox) e puoi persino salvare lo stato della macchina (istantanea) con l'esperimento pronto per essere eseguito all'interno. Quindi puoi semplicemente condividere questa macchina virtuale con tutto ciò che è incluso in modo che chiunque possa replicare il tuo esperimento con la tua configurazione esatta. Questo è probabilmente il modo migliore per replicare un esperimento basato su software. I contenitori potrebbero essere un'alternativa più leggera, ma non includono l'intero ambiente, quindi la fedeltà della replica sarà meno solida.
/ EDIT2: Ecco un ottimo video riassuntivo (per il debug ma questo può essere applicato anche alla ricerca) che cosa è fondamentale per fare una ricerca riproducibile: registrare i tuoi esperimenti e ogni altro passaggio del metodo scientifico, una sorta di "sperimentazione esplicita" .