Ontwikkel een Python Script voor Machine Learning Model Evaluatie en Interpretatie
description
Met deze prompt ontwikkel je een Python script dat je helpt om machine learning modellen grondig te evalueren en te begrijpen. Je leert belangrijke prestatie-indicatoren berekenen en visualiseren, waardoor je beter inzicht krijgt in de kwaliteit van je model en verbeteringen kunt aanbrengen. Dit is waardevol voor iedereen die met Python en machine learning werkt en verder wil gaan dan alleen het trainen van modellen.
prompt
Help me een Python script te schrijven dat een machine learning model evalueert en interpreteert op basis van de dataset: <voer de datasetbeschrijving of bestandsnaam in>. Inclusief het berekenen van ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een voorbeeld Python-script dat een machine learning model traint, evalueert en interpreteert op basis van jouw dataset "klantgegevens.csv". Het script bevat het inladen van data, preprocessing, modeltraining, evaluatie met prestatie-indicatoren, en eenvoudige visualisaties.
```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
import seaborn as sns
# 1. Data inladen
data = pd.read_csv('klantgegevens.csv')
# 2. Data preprocessing
# Veronderstel dat de laatste kolom de target is, pas aan indien anders
X = data.drop('koopgedrag', axis=1)
y = data['koopgedrag']
# Encodeer categorische features indien aanwezig
for col in X.select_dtypes(include=['object']).columns:
le = LabelEncoder()
X[col] = le.fit_transform(X[col])
# Encodeer de target indien nodig
if y.dtype == 'object':
y = LabelEncoder().fit_transform(y)
# 3. Data splitsen in training en testset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 4. Data normaliseren (optioneel, afhankelijk van model)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 5. Model trainen
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# 6. Voorspellingen maken
y_pred = model.predict(X_test)
# 7. Prestatie-indicatoren berekenen
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f'Nauwkeurigheid: {accuracy:.2f}')
print(f'Precisie: {precision:.2f}')
print(f'Recall: {recall:.2f}')
print(f'F1-score: {f1:.2f}')
# 8. Confusiematrix visualiseren
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6,4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Voorspelde label')
plt.ylabel('Echte label')
plt.title('Confusiematrix')
plt.show()
# 9. Classificatie rapport (optioneel)
print('Classificatie rapport:')
print(classification_report(y_test, y_pred))
```
**Hoe interpreteer en visualiseer je de resultaten:**
- **Nauwkeurigheid** (accuracy): Percentage correcte voorspellingen. Hoe hoger, hoe beter.
- **Precisie** (precision): Hoeveel van de positieve voorspellingen correct waren. Belangrijk bij kosten van false positives.
- **Recall**: Hoeveel van de werkelijke positives correct zijn geïdentificeerd. Belangrijk bij kosten van false negatives.
- **F1-score**: Harmonie tussen precisie en recall. Goede overall maat voor balans.
**Visualisatie:**
- De **confusiematrix** geeft weer hoeveel voorspellingen correct/incorrect waren per klasse. Het helpt om inzicht te krijgen in specifieke fouten.
Met deze informatie kun je beoordelen hoe goed je model presteert en waar mogelijk verbetering nodig is, bijvoorbeeld door meer gegevens, feature engineering of andere modellen te proberen.
provider: deepseek
model: deepseek-chat
Hier is een compleet Python script voor evaluatie en interpretatie van een machine learning model:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (accuracy_score, precision_score, recall_score,
f1_score, confusion_matrix, classification_report,
roc_curve, auc, precision_recall_curve)
from sklearn.inspection import permutation_importance
# Laad de dataset
try:
df = pd.read_csv('klantgegevens.csv')
print("Dataset geladen. Eerste 5 rijen:")
print(df.head())
print(f"\nDataset vorm: {df.shape}")
print(f"\nKolomnamen: {df.columns.tolist()}")
print(f"\nData types:\n{df.dtypes}")
print(f"\nOntbrekende waarden:\n{df.isnull().sum()}")
except FileNotFoundError:
print("Fout: klantgegevens.csv niet gevonden. Zorg dat het bestand in dezelfde map staat.")
exit()
# Data preprocessing
print("\n=== DATA PREPROCESSING ===")
# Identificeer doelvariabele (pas aan op basis van jouw dataset)
# Stel dat 'koopgedrag' de doelvariabele is
if 'koopgedrag' not in df.columns:
print("Waarschuwing: 'koopgedrag' kolom niet gevonden. Controleer de kolomnamen.")
# Toon beschikbare kolommen voor selectie
print(f"Beschikbare kolommen: {df.columns.tolist()}")
exit()
# Verwerk categorische variabelen
label_encoder = LabelEncoder()
categorical_cols = df.select_dtypes(include=['object']).columns
for col in categorical_cols:
if col != 'koopgedrag': # Doelvariabele niet encoderEN
df[col] = label_encoder.fit_transform(df[col].astype(str))
# Codeer doelvariabele
df['koopgedrag'] = label_encoder.fit_transform(df['koopgedrag'])
# Splits features en target
X = df.drop('koopgedrag', axis=1)
y = df['koopgedrag']
# Splits data in train en test sets
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Schaal numerieke features
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Train model (Random Forest als voorbeeld)
print("\n=== MODEL TRAINING ===")
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# Maak voorspellingen
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)
# Bereken prestatie-indicatoren
print("\n=== PRESTATIE-INDICATOREN ===")
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')
print(f"Nauwkeurigheid (Accuracy): {accuracy:.4f}")
print(f"Precisie (Precision): {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1-score: {f1:.4f}")
# Gedetailleerd classificatierapport
print("\n=== GEDETAILLEERD CLASSIFICATIERAPPORT ===")
print(classification_report(y_test, y_pred))
# Verwarringsmatrix
print("\n=== VERWARRINGSMATRIX ===")
cm = confusion_matrix(y_test, y_pred)
print(cm)
# Visualisaties
print("\n=== VISUALISATIES ===")
plt.style.use('seaborn-v0_8')
# 1. Verwarringsmatrix heatmap
plt.figure(figsize=(10, 8))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=label_encoder.classes_,
yticklabels=label_encoder.classes_)
plt.title('Verwarringsmatrix')
plt.ylabel('Werkelijke waarden')
plt.xlabel('Voorspelde waarden')
plt.tight_layout()
plt.savefig('verwarringsmatrix.png')
plt.show()
# 2. Feature importance
feature_importance = model.feature_importances_
feature_names = df.drop('koopgedrag', axis=1).columns
plt.figure(figsize=(12, 8))
indices = np.argsort(feature_importance)[::-1]
plt.bar(range(len(feature_importance)), feature_importance[indices])
plt.xticks(range(len(feature_importance)), feature_names[indices], rotation=45)
plt.title('Belangrijkheid van features')
plt.tight_layout()
plt.savefig('feature_importance.png')
plt.show()
# 3. ROC Curve (voor binaire classificatie)
if len(np.unique(y)) == 2:
fpr, tpr, _ = roc_curve(y_test, y_pred_proba[:, 1])
roc_auc = auc(fpr, tpr)
plt.figure(figsize=(10, 8))
plt.plot(fpr, tpr, color='darkorange', lw=2,
label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.savefig('roc_curve.png')
plt.show()
# 4. Precision-Recall Curve
precision_vals, recall_vals, _ = precision_recall_curve(y_test, y_pred_proba[:, 1])
plt.figure(figsize=(10, 8))
plt.plot(recall_vals, precision_vals, marker='.')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.savefig('precision_recall_curve.png')
plt.show()
# Interpretatie van resultaten
print("\n=== INTERPRETATIE VAN RESULTATEN ===")
print("""
1. NAUWKeurigheid (Accuracy):
- Percentage correcte voorspellingen
- Goed voor gebalanceerde datasets
2. PRECISIE (Precision):
- Van alle positieve voorspellingen, hoeveel waren correct?
- Belangrijk wanneer false positives kostbaar zijn
3. RECALL:
- Van alle werkelijke positieve gevallen, hoeveel hebben we correct voorspeld?
- Belangrijk wanneer false negatives kostbaar zijn
4. F1-SCORE:
- Harmonisch gemiddelde van precisie en recall
- Goede overall maatstaf voor onevenwichtige datasets
INTERPRETATIE TIPS:
- Accuracy > 80%: Goed model
- Precision > Recall: Model is conservatief (minder false positives)
- Recall > Precision: Model is agressief (minder false negatives)
- F1-score dicht bij 1: Uitstekende balans tussen precisie en recall
""")
# Permutatie importance voor betere interpretatie
print("\n=== PERMUTATIE IMPORTANCE ===")
result = permutation_importance(model, X_test, y_test, n_repeats=10, random_state=42)
perm_importance = result.importances_mean
plt.figure(figsize=(12, 8))
indices = np.argsort(perm_importance)[::-1]
plt.bar(range(len(perm_importance)), perm_importance[indices])
plt.xticks(range(len(perm_importance)), feature_names[indices], rotation=45)
plt.title('Permutatie Importance (betrouwbaardere feature ranking)')
plt.tight_layout()
plt.savefig('permutatie_importance.png')
plt.show()
print("\nScript succesvol voltooid! Alle visualisaties zijn opgeslagen als PNG-bestanden.")
```
## Hoe te interpreteren:
### 📊 **Prestatie-indicatoren:**
- **Nauwkeurigheid**: Percentage correcte voorspellingen (80%+ = goed)
- **Precisie**: Hoeveel van de positieve voorspellingen waren correct?
- **Recall**: Hoeveel van de werkelijke positieve gevallen werden gedetecteerd?
- **F1-score**: Balans tussen precisie en recall (dicht bij 1 = excellent)
### 📈 **Visualisaties:**
1. **Verwarringsmatrix**: Toont correcte/incorrecte voorspellingen per klasse
2. **Feature Importance**: Welke klantkenmerken zijn het meest voorspellend
3. **ROC Curve**: Trade-off tussen true positive rate en false positive rate
4. **Precision-Recall Curve**: Relatie tussen precisie en recall
### 💡 **Praktische tips:**
- Check eerst of de dataset gebalanceerd is
- Let op overfitting (groot verschil tussen train/test scores)
- Gebruik permutatie importance voor betere feature interpretatie
- Pas de doelvariabele aan naar jouw specifieke kolomnaam
Zorg dat `klantgegevens.csv` in dezelfde map staat en pas de kolomnamen aan volgens jouw dataset!
error: Generation failed [deepseek] prompt_id=1535 locale=es err=DeepSeek connection/timeout