diff --git a/bibliography.bib b/bibliography.bib index f4dfdf4..8dc56eb 100644 --- a/bibliography.bib +++ b/bibliography.bib @@ -1,4 +1,15 @@ +@inreference{2021naivebayesclassifier, + title = {Naive {{Bayes}} Classifier}, + booktitle = {Wikipedia}, + date = {2021-05-21T00:32:52Z}, + url = {https://en.wikipedia.org/w/index.php?title=Naive_Bayes_classifier&oldid=1024247473}, + urldate = {2021-06-03}, + abstract = {In statistics, naive Bayes classifiers are a family of simple "probabilistic classifiers" based on applying Bayes' theorem with strong (na\"ive) independence assumptions between the features (see Bayes classifier). They are among the simplest Bayesian network models, but coupled with kernel density estimation, they can achieve higher accuracy levels.Na\"ive Bayes classifiers are highly scalable, requiring a number of parameters linear in the number of variables (features/predictors) in a learning problem. Maximum-likelihood training can be done by evaluating a closed-form expression, which takes linear time, rather than by expensive iterative approximation as used for many other types of classifiers. In the statistics and computer science literature, naive Bayes models are known under a variety of names, including simple Bayes and independence Bayes. All these names reference the use of Bayes' theorem in the classifier's decision rule, but na\"ive Bayes is not (necessarily) a Bayesian method.}, + annotation = {Page Version ID: 1024247473}, + langid = {english} +} + @inproceedings{alshangiti2019whydevelopingmachine, title = {Why Is {{Developing Machine Learning Applications Challenging}}? {{A Study}} on {{Stack Overflow Posts}}}, shorttitle = {Why Is {{Developing Machine Learning Applications Challenging}}?}, @@ -113,6 +124,22 @@ langid = {english} } +@inproceedings{duenas2018percevalsoftwareproject, + title = {Perceval: Software Project Data at Your Will}, + shorttitle = {Perceval}, + booktitle = {Proceedings of the 40th {{International Conference}} on {{Software Engineering}}: {{Companion Proceeedings}}}, + author = {Due\~nas, Santiago and Cosentino, Valerio and Robles, Gregorio and Gonzalez-Barahona, Jesus M.}, + date = {2018-05-27}, + pages = {1--4}, + publisher = {{Association for Computing Machinery}}, + location = {{New York, NY, USA}}, + doi = {10.1145/3183440.3183475}, + abstract = {Software development projects, in particular open source ones, heavily rely on the use of tools to support, coordinate and promote development activities. Despite their paramount value, they contribute to fragment the project data, thus challenging practitioners and researchers willing to derive insightful analytics about software projects. In this demo we present Perceval, a loyal helper able to perform automatic and incremental data gathering from almost any tool related with contributing to open source development, among others, source code management, issue tracking systems, mailing lists, forums, and social media. Perceval is an industry strong free software tool that has been widely used in Bitergia, a company devoted to offer commercial software analytics of software projects. It hides the technical complexities related to data acquisition and eases the definition of analytics. A video showcasing the main features of Perceval can be found at https://youtu.be/eH1sYF0Hdc8.}, + isbn = {978-1-4503-5663-3}, + keywords = {empirical software engineering,open source software,software analytics,software development,software mining}, + series = {{{ICSE}} '18} +} + @article{fan2021whatmakespopular, title = {What Makes a Popular Academic {{AI}} Repository?}, author = {Fan, Yuanrui and Xia, Xin and Lo, David and Hassan, Ahmed E. and Li, Shanping}, @@ -207,6 +234,19 @@ number = {4} } +@book{harrington2012machinelearningaction, + title = {Machine {{Learning}} in {{Action}}}, + author = {Harrington, Peter}, + date = {2012-04-19}, + publisher = {{Manning Publications}}, + abstract = {SummaryMachine Learning in Action is unique book that blends the foundational theories of machine learning with the practical realities of building tools for everyday data analysis. You'll use the flexible Python programming language to build programs that implement algorithms for data classification, forecasting, recommendations, and higher-level features like summarization and simplification.About the BookA machine is said to learn when its performance improves with experience. Learning requires algorithms and programs that capture data and ferret out the interestingor useful patterns. Once the specialized domain of analysts and mathematicians, machine learning is becoming a skill needed by many.Machine Learning in Action is a clearly written tutorial for developers. It avoids academic language and takes you straight to the techniques you'll use in your day-to-day work. Many (Python) examples present the core algorithms of statistical data processing, data analysis, and data visualization in code you can reuse. You'll understand the concepts and how they fit in with tactical tasks like classification, forecasting, recommendations, and higher-level features like summarization and simplification.Readers need no prior experience with machine learning or statistical processing. Familiarity with Python is helpful. Purchase of the print book comes with an offer of a free PDF, ePub, and Kindle eBook from Manning. Also available is all code from the book. What's InsideA no-nonsense introductionExamples showing common ML tasksEveryday data analysisImplementing classic algorithms like Apriori and AdaboosTable of ContentsPART 1 CLASSIFICATIONMachine learning basicsClassifying with k-Nearest NeighborsSplitting datasets one feature at a time: decision treesClassifying with probability theory: na\"ive BayesLogistic regressionSupport vector machinesImproving classification with the AdaBoost meta algorithmPART 2 FORECASTING NUMERIC VALUES WITH REGRESSIONPredicting numeric values: regressionTree-based regressionPART 3 UNSUPERVISED LEARNINGGrouping unlabeled items using k-means clusteringAssociation analysis with the Apriori algorithmEfficiently finding frequent itemsets with FP-growthPART 4 ADDITIONAL TOOLSUsing principal component analysis to simplify dataSimplifying data with the singular value decompositionBig data and MapReduce}, + file = {/home/norangebit/Documenti/10-personal/12-organizzation/07-zotero-attachments/Manning Publications/Harrington_2012_Machine Learning in Action.pdf}, + isbn = {978-1-61729-018-3}, + keywords = {Computers / Computer Science,Computers / Data Processing,Computers / Databases / Data Mining,Computers / Intelligence (AI) & Semantics,Computers / Mathematical & Statistical Software,Computers / Programming / Algorithms,Computers / Programming / Open Source,Computers / Programming Languages / Python}, + langid = {english}, + pagetotal = {384} +} + @inproceedings{hassan2009predictingfaultsusing, title = {Predicting Faults Using the Complexity of Code Changes}, booktitle = {2009 {{IEEE}} 31st {{International Conference}} on {{Software Engineering}}}, diff --git a/src/chapter_2.md b/src/chapter_2.md index f635063..b27a3be 100644 --- a/src/chapter_2.md +++ b/src/chapter_2.md @@ -1,19 +1,78 @@ -# Collezione dei dati +# Collezione dei dati e analisi preliminare + +## Selezione dei progetti L'individuazione dei progetti da analizzare è avvenuta mediate l'ausilio dell'\ac{API} messa a disposizione da GitHub. In particolare è stata eseguita una query per ottenere una lista di repository che fanno uso di librerie e framework di \ac{ML} come `TensorFlow`, `Pytorch` e `scikit-learn`. In questo modo è stato possibile ottenere una lista di $26758$ repository che è stata successivamente filtrata per individuare solo i progetti d'interesse per la seguente analisi. L'operazione di filtraggio è avvenuta attraverso due fasi; una prima automatica e una seconda manuale. -La prima fase è servita per selezionare unicamente i repository *popolari*. -Nella maggior parte dei casi viene utilizzato il numero di stelle come indice di popolarità dei progetti [@borges2016understandingfactorsthat], ma per questo lavoro si è preferito dare maggiore rilevanza al numero di fork, al numero di *contributors* e al numero di issues chiuse. -Questa scelta è stata dettata dall'esigenza di selezionare non solo repository popolari, ma anche caratterizzati da una forte partecipazione. +La prima fase ha avuto l'obiettivo di selezionare unicamente i repository *popolari*. +Nella maggior parte dei casi viene utilizzato il numero di stelle come indice della popolarità di un progetto [@borges2016understandingfactorsthat], ma per questo lavoro si è preferito dare maggiore rilevanza al numero di fork, al numero di *contributors* e al numero di issues chiuse. +Questa scelta è stata dettata dall'esigenza di selezionare non solo repository popolari, ma anche caratterizzati da una forte partecipazione della community. I progetti che hanno superato questa prima selezione dovevano: - essere lavori originali, per cui sono stati esclusi tutti i fork. - avere almeno cento issues chiuse. - avere dieci contributors. +- avere almeno venticinque fork. Alla fine di questa prima selezione sono rimasti solo sessantasei repository che sono stati analizzati manualmente per rimuovere listati associati a libri e/o tutorial, progetti non in lingua inglese e librerie. Alla fine di questa seconda fase solo rimasti trenta progetti. + +## Fetch di issues e commit + +Una volta individuati i progetti da analizzare si è reso necessario recuperare l'intera storia dei progetti e le issues ad essi associate. +Per entrambe le operazioni è stato utilizzato il tool *perceval*[@duenas2018percevalsoftwareproject]. +Nel caso delle issues, essendo queste informazioni non direttamente contenute all'interno del repository `git`, è stato necessario utilizzare nuovamente l'\ac{API} di GitHub. +Poiché le chiamate associate ad un singolo *token* sono limitate nel tempo si scelto di configurare *perseval* in modo tale da introdurre in automatico uno ritardo ogni qualvolta veniva raggiunto il limite. +Inoltre il codice è stato dispiegato su un \ac{VPS} in modo da rendere *frictionless* il processo di fetch. + +Con il processo precedentemente illustrato è stato possibile recuperare: + +- $34180$ commit. +- $15267$ tra issues e pull request. + +## Classificazione dei dati + +### Classificazione delle issues + +Al fine di poter eseguire un confronto tra i *bugfix* di \ac{ML} e quelli *generici* è stato necessario classificare sia le issues che i commit. +Per quanto riguarda i primi si è scelto di attuare una classificazione basata sul testo, in particolare considerando il titolo e il corpo della issue, ma escludendo i commenti di risposta in modo da non rendere i dati troppo rumorosi. + +Il numero elevato di elementi non rende praticabile una classificazione manuale per cui si è optato per una classificazione automatica. +A tal fine sono stati implementati ed analizzati due classificatori, uno supervisionato e uno non supervisionato. +I due modelli analizzati sono basati su: + +- una classificazione tramite una lista di vocaboli tipici del \ac{ML}. +- un modello *naïve Bayes* [@2021naivebayesclassifier; @harrington2012machinelearningaction]. + +La prima classificazione non necessita di un *labeling* manuale dei dati, ma richiede la definizione dei vocaboli tipici del \ac{ML}. +Questa lista non è stata costruita da zero, ma è basata su lavori precedenti[@humbatova-2019-taxonomyrealfaults]. +In questo modo tutte le issues che utilizzavano almeno un vocabolo tipico del Machine Learning sono state classificate come issues di \ac{ML}. + +Nel caso del modello *naïve Bayes*, essendo questo un algoritmo di apprendimento supervisionato, si è resa necessaria una classificazione manuale delle issues. +A tal scopo è stato eseguito un campionamento stratificato in base al progetto di provenienza di $377$ issues che sono state divise tra due lettori e labellate. +A partire da questo dataset è stato definito un training set attraverso il quale si è allenato il modello bayesiano. + +Le performance del primo modello sono state valutate attraverso il dataset di issues *labellate*, mentre per quanto il modello bayesiano la valutazione è avvenuta attraverso l'impiego del test set. +Al fine di poter confrontare i due modelli sono state utilizzate le metriche di precision e recall. +Com'è possibile notare dai valori riportati in @tbl:confronto-modelli-classificazione-issues, il modello... + +| | Classificatore statico | naïve Bayes | +|-----------|------------------------|-------------| +| precision | XX | XX | +| recall | XX | XX | + +: Confronto dei due modelli per la classificazione delle issues. {#tbl:confronto-modelli-classificazione-issues} + +### Classificazione dei commit + +Prima di poter classificare i commit si è reso necessaria un'ulteriore fase di filtraggio in modo da poter separare i commit di *bug fixing* da quelli generici. +Sono stati considerati come commit di *fix* tutti quei commit che, all'interno del messaggio, facevano riferimento a delle issues attraverso la notazione *"#"*. +Questa operazione ha ridotto il dataset dei commit a $3321$ unità. + +A questo punto è stato possibile separare i *bugfix* di Machine Learning e quelli generici. +La classificazione è stata ottenuta sfruttando la lista delle issues citate all'interno del *commit message* e sono stati considerati come commit di \ac{ML} tutti quei commit che facevano riferimento ad almeno una issue di \ac{ML}. + diff --git a/src/metadata.yaml b/src/metadata.yaml index 98c3255..d78db85 100644 --- a/src/metadata.yaml +++ b/src/metadata.yaml @@ -25,4 +25,10 @@ acronym: long: Application Program Interface - short: ML long: Machine Learning + - short: VPS + long: Virtual Private Server +##### crossref ##### +figureTitle: "Figura" +tableTitle: "Tabella" +lofTitle: "Lista delle figure" ---