Portrait of Giuseppe Muschetta

Giuseppe Muschetta

Computer Scientist|Data Scientist|Machine Learning Engineer · Pisa, Italy

From 10+ years in sales to machine learning.

I'm completing my MSc in Computer Science, specializing in Data Science and Business Informatics, at the University of Pisa. I build models that work on real data and explain their decisions, from optimization and NLP to big data and business intelligence.

Open to Machine Learning Engineer and Data Scientist roles, in Italy or abroad
k-means, live. Click to re-run.k = 5
264.9×faster than standard solvers, with my Lasso solver
3.27Mseismic records mined with PySpark
568kAmazon reviews, from TF-IDF to DistilBERT
0.98ROC AUC on sentiment analysis
24open-source projects on GitHub
10+years in sales before computer science
01 / Story

A career change, done properly.

A fresh start: new city, new field, same determination.

I spent more than ten years in sales: on the phone for brands like Vodafone, Eni and Fastweb, and on the shop floor at GameStop, Foot Locker and others. It taught me to listen, to negotiate and to turn a skeptical customer into a convinced one. But deep down I knew it was not what I wanted to do with my life.

So I changed it. At 34 I moved from Bari to Pisa and started again from scratch, to devote myself to my real passion: computer science and machine learning. I earned my BSc in Computer Science at the University of Pisa, with a thesis on an original decision tree algorithm written from scratch in Python.

Today I'm completing my MSc in Computer Science, specializing in Data Science and Business Informatics, and I'm looking for a team where both halves of my story count: the rigour of the models and the ability to explain them to the people who use them.

Ten years in sales taught me what many technical profiles miss: explaining complex things simply.
  1. until 2018 · Bari
    Ten years in sales
    Telesales for Vodafone, Eni, Fastweb, 3 and Wind; retail at GameStop, Foot Locker and others.
  2. 2018
    From Bari to Pisa, a fresh start
    Enrolled in Computer Science at the University of Pisa.
  3. 2021 – 2023
    Systems & networking
    Concurrent C, distributed Java, an interpreter in OCaml.
  4. 2023
    BSc in Computer Science
    Thesis: an original multiway-split decision tree.
  5. 2023 → today
    MSc, Data Science & Business Informatics
    Machine learning, NLP, big data, optimization, business intelligence.
  6. next
    Your team?
    Open to Machine Learning Engineer and Data Scientist roles, in Italy or abroad.
02 / Selected work

Six projects, from problem to result.

Problem, approach and result, with the numbers from each repository. Everything is open source.

Numerical optimizationPython

High-Performance Mehrotra Lasso Solver

A custom interior-point solver that beats general-purpose tools by exploiting the structure of the problem.

Problem

Constrained Lasso is a core sparse-regression problem, but general-purpose solvers like OSQP and SCS treat it as just another quadratic program.

Approach

Derived the quadratic reformulation and KKT conditions, then implemented Mehrotra's predictor-corrector method, reducing each Newton step to a structured positive definite system.

Result

Up to 264.9× faster than CVXPY baselines, with near-identical solutions, on datasets of up to 2,000 features.

NumPySciPyCVXPYKKTConvex optimizationView on GitHub ↗
264.9×
peak speedup over CVXPY baselines
Speedup vs CVXPY, by dataset
Diabetes7.3×California Housing264.9×IMDb33.5×Synthetic, 2,000 features44.4×
From the repository
Algorithm 1: Mehrotra's predictor-corrector interior-point method for the Lasso QP
The algorithm I derived and implemented: predictor step, centering and corrector step.
Speedup of the solver against CVXPY as the normalized budget changes, on a log scale
Speedup vs CVXPY across budget levels, on a log scale: above the dashed line my solver is faster.
Advanced data mining · XAI · time seriesPython · Jupyter

IMDb: Advanced Data Mining, Explainable AI & Time Series

My largest project: tabular and temporal data mining on the whole IMDb catalog, from anomalies to explainable predictions.

Problem

149,531 heterogeneous IMDb records and 1,134 box-office revenue curves: skewed features, rare classes and patterns hidden in time.

Approach

Robust scaling with Yeo-Johnson, consensus anomaly detection with three detectors, imbalanced learning, tree ensembles and a regularized neural network explained with SHAP; DTW clustering, matrix profiles, shapelets and MiniROCKET on the time series.

Result

A 9-notebook, 32-page study: 1,089 anomalies confirmed by consensus, rating models explained feature by feature, and box-office trajectories grouped into distinct commercial lifecycles.

SHAPIsolation ForestSMOTEDTWMiniROCKETView on GitHub ↗
149k
IMDb records, plus 1,134 box-office time series
1,089anomalies confirmed by 3 detectors in consensus
96 : 4class imbalance tackled with SMOTE and undersampling
100days of revenue per film, clustered with DTW
From the repository
Global SHAP feature importance of the Random Forest across the ten rating classes
SHAP: which features drive each of the ten rating classes.
t-SNE projection of the films clustered with K-Medoids on DTW distances
Box-office trajectories clustered with K-Medoids on DTW distances (t-SNE view).
Explainable MLPython · Jupyter

SoundPulse — Explainable Machine Learning on Spotify

Can the sound of a track explain its genre and its popularity? An end-to-end answer on 114,000 songs.

Problem

114,000 tracks spread over 114 overlapping Spotify genres, with popularity that no single audio feature explains.

Approach

A hand-built taxonomy from 114 to 10 macro-genres, LOF anomaly detection, K-Means validated by a 4.6M-parameter deep network, tree ensembles, SMOTE and SHAP.

Result

97.5% cluster recovery, 0.90 macro ROC AUC on 10 genres, 18× the R² of linear models and +59% recall on the rare explicit class.

scikit-learnXGBoostRandom ForestSMOTESHAPView on GitHub ↗
18×
R² gain over linear baselines on popularity
97.5%cluster recovery by the deep network
0.90macro ROC AUC on 10 genres
+59%recall on the rare explicit class
From the repository
Three-dimensional view of the K-Means clusters of Spotify tracks
The K-Means clusters of the tracks, in three dimensions.
Local Outlier Factor results on a PCA projection, with the ten most extreme tracks marked
Local Outlier Factor: 5,700 anomalous tracks and the 10 most extreme.
NLP & deep learningPython · Jupyter

NLP: Amazon Sentiment, from Machine Learning to Transformers

Four generations of NLP on the same half-million reviews, compared fairly.

Problem

568,454 Amazon reviews: how far do classic methods go, and what do deep learning and transformers really add?

Approach

A balanced study set of 164,074 reviews; Naive Bayes and linear SVM on TF-IDF, a custom 2.66M-parameter CNN-BiLSTM on Word2Vec trained on the corpus, and DistilBERT.

Result

ROC AUC rises from 0.96 to 0.98, with detailed error analysis and precision-recall evaluation for every model.

TF-IDFWord2VecCNN-BiLSTMDistilBERTHugging FaceView on GitHub ↗
0.98
ROC AUC of the CNN-BiLSTM and DistilBERT
ROC AUC by model
Naive Bayes0.96Linear SVM0.97CNN-BiLSTM0.98DistilBERT0.98axis from 0.9 to 1
From the repository
Word cloud of the most frequent words in positive reviews
The most frequent words in positive reviews, after cleaning.
ROC curve of the DistilBERT classifier with an area of 0.98
DistilBERT ROC curve: area under the curve 0.98.
Big dataPySpark · Jupyter

Planet-Scale Earthquake Mining with PySpark

49 years of global seismic data, processed in a distributed way, without throwing information away.

Problem

3.27 million seismic records from 1970 to 2019, with key variables missing in up to 41% of rows.

Approach

Regression-based imputation in Spark instead of dropping columns, K-Means on standardized features and on geography, Random Forest magnitude classification with threshold analysis, Folium maps.

Result

A clean catalog of 2,607,588 earthquakes and clusters that isolate deep events down to 735 km and remote, poorly covered regions.

PySparkSpark MLlibK-MeansRandom ForestFoliumView on GitHub ↗
3.27M
records processed with PySpark
Missing values recovered by imputation
dmin41.15%magNst30.22%nst26.94%gap25.62%
From the repository
World map of earthquakes colored by geographical cluster
Interactive Folium world map, colored by geographical cluster.
Scatter plot of earthquake coordinates colored by the eight K-Means clusters
Geographical K-Means with eight clusters on the earthquake coordinates.
Algorithms · BSc thesisPython

Native Categorical Multiway-Split Decision Trees

My BSc thesis: a decision tree that splits the way the data actually is.

Problem

Popular libraries build binary trees and need categorical data to be encoded into numbers first.

Approach

An original classifier written from scratch: native categorical attributes, multiway splits, three strategies for numerical data, two impurity criteria and pre-pruning.

Result

Benchmarked against scikit-learn on 10 datasets and 51,840 recorded evaluations, with comparable peak accuracy, higher on two datasets. Documented in a 75-page thesis.

Pythonfrom scratchscikit-learn benchmark75-page thesisView on GitHub ↗
10
datasets benchmarked against scikit-learn
One split, four branches
color?redgreenblueother
A binary tree needs three separate splits to reach the same four branches.
The core of the algorithm · Python
MixedDecisionTree.py · _fit()
def _fit(self, data: pd.DataFrame, features: list[str],         current_depth: int) -> "MixedDecisionTree.Node":    """Grow the tree recursively, one multiway split    at a time, until a stopping criterion is met."""    node, stop = self._stoppingCriteria(data, features)    if stop:        return node    # choose the attribute with the highest information gain    gain_dict = {f: self._getGain(data, f) for f in features}    best_split_attribute = max(gain_dict, key=gain_dict.get)    remaining_features = [        f for f in features if f != best_split_attribute]    root = MixedDecisionTree.Node()    root.split_condition = best_split_attribute    root.gain = gain_dict[best_split_attribute]    root.depth = current_depth    # multiway split: one child for every attribute value    for value, sub_data in data.groupby(best_split_attribute):        child = self._fit(sub_data, remaining_features,                          current_depth + 1)        child.split_value, child.parent = value, root        root.children.append(child)    return root
The recursive heart of the algorithm: one child per value, then recurse.
MixedDecisionTree.py · _getGain()
def _getGain(self, data: pd.DataFrame,             split_attribute_name: str) -> float:    """Information gain of a multiway split on an attribute."""    I_parent = self._get_impurity(data[self.class_name])    # weighted impurity of ALL the children of the split    column = data[split_attribute_name]    groups = data[self.class_name].groupby(column)    weights = groups.size() / len(data)    I_child = sum(w * self._get_impurity(labels)                  for w, (_, labels) in zip(weights, groups))    # clip tiny negative values due to floating-point error    return max(I_parent - I_child, 0.0)def _get_impurity(self, attribute: pd.Series) -> float:    """Entropy or Gini index of a column of class labels."""    _, counts = np.unique(attribute, return_counts=True)    p = counts / counts.sum()    if self.criterion == "entropy":        return float(-np.sum(p * np.log2(p)))    if self.criterion == "gini":        return float(1.0 - np.sum(p ** 2))    raise ValueError("criterion must be 'entropy' or 'gini'")
Information gain over all the branches of a multiway split.
03 / Index

Everything else.

All my public projects, filterable by area. Click a row to open the repository.

ProjectAreaBuilt withHighlight
Smaller projects & exercises 12 repositories
04 / Curriculum

Education, experience, skills.

The full picture, in the order that matters most to me: what I studied, what I built, what I learned along the way.

Education

2023 → in progressUniversity of Pisa

MSc in Computer Science

Specialization: Data Science & Business Informatics
Exams in the study plan
Machine LearningData MiningDistributed Data Analysis and MiningNatural Language ProcessingStatistics for Data ScienceOptimization for Data ScienceDecision Support SystemsBusiness Process ModelsProgrammatic AdvertisingFundamentals of Business ManagementEconomics and Enterprise Management
2018 – 2023University of Pisa

BSc in Computer Science

Thesis: an original multiway-split decision tree with native categorical support, written from scratch in Python.
Exams in the study plan · Computer Science
Algorithms and LaboratoryProgramming I and LaboratoryProgramming IILogic for ProgrammingComputer ArchitectureOperating Systems and LaboratoryComputer Networks and LaboratoryDatabasesSoftware EngineeringUser Interface ProgrammingIntroduction to Artificial IntelligenceCryptographyComputability and ComplexityInformation Theory
Exams in the study plan · Mathematics & Economics
CalculusDiscrete Mathematics and Linear AlgebraProbability and StatisticsNumerical MethodsOperations ResearchPhysicsEconomics
DiplomaBitetto (Bari)

Scientific High School Diploma

E. Amaldi Scientific High School

Experience

2023 → presentUniversity of Pisa
alongside the MSc

Machine Learning Engineer

University of Pisa · applied data science and machine learning projects

Hands-on machine learning on real, large-scale data. Every project is open source on GitHub.

  • Optimization: custom Mehrotra interior-point solver for constrained Lasso, up to 264.9× faster than OSQP/SCS via CVXPY, scaling to 2,000 features.
  • Explainable ML: SoundPulse on 114,000 Spotify tracks, with anomaly detection, clustering validated by a 4.6M-parameter deep net (97.5% agreement), ensembles with 18× the R² of linear baselines and SHAP.
  • Data mining & time series: two IMDb projects on up to 149,531 records and 1,134 box-office time series: clustering, regression (R² = 0.75), FP-Growth rules, DTW clustering and MiniROCKET.
  • NLP & deep learning: 568,454 Amazon reviews, from TF-IDF baselines to a custom CNN-BiLSTM and DistilBERT, with ROC AUC up to 0.98.
  • Big data: 3.27 million seismic records with PySpark: imputation, K-Means, Random Forest and Folium maps.
  • Business intelligence: data warehousing, ETL with SSIS, OLAP cubes with SSAS, MDX and Power BI.
2021 – 2023Independent
alongside the BSc

Independent Software Development

Designed and built systems and networking software on my own initiative, beyond what courses required: a multithreaded client-server collaboration platform in Java (TCP, RMI, UDP multicast), a multi-process supermarket simulator in pure C (POSIX threads, sockets, signals), thread-pool and non-blocking NIO servers, and an interpreter in OCaml. All published open source on GitHub.

10+ years, until 2018Bari area

Sales Representative

Telecommunications, Energy & Retail

More than ten years in sales, on the phone and on the shop floor, before becoming a computer scientist and data scientist. Every day was a negotiation with real people, real objections and real targets.

Telesales – telecommunications and energy
  • Outbound telesales for major Italian telecom and energy providers, including Vodafone, Eni, Fastweb, 3 and Wind.
  • FlipCall, Bitritto (BA), working on behalf of Comdata, one of Italy's largest customer-experience companies.
  • E-Care, Modugno (BA): Vodafone mobile plans and home broadband lines.
  • Mobile, broadband and energy offers for residential customers, handling every call from first contact to signed contract and adapting the pitch to each customer's needs and objections.
Retail – GameStop, Foot Locker and others
  • Sales associate at GameStop across several shopping centers in the Bari area: Auchan Casamassima, Auchan Modugno, Mongolfiera Bari Santa Caterina and BariBlu Triggiano.
  • At Auchan Casamassima, took part in several store openings, helping set up the shop and drive sales from opening day.
  • Beyond video games and consoles, sold smartphones, mobile plans and SIM cards, advising customers on the best device and tariff.
  • Sales in a computer store: PCs, components and accessories, matching each customer with the right configuration for their needs and budget.
  • Retail sales at Foot Locker in a high-traffic store.
How I worked
  • Full sales cycle: needs analysis, objection handling, negotiation and closing, always against daily and monthly targets.
  • Turned skeptical customers into buyers, guiding them toward the offers with the highest margin for the company.
  • Built repeat business through after-sales care and long-term customer relationships.
  • Learned to explain technical products, from broadband contracts to PC hardware, in plain words to non-technical people.

What I took from it: listening to people, persuading with clear arguments, explaining complex offers simply and staying effective under pressure. Skills I now bring to data work.

Skills

Machine Learning & AI
PyTorchTensorFlowKerasscikit-learnXGBoostHugging FaceSHAPimbalanced-learnspaCyNLTKGensim
Business Intelligence & Data Warehousing
Data WarehousingETLSQL ServerSSISSSASOLAP CubesMDXPower BIDecision Support Systems
Languages
PythonRSQLJavaCC++OCaml
Data & Visualization
PandasPolarsNumPySciPyCVXPYMatplotlibSeabornFoliumJupyter
Big Data & Databases
Apache SparkPySparkSpark MLlibMySQLSQL Server
Systems & Tools
LinuxMultithreadingSocketsGitDocker
Mathematics
CalculusLinear AlgebraDiscrete MathematicsProbabilityStatisticsNumerical MethodsOptimizationConvex OptimizationOperations ResearchGraph Theory
Communication & Sales
CommunicationNegotiationObjection HandlingPersuasionClosing DealsProblem Solving

Languages & certifications

ItalianNative
EnglishFull professional · near-native writing
English B2Certificate · CLI, University of Pisa
BSc in Computer ScienceDegree certificate · University of Pisa, 2023
available on request

Beyond the code

Ten years of selling taught me to talk to anyone. I bring that to data work: I can turn a model into a story that a manager, a client or a non-technical team can act on.

Let's build something that works.

Available now, open to relocation and travel. The fastest way to reach me is my Proton Mail address:

giuseppe [dot] muschetta [at] pm [dot] me

My phone number and degree certificate are available on request.