-->

Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Random Forest in medicina


Intelligenza Artificiale per prevedere le malattie

Come Utilizzare il Machine Learning in Medicina con Random Forest per Prevedere il Diabete

L' Intelligenza Artificiale sta rapidamente rivoluzionando il mondo della medicina, con applicazioni che spaziano dalla diagnosi di malattie alla previsione di condizioni di salute, come il diabete.
In questo articolo, l'uso dell'algoritmo Random Forest, un potente modello di machine learning, per prevedere il rischio di diabete nei pazienti.
Analizzeremo anche come applicare la K-Fold Cross-Validation per valutare l'accuratezza del modello e ridurre la possibilità di overfitting.

Cos'è il Machine Learning e come viene usato in Medicina?


Il machine learning è una branca dell'intelligenza artificiale (AI) che consente ai computer di apprendere dai dati senza essere esplicitamente programmati.
In medicina, il machine learning viene utilizzato per analizzare grandi quantità di dati sanitari, come cartelle cliniche elettroniche, immagini mediche e informazioni sui pazienti, per fare previsioni accurate su diagnosi, trattamenti e rischi di malattie.


Il Modello Random Forest

Il Random Forest è un algoritmo di machine learning basato su una foresta di alberi decisionali.
Ogni albero nella foresta è addestrato su un sottoinsieme casuale dei dati, e la previsione finale viene ottenuta mediante il voto della maggioranza degli alberi. Questo approccio consente al modello di essere molto potente ed efficiente, soprattutto quando si lavora con grandi set di dati complessi come quelli medici.


Come Prevedere il Diabete con il Machine Learning


Per prevedere se un paziente ha il diabete, utilizziamo il Random Forest su un dataset noto come "Pima Indians Diabetes".
Il dataset contiene informazioni su vari fattori di rischio, come glucosio, pressione sanguigna, BMI e età.

L'obiettivo è prevedere se un paziente avrà il diabete basandosi su questi parametri.

K-Fold Cross-Validation per Valutare il Modello

Una delle sfide principali quando si utilizza il machine learning è evitare l'overfitting, cioè quando un modello si adatta troppo bene ai dati di addestramento e perde la capacità di generalizzare su nuovi dati. Per questo motivo, è fondamentale valutare accuratamente il modello. In questo esempio, utilizziamo la K-Fold Cross-Validation, che suddivide i dati in 10 "fold" e addestra il modello su ciascuno di questi, testandolo sugli altri.
Questo approccio assicura che il modello venga valutato su più scenari, migliorando la sua capacità di generalizzazione.

Codice per Prevedere il Diabete

Con Random Forest
Ora che comprendiamo come funziona il modello, vediamo il codice completo che utilizza il machine learning per prevedere il diabete, implementando la K-Fold Cross-Validation e riducendo la complessità del modello.

# Importare le librerie necessarie
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

# Caricare il dataset Pima Indians Diabetes
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
column_names = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']

# Caricare il dataset in un DataFrame
df = pd.read_csv(url, names=column_names)

# Verifica dei dati mancanti
missing_values = df.isnull().sum()
print("\nValori mancanti per colonna:")
print(missing_values)

# Se ci sono valori mancanti, sostituirli con la media della colonna
df.fillna(df.mean(), inplace=True)

# Separare le caratteristiche (variabili indipendenti) e il target (variabile dipendente)
X = df.drop('Outcome', axis=1)  # Caratteristiche (tutte le colonne tranne 'Outcome')
y = df['Outcome']  # Target (Outcome: 1 significa diabete, 0 significa no diabete)

# Creare il modello Random Forest
model = RandomForestClassifier(n_estimators=50, max_depth=10, min_samples_split=4, min_samples_leaf=2, random_state=42)

# Applicare K-Fold Cross-Validation (ad esempio, 10-fold)
cv_scores = cross_val_score(model, X, y, cv=10, scoring='accuracy')  # Usa "accuracy" come metrica

# Visualizzare la media dell'accuratezza attraverso i fold
print(f"\nAccuratezza media con K-Fold Cross-Validation (10 fold): {cv_scores.mean() * 100:.2f}%")

# Visualizzare i punteggi di accuratezza per ogni fold
print(f"\nPunteggi di accuratezza per ogni fold:")
print(cv_scores)

# Eseguire l'addestramento del modello con tutto il dataset per calcolare la matrice di confusione
model.fit(X, y)
y_pred = model.predict(X)

# Valutare il modello con la matrice di confusione e il report di classificazione
accuracy = accuracy_score(y, y_pred)
conf_matrix = confusion_matrix(y, y_pred)
class_report = classification_report(y, y_pred)

# Visualizzare i risultati
print(f"\nAccuratezza complessiva del modello: {accuracy * 100:.2f}%")
print("\nMatrice di Confusione:")
print(conf_matrix)
print("\nReport di Classificazione:")
print(class_report)

# Visualizzare la matrice di confusione con una heatmap
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.title('Matrice di Confusione')
plt.xlabel('Predetto')
plt.ylabel('Reale')
plt.show()

# Fase di input da parte dell'utente per i nuovi dati
print("\nInserisci i dati per una nuova previsione:")
pregnancies = int(input("Numero di gravidanze: "))
glucose = float(input("Livello di glucosio: "))
blood_pressure = float(input("Pressione sanguigna: "))
skin_thickness = float(input("Spessore della pelle: "))
insulin = float(input("Livello di insulina: "))
bmi = float(input("Indice di massa corporea (BMI): "))
diabetes_pedigree_function = float(input("Funzione di pedigree del diabete: "))
age = int(input("Età: "))

# Creare un DataFrame con i dati inseriti dall'utente
new_data = pd.DataFrame({
    'Pregnancies': [pregnancies],
    'Glucose': [glucose],
    'BloodPressure': [blood_pressure],
    'SkinThickness': [skin_thickness],
    'Insulin': [insulin],
    'BMI': [bmi],
    'DiabetesPedigreeFunction': [diabetes_pedigree_function],
    'Age': [age]
})

# Normalizzazione (standardizzazione) dei dati, se necessario
scaler = StandardScaler()
new_data_scaled = scaler.fit_transform(new_data)

# Fare la previsione per i nuovi dati
predicted_outcome = model.predict(new_data_scaled)

# Mostrare il risultato della previsione
print(f"\nRisultato previsto per i nuovi dati: {'Diabetico' if predicted_outcome[0] == 1 else 'Non Diabetico'}")


Come Funziona il Codice


1. Caricamento del Dataset: Utilizziamo il dataset "Pima Indians Diabetes", che contiene informazioni sui pazienti e il rischio di diabete.
2. Preprocessing: Vengono gestiti i valori mancanti nel dataset, sostituendo i valori nulli con la media della colonna.
3. Creazione del Modello Random Forest: Il modello è configurato con parametri che riducono la complessità, come il numero di alberi (`n_estimators=50`) e la profondità massima (`max_depth=10`).
4. K-Fold Cross-Validation: Applichiamo la **K-Fold Cross-Validation** per valutare la performance del modello su più fold e ridurre il rischio di overfitting.
5. Risultati e Valutazione: Calcoliamo l'accuratezza complessiva del modello, visualizziamo la matrice di confusione e il report di classificazione.

Perché il Machine Learning è Cruciale in Medicina

La collaborazione tra medicina e intelligenza artificiale sta rivoluzionando il settore sanitario.
L'uso di algoritmi di machine learning come Random Forest aiuta a prevedere malattie come il diabete, migliorando la diagnosi e il trattamento.
In futuro, l'IA potrà supportare i medici nella personalizzazione dei trattamenti e nell'analisi di grandi quantità di dati, ottimizzando le risorse e riducendo gli errori umani.