Machine Learning con Claude Sonnet 3.5

Machine Learning con Claude AI
L'IA che aiuta a creare IA
Mauto 4 min

Completiamo la nostra serie su Claude esplorando come può aiutarci nello sviluppo di modelli di machine learning. Mentre Claude non può eseguire direttamente il training dei modelli, eccelle nell’analisi dei dati e nel suggerire approcci ottimali.

Analisi Esplorativa dei Dati

Dev: Ho un dataset di transazioni finanziarie. Come posso iniziare l'analisi?

Claude: Prima di tutto, carichiamo e analizziamo il dataset:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

def analyze_transactions(file_path):
    # Caricamento dati
    df = pd.read_csv(file_path)
    
    # Statistiche di base
    print("Dimensione dataset:", df.shape)
    print("\nStatistiche principali:")
    print(df.describe())
    
    # Valori mancanti
    print("\nValori mancanti:")
    print(df.isnull().sum())
    
    return df

df = analyze_transactions('transactions.csv')
Dev: Ho notato molti valori anomali nelle colonne amount e timestamp

Claude: Ecco una funzione per identificare e analizzare le anomalie:
def analyze_outliers(df):
    # Calcolo IQR per amount
    Q1 = df['amount'].quantile(0.25)
    Q3 = df['amount'].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    
    outliers = df[
        (df['amount'] < lower) | 
        (df['amount'] > upper)
    ]
    
    # Analisi timestamp
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    time_diffs = df['timestamp'].diff()
    suspicious_times = df[
        time_diffs > pd.Timedelta(hours=24)
    ]
    
    return outliers, suspicious_times

# Visualizzazione risultati
def plot_anomalies(df, outliers):
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    sns.boxplot(y=df['amount'])
    plt.title('Distribuzione Importi')
    
    plt.subplot(1, 2, 2)
    sns.scatterplot(
        data=df, 
        x='timestamp', 
        y='amount',
        alpha=0.5
    )
    sns.scatterplot(
        data=outliers,
        x='timestamp',
        y='amount',
        color='red',
        alpha=0.7
    )
    plt.title('Anomalie Identificate')
    
    plt.tight_layout()
    plt.show()

Feature Engineering

Dev: Come posso preparare questi dati per un modello di fraud detection?

Claude: Ecco una pipeline di feature engineering per fraud detection:
def engineer_features(df):
    # Features temporali
    df['hour'] = df['timestamp'].dt.hour
    df['day_of_week'] = df['timestamp'].dt.dayofweek
    df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
    
    # Aggregazioni per utente
    user_stats = df.groupby('user_id').agg({
        'amount': ['mean', 'std', 'min', 'max', 'count'],
        'merchant_id': 'nunique'
    }).reset_index()
    
    user_stats.columns = [
        'user_id', 
        'avg_amount',
        'std_amount', 
        'min_amount',
        'max_amount',
        'transaction_count',
        'unique_merchants'
    ]
    
    # Velocity features
    df['time_since_last'] = df.groupby('user_id')['timestamp'].diff()
    df['amount_ratio'] = df['amount'] / df.groupby('user_id')['amount'].shift()
    
    # One-hot encoding per categorie
    cat_features = pd.get_dummies(
        df[['merchant_category', 'transaction_type']],
        prefix=['cat', 'type']
    )
    
    return pd.concat([df, cat_features], axis=1)
Dev: Come gestisco lo sbilanciamento delle classi nel dataset?

Claude: Ecco alcune tecniche per gestire dataset sbilanciati:
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline

def balance_dataset(X, y):
    # Combina over e under sampling
    steps = [
        ('over', SMOTE(sampling_strategy=0.1)),
        ('under', RandomUnderSampler(sampling_strategy=0.5))
    ]
    
    pipeline = Pipeline(steps=steps)
    
    # Fit resample
    X_resampled, y_resampled = pipeline.fit_resample(X, y)
    
    print("Distribuzione originale:", np.bincount(y))
    print("Distribuzione bilanciata:", np.bincount(y_resampled))
    
    return X_resampled, y_resampled

Model Selection e Training

Dev: Quale modello mi suggerisci per fraud detection?

Claude: Per fraud detection, un approccio ensemble spesso funziona bene:
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score

def train_fraud_model(X, y):
    # Split train/test
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, stratify=y
    )
    
    # Train model
    model = RandomForestClassifier(
        n_estimators=100,
        max_depth=10,
        class_weight='balanced'
    )
    
    # Cross validation
    scores = cross_val_score(
        model, X_train, y_train, 
        cv=5, scoring='f1'
    )
    print(f"Cross-val scores: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})")
    
    # Final training
    model.fit(X_train, y_train)
    
    # Evaluation
    y_pred = model.predict(X_test)
    print("\nTest Set Performance:")
    print(classification_report(y_test, y_pred))
    
    return model
Dev: Come interpreto i risultati del modello?

Claude: Ecco alcune tecniche per l'interpretabilità del modello:
from sklearn.inspection import permutation_importance
import shap

def interpret_model(model, X, y):
    # Feature importance
    importances = pd.DataFrame(
        model.feature_importances_,
        index=X.columns,
        columns=['importance']
    ).sort_values('importance', ascending=False)
    
    # Permutation importance
    perm_importance = permutation_importance(
        model, X, y, 
        n_repeats=10
    )
    
    # SHAP values
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(X)
    
    # Plot results
    plt.figure(figsize=(15, 5))
    
    plt.subplot(1, 3, 1)
    importances.head(10).plot(kind='bar')
    plt.title('Feature Importance')
    
    plt.subplot(1, 3, 2)
    shap.summary_plot(shap_values, X, plot_type='bar')
    plt.title('SHAP Values')
    
    plt.tight_layout()
    plt.show()

Deployment e Monitoring

Dev: Come posso deployare il modello in produzione?

Claude: Ecco una struttura per il deployment con FastAPI e monitoring:
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
import prometheus_client as prom

# Metriche
PREDICTION_LATENCY = prom.Histogram(
    'model_prediction_latency_seconds',
    'Time spent processing prediction'
)

PREDICTION_COUNT = prom.Counter(
    'model_predictions_total',
    'Number of predictions served'
)

class Transaction(BaseModel):
    amount: float
    merchant_id: str
    user_id: str
    timestamp: str
    
class FraudDetectionService:
    def __init__(self):
        self.model = joblib.load('fraud_model.pkl')
        self.feature_engineer = joblib.load('feature_engineer.pkl')
        
    @PREDICTION_LATENCY.time()
    def predict(self, transaction: Transaction):
        # Preprocess
        features = self.feature_engineer.transform(
            transaction.dict()
        )
        
        # Predict
        prediction = self.model.predict_proba(features)[0]
        PREDICTION_COUNT.inc()
        
        return {
            'fraud_probability': float(prediction[1]),
            'threshold': 0.8,
            'is_fraud': prediction[1] > 0.8
        }

app = FastAPI()
service = FraudDetectionService()

@app.post('/predict')
async def predict(transaction: Transaction):
    return service.predict(transaction)

@app.get('/metrics')
async def metrics():
    return prom.generate_latest()

Conclusione

L’utilizzo di Claude per il machine learning richiede una comprensione chiara dei propri obiettivi e dati. Claude può guidare nelle scelte architetturali e implementative, ma la validazione dei risultati rimane cruciale.

Questa serie di articoli ha esplorato le diverse sfaccettature di Claude 3.5, dal pair programming al machine learning. La chiave sta nel comprendere quando e come sfruttare al meglio le capacità dell’IA per migliorare il proprio processo di sviluppo.

content_copy Copiato