dicembre 21, 2025
15 min di lettura

Domande per Colloqui di Lavoro come Senior Data Scientist: Guida Completa

interview
career-advice
job-search
Domande per Colloqui di Lavoro come Senior Data Scientist: Guida Completa
Milad Bonakdar

Milad Bonakdar

Autore

Padroneggia concetti avanzati di data science con domande essenziali per il colloquio, che coprono algoritmi ML avanzati, deep learning, deployment di modelli, feature engineering, A/B testing e big data per senior data scientist.


Introduzione

Ci si aspetta che i Senior Data Scientist progettino architetture di soluzioni di machine learning end-to-end, ottimizzino le prestazioni dei modelli, implementino i modelli in produzione e comunichino le informazioni agli stakeholder. Questo ruolo richiede una profonda esperienza in algoritmi avanzati, feature engineering, implementazione di modelli e la capacità di risolvere complessi problemi aziendali con i dati.

Questa guida completa copre le domande essenziali per i colloqui per Senior Data Scientist, spaziando dal machine learning avanzato, deep learning, feature engineering, implementazione di modelli, A/B testing e tecnologie di big data. Ogni domanda include risposte dettagliate, valutazione della rarità e valutazioni della difficoltà.


Machine Learning Avanzato (6 Domande)

1. Spiega il tradeoff bias-varianza.

Risposta: Il tradeoff bias-varianza descrive la relazione tra la complessità del modello e l'errore di previsione.

  • Bias: Errore derivante da assunzioni eccessivamente semplificate (underfitting)
  • Varianza: Errore derivante dalla sensibilità alle fluttuazioni dei dati di training (overfitting)
  • Tradeoff: La diminuzione del bias aumenta la varianza e viceversa
  • Obiettivo: Trovare il bilanciamento ottimale che minimizzi l'errore totale
Loading diagram...
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

# Genera dati
X = np.random.rand(100, 1) * 10
y = 2 * X + 3 + np.random.randn(100, 1) * 2

# Modello ad alto bias (max_depth=1)
high_bias = DecisionTreeRegressor(max_depth=1)

# Modello ad alta varianza (max_depth=20)
high_variance = DecisionTreeRegressor(max_depth=20)

# Modello ottimale (max_depth=3)
optimal = DecisionTreeRegressor(max_depth=3)

# Le curve di apprendimento mostrano il tradeoff bias-varianza
train_sizes, train_scores, val_scores = learning_curve(
    optimal, X, y.ravel(), cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)

print(f"Punteggio di training: {train_scores.mean():.2f}")
print(f"Punteggio di validazione: {val_scores.mean():.2f}")

Rarità: Molto Comune Difficoltà: Difficile


2. Cos'è la regolarizzazione e spiega la regolarizzazione L1 vs L2.

Risposta: La regolarizzazione aggiunge un termine di penalità alla funzione di perdita per prevenire l'overfitting.

  • L1 (Lasso):
    • Penalità: Somma dei valori assoluti dei coefficienti
    • Effetto: Modelli sparsi (alcuni coefficienti diventano esattamente 0)
    • Uso: Selezione delle feature
  • L2 (Ridge):
    • Penalità: Somma dei coefficienti al quadrato
    • Effetto: Riduce i coefficienti verso 0 (ma non esattamente 0)
    • Uso: Quando tutte le feature sono potenzialmente rilevanti
  • Elastic Net: Combina L1 e L2
from sklearn.linear_model import Lasso, Ridge, ElasticNet
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import numpy as np

# Genera dati con molte feature
X, y = make_regression(n_samples=100, n_features=20, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# Regolarizzazione L1 (Lasso)
lasso = Lasso(alpha=1.0)
lasso.fit(X_train, y_train)
print(f"Coefficienti Lasso: {np.sum(lasso.coef_ != 0)} diversi da zero su {len(lasso.coef_)}")

# Regolarizzazione L2 (Ridge)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
print(f"Coefficienti Ridge: {np.sum(ridge.coef_ != 0)} diversi da zero su {len(ridge.coef_)}")

# Elastic Net (L1 + L2)
elastic = ElasticNet(alpha=1.0, l1_ratio=0.5)
elastic.fit(X_train, y_train)

print(f"\nPunteggio Lasso: {lasso.score(X_test, y_test):.3f}")
print(f"Punteggio Ridge: {ridge.score(X_test, y_test):.3f}")
print(f"Punteggio Elastic Net: {elastic.score(X_test, y_test):.3f}")

Rarità: Molto Comune Difficoltà: Media


3. Spiega i metodi di ensemble: Bagging vs Boosting.

Risposta: I metodi di ensemble combinano più modelli per migliorare le prestazioni.

  • Bagging (Bootstrap Aggregating):
    • Addestra i modelli in parallelo su sottoinsiemi casuali
    • Riduce la varianza
    • Esempio: Random Forest
  • Boosting:
    • Addestra i modelli in sequenza, ciascuno correggendo gli errori precedenti
    • Riduce il bias
    • Esempi: AdaBoost, Gradient Boosting, XGBoost
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, cross_val_score

# Carica i dati
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Bagging - Random Forest
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
rf_score = rf.score(X_test, y_test)

# Boosting - Gradient Boosting
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb.fit(X_train, y_train)
gb_score = gb.score(X_test, y_test)

print(f"Accuratezza Random Forest (Bagging): {rf_score:.3f}")
print(f"Accuratezza Gradient Boosting: {gb_score:.3f}")

# Cross-validation
rf_cv = cross_val_score(rf, data.data, data.target, cv=5)
gb_cv = cross_val_score(gb, data.data, data.target, cv=5)

print(f"\nPunteggi CV RF: {rf_cv.mean():.3f} (+/- {rf_cv.std():.3f})")
print(f"Punteggi CV GB: {gb_cv.mean():.3f} (+/- {gb_cv.std():.3f})")

Rarità: Molto Comune Difficoltà: Difficile


4. Cos'è la cross-validation e perché k-fold è meglio di train-test split?

Risposta: La cross-validation valuta le prestazioni del modello in modo più robusto rispetto a un singolo train-test split.

  • K-Fold CV:
    • Divide i dati in k fold
    • Addestra k volte, ogni volta usando un fold diverso come validazione
    • Calcola la media dei risultati
  • Vantaggi:
    • Stima delle prestazioni più affidabile
    • Utilizza tutti i dati sia per il training che per la validazione
    • Riduce la varianza nella stima delle prestazioni
  • Variazioni: Stratified K-Fold, Leave-One-Out, Time Series Split
from sklearn.model_selection import cross_val_score, KFold, StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

data = load_iris()
X, y = data.data, data.target

model = LogisticRegression(max_iter=200)

# K-Fold standard
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold)
print(f"Punteggi CV K-Fold: {scores}")
print(f"Media: {scores.mean():.3f} (+/- {scores.std():.3f})")

# Stratified K-Fold (preserva la distribuzione delle classi)
stratified_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
stratified_scores = cross_val_score(model, X, y, cv=stratified_kfold)
print(f"\nPunteggi CV Stratified K-Fold: {stratified_scores}")
print(f"Media: {stratified_scores.mean():.3f} (+/- {stratified_scores.std():.3f})")

# Cross-validation personalizzata
from sklearn.model_selection import cross_validate

cv_results = cross_validate(
    model, X, y, cv=5,
    scoring=['accuracy', 'precision_macro', 'recall_macro'],
    return_train_score=True
)

print(f"\nAccuratezza test: {cv_results['test_accuracy'].mean():.3f}")
print(f"Precision test: {cv_results['test_precision_macro'].mean():.3f}")
print(f"Recall test: {cv_results['test_recall_macro'].mean():.3f}")

Rarità: Molto Comune Difficoltà: Media


5. Spiega le tecniche di riduzione della dimensionalità (PCA, t-SNE).

Risposta: La riduzione della dimensionalità riduce il numero di feature preservando le informazioni.

  • PCA (Principal Component Analysis):
    • Trasformazione lineare
    • Trova le direzioni di massima varianza
    • Preserva la struttura globale
    • Veloce, interpretabile
  • t-SNE (t-Distributed Stochastic Neighbor Embedding):
    • Trasformazione non lineare
    • Preserva la struttura locale
    • Buono per la visualizzazione
    • Più lento, non per l'estrazione delle feature
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# Carica dati ad alta dimensionalità
digits = load_digits()
X, y = digits.data, digits.target

print(f"Forma originale: {X.shape}")

# PCA - riduce a 2 dimensioni
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print(f"Forma PCA: {X_pca.shape}")
print(f"Rapporto di varianza spiegata: {pca.explained_variance_ratio_}")
print(f"Varianza totale spiegata: {pca.explained_variance_ratio_.sum():.3f}")

# t-SNE - riduce a 2 dimensioni
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
print(f"Forma t-SNE: {X_tsne.shape}")

# PCA per l'estrazione delle feature (mantiene il 95% della varianza)
pca_95 = PCA(n_components=0.95)
X_reduced = pca_95.fit_transform(X)
print(f"\nComponenti per il 95% della varianza: {pca_95.n_components_}")
print(f"Forma ridotta: {X_reduced.shape}")

Rarità: Comune Difficoltà: Difficile


6. Cosa sono la curva ROC e l'AUC? Quando le useresti?

Risposta: La curva ROC (Receiver Operating Characteristic) traccia il True Positive Rate rispetto al False Positive Rate a varie soglie.

  • AUC (Area Under Curve): Singola metrica che riassume la ROC
    • AUC = 1.0: Classificatore perfetto
    • AUC = 0.5: Classificatore casuale
    • AUC < 0.5: Peggiore del casuale
  • Casi d'uso:
    • Confrontare modelli
    • Dataset sbilanciati
    • Quando è necessario scegliere una soglia
from sklearn.metrics import roc_curve, roc_auc_score, auc
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

# Carica i dati
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Addestra il modello
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)

# Ottieni le previsioni di probabilità
y_pred_proba = model.predict_proba(X_test)[:, 1]

# Calcola la curva ROC
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)

print(f"AUC: {roc_auc:.3f}")

# Alternativa: calcolo diretto dell'AUC
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"AUC (diretto): {auc_score:.3f}")

# Trova la soglia ottimale (statistica J di Youden)
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
print(f"Soglia ottimale: {optimal_threshold:.3f}")

Rarità: Molto Comune Difficoltà: Media


Feature Engineering (4 Domande)

7. Quali tecniche usi per il feature engineering?

Risposta: Il feature engineering crea nuove feature dai dati esistenti per migliorare le prestazioni del modello.

  • Tecniche:
    • Encoding: One-hot, label, target encoding
    • Scaling: StandardScaler, MinMaxScaler
    • Binning: Discretizza le variabili continue
    • Feature polinomiali: Termini di interazione
    • Specifiche del dominio: Feature di data, feature di testo
    • Aggregazioni: Statistiche di gruppo
from sklearn.preprocessing import StandardScaler, OneHotEncoder, PolynomialFeatures
import pandas as pd
import numpy as np

# Dati di esempio
df = pd.DataFrame({
    'age': [25, 30, 35, 40, 45],
    'salary': [50000, 60000, 75000, 80000, 90000],
    'department': ['IT', 'HR', 'IT', 'Finance', 'HR'],
    'date': pd.date_range('2023-01-01', periods=5)
})

# One-hot encoding
df_encoded = pd.get_dummies(df, columns=['department'], prefix='dept')

# Scaling
scaler = StandardScaler()
df_encoded[['age_scaled', 'salary_scaled']] = scaler.fit_transform(
    df_encoded[['age', 'salary']]
)

# Binning
df_encoded['age_group'] = pd.cut(df['age'], bins=[0, 30, 40, 100], labels=['young', 'mid', 'senior'])

# Feature di data
df_encoded['year'] = df['date'].dt.year
df_encoded['month'] = df['date'].dt.month
df_encoded['day_of_week'] = df['date'].dt.dayofweek

# Feature polinomiali
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(df[['age', 'salary']])

# Feature di interazione
df_encoded['age_salary_interaction'] = df['age'] * df['salary']

print(df_encoded.head())

Rarità: Molto Comune Difficoltà: Media


8. Come gestisci i dataset sbilanciati?

Risposta: I dataset sbilanciati hanno distribuzioni di classe disuguali, che possono distorcere i modelli.

  • Tecniche:
    • Ricampionamento:
      • Sovracampionamento della classe di minoranza (SMOTE)
      • Sottocampionamento della classe di maggioranza
    • Pesi di classe: Penalizza la classificazione errata della classe di minoranza
    • Metodi di ensemble: Balanced Random Forest
    • Valutazione: Usa precision, recall, F1, non solo accuratezza
    • Rilevamento di anomalie: Tratta la minoranza come anomalia
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler

# Crea un dataset sbilanciato
X, y = make_classification(
    n_samples=1000, n_features=20, n_informative=15,
    n_classes=2, weights=[0.9, 0.1], random_state=42
)

print(f"Distribuzione delle classi: {np.bincount(y)}")

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 1. Senza gestire lo sbilanciamento
model_baseline = LogisticRegression()
model_baseline.fit(X_train, y_train)
y_pred_baseline = model_baseline.predict(X_test)
print("\nBaseline (nessuna gestione):")
print(classification_report(y_test, y_pred_baseline))

# 2. SMOTE (Synthetic Minority Over-sampling)
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
print(f"\nDopo SMOTE: {np.bincount(y_train_smote)}")

model_smote = LogisticRegression()
model_smote.fit(X_train_smote, y_train_smote)
y_pred_smote = model_smote.predict(X_test)
print("\nCon SMOTE:")
print(classification_report(y_test, y_pred_smote))

# 3. Pesi di classe
model_weighted = LogisticRegression(class_weight='balanced')
model_weighted.fit(X_train, y_train)
y_pred_weighted = model_weighted.predict(X_test)
print("\nCon pesi di classe:")
print(classification_report(y_test, y_pred_weighted))

Rarità: Molto Comune Difficoltà: Media


9. Spiega le tecniche di selezione delle feature.

Risposta: La selezione delle feature identifica le feature più rilevanti per la modellazione.

  • Metodi:
    • Metodi di filtro: Test statistici (correlazione, chi-quadrato)
    • Metodi wrapper: Recursive Feature Elimination (RFE)
    • Metodi embedded: Lasso, importanza delle feature basata su alberi
    • Riduzione della dimensionalità: PCA (diverso dalla selezione)
from sklearn.feature_selection import SelectKBest, chi2, RFE, SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import MinMaxScaler

# Carica i dati
data = load_breast_cancer()
X, y = data.data, data.target

# 1. Metodo di filtro - SelectKBest con chi-quadrato
X_scaled = MinMaxScaler().fit_transform(X)
selector_chi2 = SelectKBest(chi2, k=10)
X_chi2 = selector_chi2.fit_transform(X_scaled, y)
print(f"Feature originali: {X.shape[1]}")
print(f"Feature selezionate (chi2): {X_chi2.shape[1]}")

# 2. Metodo wrapper - Recursive Feature Elimination
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rfe = RFE(estimator=rf, n_features_to_select=10)
X_rfe = rfe.fit_transform(X, y)
print(f"Feature selezionate (RFE): {X_rfe.shape[1]}")
print(f"Ranking delle feature: {rfe.ranking_}")

# 3. Metodo embedded - Importanza delle feature basata su alberi
rf.fit(X, y)
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

print("\nTop 10 feature per importanza:")
for i in range(10):
    print(f"{i+1}. {data.feature_names[indices[i]]}: {importances[indices[i]]:.4f}")

# SelectFromModel
selector_model = SelectFromModel(rf, threshold='median', prefit=True)
X_selected = selector_model.transform(X)
print(f"\nFeature selezionate (importanza): {X_selected.shape[1]}")

Rarità: Comune Difficoltà: Media


10. Come gestisci le variabili categoriche con alta cardinalità?

Risposta: Le variabili categoriche ad alta cardinalità hanno molti valori univoci.

  • Tecniche:
    • Target Encoding: Sostituisci con la media del target
    • Frequency Encoding: Sostituisci con la frequenza
    • Embedding: Apprendi rappresentazioni dense (reti neurali)
    • Raggruppamento: Combina le categorie rare in "Altro"
    • Hashing: Hash a un numero fisso di bucket
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Dati di esempio con alta cardinalità
df = pd.DataFrame({
    'city': np.random.choice([f'City_{i}' for i in range(100)], 1000),
    'target': np.random.randint(0, 2, 1000)
})

print(f"Città univoche: {df['city'].nunique()}")

# 1. Target Encoding
target_means = df.groupby('city')['target'].mean()
df['city_target_encoded'] = df['city'].map(target_means)

# 2. Frequency Encoding
freq = df['city'].value_counts()
df['city_frequency'] = df['city'].map(freq)

# 3. Raggruppamento delle categorie rare
freq_threshold = 10
rare_cities = freq[freq < freq_threshold].index
df['city_grouped'] = df['city'].apply(lambda x: 'Other' if x in rare_cities else x)

print(f"\nDopo il raggruppamento: {df['city_grouped'].nunique()} valori univoci")

# 4. Hash encoding (usando la libreria category_encoders)
# from category_encoders import HashingEncoder
# encoder = HashingEncoder(cols=['city'], n_components=10)
# df_hashed = encoder.fit_transform(df)

print(df[['city', 'city_target_encoded', 'city_frequency', 'city_grouped']].head())

Rarità: Comune Difficoltà: Difficile


Implementazione e Produzione del Modello (4 Domande)

11. Come implementi un modello di machine learning in produzione?

Risposta: L'implementazione del modello rende i modelli disponibili per l'uso nel mondo reale.

  • Passaggi:
    1. Serializzazione del modello: Salva il modello (pickle, joblib, ONNX)
    2. Sviluppo API: Crea API REST (Flask, FastAPI)
    3. Containerizzazione: Docker per la coerenza
    4. Implementazione: Piattaforme cloud (AWS, GCP, Azure)
    5. Monitoraggio: Traccia le prestazioni, la deriva
    6. CI/CD: Test e implementazione automatizzati
# 1. Addestra e salva il modello
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import joblib

# Addestra il modello
data = load_iris()
model = RandomForestClassifier()
model.fit(data.data, data.target)

# Salva il modello
joblib.dump(model, 'model.joblib')

# 2. Crea API con FastAPI
from fastapi import FastAPI
import numpy as np

app = FastAPI()

# Carica il modello
model = joblib.load('model.joblib')

@app.post("/predict")
def predict(features: list):
    # Converti in array numpy
    X = np.array(features).reshape(1, -1)
    prediction = model.predict(X)
    probability = model.predict_proba(X)
    
    return {
        "prediction": int(prediction[0]),
        "probability": probability[0].tolist()
    }

# 3. Dockerfile
"""
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
"""

# 4. Uso
# curl -X POST "http://localhost:8000/predict" \
#      -H "Content-Type: application/json" \
#      -d '{"features": [5.1, 3.5, 1.4, 0.2]}'

Rarità: Molto Comune Difficoltà: Difficile


12. Cos'è il monitoraggio del modello e perché è importante?

Risposta: Il monitoraggio del modello tiene traccia delle prestazioni del modello in produzione.

  • Cosa monitorare:
    • Metriche di prestazione: Accuratezza, precisione, recall
    • Drift dei dati: Cambiamenti nella distribuzione degli input
    • Drift del concetto: Cambiamenti nella relazione target
    • Metriche di sistema: Latenza, throughput, errori
  • Azioni:
    • Avvisi quando le prestazioni si degradano
    • Riapprendi con nuovi dati
    • A/B testing di nuovi modelli
import numpy as np
from scipy import stats

# Simula dati di produzione
training_data = np.random.normal(0, 1, 1000)
production_data = np.random.normal(0.5, 1.2, 1000)  # Deriva

# Rileva la deriva dei dati usando il test di Kolmogorov-Smirnov
statistic, p_value = stats.ks_2samp(training_data, production_data)

print(f"Statistica KS: {statistic:.4f}")
print(f"Valore P: {p_value:.4f}")

if p_value < 0.05:
    print("Rilevata deriva dei dati! Considera di riaddestrare il modello.")
else:
    print("Nessuna deriva significativa rilevata.")

# Monitora le prestazioni del modello
class ModelMonitor:
    def __init__(self, model):
        self.model = model
        self.predictions = []
        self.actuals = []
        
    def log_prediction(self, X, y_pred, y_true=None):
        self.predictions.append(y_pred)
        if y_true is not None:
            self.actuals.append(y_true)
    
    def get_accuracy(self):
        if len(self.actuals) == 0:
            return None
        return np.mean(np.array(self.predictions) == np.array(self.actuals))
    
    def check_drift(self, new_data, reference_data):
        statistic, p_value = stats.ks_2samp(new_data, reference_data)
        return p_value < 0.05

# Uso
monitor = ModelMonitor(model)
# monitor.log_prediction(X, y_pred, y_true)
# accuracy = monitor.get_accuracy()

Rarità: Comune Difficoltà: Media


13. Spiega l'A/B testing nel contesto del machine learning.

Risposta: L'A/B testing confronta due versioni (controllo vs trattamento) per determinare quale funziona meglio.

  • Processo:
    1. Dividi il traffico in modo casuale
    2. Servi modelli diversi a ciascun gruppo
    3. Raccogli le metriche
    4. Test statistico per determinare il vincitore
  • Metriche: Tasso di conversione, entrate, coinvolgimento
  • Test statistici: t-test, chi-quadrato, metodi bayesiani
import numpy as np
from scipy import stats

# Simula i risultati del test A/B
# Gruppo di controllo (Modello A)
control_conversions = 520
control_visitors = 10000

# Gruppo di trattamento (Modello B)
treatment_conversions = 580
treatment_visitors = 10000

# Calcola i tassi di conversione
control_rate = control_conversions / control_visitors
treatment_rate = treatment_conversions / treatment_visitors

print(f"Tasso di conversione del controllo: {control_rate:.4f}")
print(f"Tasso di conversione del trattamento: {treatment_rate:.4f}")
print(f"Incremento: {((treatment_rate - control_rate) / control_rate * 100):.2f}%")

# Test di significatività statistica (z-test a due proporzioni)
pooled_rate = (control_conversions + treatment_conversions) / (control_visitors + treatment_visitors)
se = np.sqrt(pooled_rate * (1 - pooled_rate) * (1/control_visitors + 1/treatment_visitors))
z_score = (treatment_rate - control_rate) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z_score)))

print(f"\nPunteggio Z: {z_score:.4f}")
print(f"Valore P: {p_value:.4f}")

if p_value < 0.05:
    print("Il risultato è statisticamente significativo!")
    if treatment_rate > control_rate:
        print("Il trattamento (Modello B) è migliore.")
    else:
        print("Il controllo (Modello A) è migliore.")
else:
    print("Nessuna differenza statisticamente significativa.")

# Calcolo della dimensione del campione
from statsmodels.stats.power import zt_ind_solve_power

required_sample = zt_ind_solve_power(
    effect_size=0.02,  # Effetto minimo rilevabile
    alpha=0.05,
    power=0.8,
    alternative='two-sided'
)
print(f"\nDimensione del campione richiesta per gruppo: {int(required_sample)}")

Rarità: Comune Difficoltà: Difficile


14. Cos'è MLOps e perché è importante?

Risposta: MLOps (Machine Learning Operations) applica i principi DevOps ai sistemi ML.

  • Componenti:
    • Controllo della versione: Codice, dati, modelli
    • Test automatizzati: Test unitari, di integrazione, del modello
    • Pipeline CI/CD: Implementazione automatizzata
    • Monitoraggio: Prestazioni, rilevamento della deriva
    • Riproducibilità: Tracciamento degli esperimenti
  • Strumenti: MLflow, Kubeflow, DVC, Weights & Biases
# Esempio: MLflow per il tracciamento degli esperimenti
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Carica i dati
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Inizia l'esecuzione di MLflow
with mlflow.start_run():
    # Registra i parametri
    n_estimators = 100
    max_depth = 5
    mlflow.log_param("n_estimators", n_estimators)
    mlflow.log_param("max_depth", max_depth)
    
    # Addestra il modello
    model = RandomForestClassifier(
        n_estimators=n_estimators,
        max_depth=max_depth,
        random_state=42
    )
    model.fit(X_train, y_train)
    
    # Valuta
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    # Registra le metriche
    mlflow.log_metric("accuracy", accuracy)
    
    # Registra il modello
    mlflow.sklearn.log_model(model, "random_forest
Newsletter subscription

Consigli di carriera settimanali che funzionano davvero

Ricevi le ultime idee direttamente nella tua casella di posta

Il Tuo Prossimo Colloquio Dista Solo un Curriculum

Crea un curriculum professionale e ottimizzato in pochi minuti. Non servono competenze di design—solo risultati comprovati.

Crea il mio curriculum

Condividi questo post

Batti il Tasso di Rifiuto ATS del 75%

3 curriculum su 4 non raggiungono mai un occhio umano. La nostra ottimizzazione delle parole chiave aumenta il tuo tasso di successo fino all'80%, assicurando che i reclutatori vedano effettivamente il tuo potenziale.