Machine Learning met Python: Een Introductie
Maak kennis met machine learning concepten en leer hoe je je eerste ML model bouwt met Python en scikit-learn.
Wat is Machine Learning?
Machine Learning (ML) is een onderdeel van kunstmatige intelligentie (AI) waarbij computers leren patronen herkennen en voorspellingen maken zonder expliciet geprogrammeerd te worden voor elke specifieke taak. In plaats van regels te schrijven, trainen we modellen met data zodat ze zelf kunnen leren.
Denk aan het als het verschil tussen een traditioneel programma dat zegt "als de temperatuur boven 25°C is, draag een t-shirt" versus een ML-model dat kijkt naar duizenden foto's van mensen in verschillende weersomstandigheden en leert wanneer mensen t-shirts dragen.
Types Machine Learning
Er zijn drie hoofdcategorieën van machine learning:
1. Supervised Learning (Begeleid Leren)
Het model leert van gelabelde voorbeelden:
- Classification: Voorspelt categorieën (spam/niet-spam, hond/kat)
- Regression: Voorspelt numerieke waarden (huizenprijzen, temperatuur)
2. Unsupervised Learning (Onbegeleid Leren)
Het model zoekt patronen in data zonder labels:
- Clustering: Groepeert vergelijkbare data
- Dimensionality Reduction: Vereenvoudigt complexe data
3. Reinforcement Learning (Versterkingsleren)
Het model leert door trial-and-error met beloningen en straffen, zoals bij spellen of robotica.
Waarom Python voor Machine Learning?
Python is de meest populaire taal voor ML om verschillende redenen:
- Eenvoudige syntax: Focus op algoritmes, niet op complexe code
- Rijke ecosysteem: Vele gespecialiseerde libraries
- Sterke community: Veel hulp en resources beschikbaar
- Integratie: Werkt goed samen met web frameworks en databases
- Visualisatie: Uitstekende plotting capabilities
Belangrijke Python Libraries
Scikit-learn
De go-to library voor traditionele machine learning:
pip install scikit-learn
NumPy en Pandas
Voor data manipulatie en numerieke berekeningen:
pip install numpy pandas
Matplotlib en Seaborn
Voor data visualisatie:
pip install matplotlib seaborn
Je Eerste ML Project: Iris Classification
Laten we een klassiek ML probleem oplossen - het classificeren van Iris bloemen:
1. Data Laden en Verkennen
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# Iris dataset laden
iris = load_iris()
X = iris.data # Features: sepal length, sepal width, petal length, petal width
y = iris.target # Target: species (setosa, versicolor, virginica)
# Data in DataFrame voor makkelijkere manipulatie
df = pd.DataFrame(X, columns=iris.feature_names)
df['species'] = iris.target
df['species_name'] = df['species'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})
print("Dataset overzicht:")
print(df.head())
print(f"\nDataset shape: {df.shape}")
print(f"\nSpecies verdeling:")
print(df['species_name'].value_counts())
2. Data Visualisatie
# Pairplot om relaties tussen features te zien
plt.figure(figsize=(12, 8))
sns.pairplot(df, hue='species_name', markers=["o", "s", "D"])
plt.suptitle('Iris Dataset - Feature Relationships', y=1.02)
plt.show()
# Correlatie matrix
plt.figure(figsize=(8, 6))
correlation_matrix = df[iris.feature_names].corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('Feature Correlation Matrix')
plt.show()
# Boxplot voor feature distributie
plt.figure(figsize=(15, 10))
for i, feature in enumerate(iris.feature_names):
plt.subplot(2, 2, i+1)
sns.boxplot(data=df, x='species_name', y=feature)
plt.title(f'{feature} by Species')
plt.tight_layout()
plt.show()
3. Data Preprocessing
# Features en target scheiden
X = iris.data
y = iris.target
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"Training set: {X_train.shape}")
print(f"Test set: {X_test.shape}")
# Optioneel: Feature scaling (voor sommige algoritmes belangrijk)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
4. Model Training en Evaluatie
# Verschillende modellen proberen
models = {
'Logistic Regression': LogisticRegression(random_state=42),
'Decision Tree': DecisionTreeClassifier(random_state=42),
'Random Forest': RandomForestClassifier(random_state=42, n_estimators=100)
}
results = {}
for name, model in models.items():
# Model trainen
if name == 'Logistic Regression':
# Logistic Regression werkt beter met geschaalde data
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
else:
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# Accuracy berekenen
accuracy = accuracy_score(y_test, y_pred)
results[name] = accuracy
print(f"\n=== {name} ===")
print(f"Accuracy: {accuracy:.3f}")
print(f"Classification Report:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# Beste model selecteren
best_model = max(results, key=results.get)
print(f"\nBeste model: {best_model} (Accuracy: {results[best_model]:.3f})")
5. Model Evaluatie en Visualisatie
# Confusion matrix voor beste model
best_clf = models[best_model]
if best_model == 'Logistic Regression':
y_pred_best = best_clf.predict(X_test_scaled)
else:
y_pred_best = best_clf.predict(X_test)
# Confusion matrix
cm = confusion_matrix(y_test, y_pred_best)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=iris.target_names,
yticklabels=iris.target_names)
plt.title(f'Confusion Matrix - {best_model}')
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.show()
# Feature importance (voor tree-based models)
if best_model in ['Decision Tree', 'Random Forest']:
feature_importance = best_clf.feature_importances_
feature_names = iris.feature_names
plt.figure(figsize=(10, 6))
indices = np.argsort(feature_importance)[::-1]
plt.bar(range(len(feature_importance)), feature_importance[indices])
plt.xticks(range(len(feature_importance)),
[feature_names[i] for i in indices], rotation=45)
plt.title(f'Feature Importance - {best_model}')
plt.tight_layout()
plt.show()
Praktisch Voorbeeld: Huizenprijzen Voorspellen
Laten we een regression probleem aanpakken:
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
# California housing dataset
housing = fetch_california_housing()
X, y = housing.data, housing.target
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Random Forest Regressor
rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)
rf_regressor.fit(X_train, y_train)
# Voorspellingen
y_pred = rf_regressor.predict(X_test)
# Evaluatie
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
print(f"R² Score: {r2:.3f}")
# Voorspellingen vs werkelijke waarden
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Werkelijke Prijzen')
plt.ylabel('Voorspelde Prijzen')
plt.title('Voorspelde vs Werkelijke Huizenprijzen')
plt.show()
# Feature importance
feature_importance = rf_regressor.feature_importances_
feature_names = housing.feature_names
plt.figure(figsize=(10, 6))
indices = np.argsort(feature_importance)[::-1]
plt.bar(range(len(feature_importance)), feature_importance[indices])
plt.xticks(range(len(feature_importance)),
[feature_names[i] for i in indices], rotation=45)
plt.title('Feature Importance - Huizenprijzen Model')
plt.tight_layout()
plt.show()
Model Optimalisatie
Verbetering van model prestaties:
Cross-Validation
from sklearn.model_selection import cross_val_score, GridSearchCV
# K-fold cross-validation
rf = RandomForestClassifier(random_state=42)
cv_scores = cross_val_score(rf, X_train, y_train, cv=5)
print(f"Cross-validation scores: {cv_scores}")
print(f"Mean CV score: {cv_scores.mean():.3f} (+/- {cv_scores.std() * 2:.3f})")
Hyperparameter Tuning
# Grid Search voor beste parameters
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7, None],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1
)
grid_search.fit(X_train, y_train)
print(f"Beste parameters: {grid_search.best_params_}")
print(f"Beste CV score: {grid_search.best_score_:.3f}")
# Beste model evalueren
best_rf = grid_search.best_estimator_
y_pred_tuned = best_rf.predict(X_test)
tuned_accuracy = accuracy_score(y_test, y_pred_tuned)
print(f"Test accuracy met tuned model: {tuned_accuracy:.3f}")
Clustering: Unsupervised Learning
Laten we kijken naar clustering zonder labels:
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# Data voor clustering (zonder labels)
X_cluster = iris.data
# Data schalen voor clustering
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_cluster)
# K-Means clustering
kmeans = KMeans(n_clusters=3, random_state=42)
cluster_labels = kmeans.fit_predict(X_scaled)
# Resultaten visualiseren
plt.figure(figsize=(12, 5))
# Originele labels
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
plt.title('Werkelijke Species')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
# Cluster labels
plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis')
plt.title('K-Means Clusters')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.tight_layout()
plt.show()
# Cluster prestatie evalueren
from sklearn.metrics import adjusted_rand_score
ari_score = adjusted_rand_score(y, cluster_labels)
print(f"Adjusted Rand Index: {ari_score:.3f}")
Best Practices voor ML Projects
1. Data Quality
- Controleer op ontbrekende waarden
- Identificeer en behandel outliers
- Zorg voor representative data
- Valideer data consistency
2. Feature Engineering
# Voorbeelden van feature engineering
# Nieuwe features maken
df['sepal_ratio'] = df['sepal length (cm)'] / df['sepal width (cm)']
df['petal_ratio'] = df['petal length (cm)'] / df['petal width (cm)']
df['sepal_area'] = df['sepal length (cm)'] * df['sepal width (cm)']
# Categorische encoding
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Feature selection
from sklearn.feature_selection import SelectKBest, f_classif
selector = SelectKBest(score_func=f_classif, k=2)
X_selected = selector.fit_transform(X, y)
selected_features = selector.get_support(indices=True)
print(f"Geselecteerde features: {[iris.feature_names[i] for i in selected_features]}")
3. Model Evaluation
# Meer evaluatie metrics
from sklearn.metrics import precision_score, recall_score, f1_score
# Voor classification
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"Precision: {precision:.3f}")
print(f"Recall: {recall:.3f}")
print(f"F1-score: {f1:.3f}")
# Learning curves
from sklearn.model_selection import learning_curve
train_sizes, train_scores, val_scores = learning_curve(
RandomForestClassifier(random_state=42),
X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)
plt.figure(figsize=(10, 6))
plt.plot(train_sizes, np.mean(train_scores, axis=1), 'o-', label='Training score')
plt.plot(train_sizes, np.mean(val_scores, axis=1), 'o-', label='Validation score')
plt.xlabel('Training Set Size')
plt.ylabel('Accuracy Score')
plt.title('Learning Curves')
plt.legend()
plt.grid(True)
plt.show()
Common Pitfalls en Hoe Ze te Vermijden
1. Overfitting
Model werkt goed op training data maar slecht op nieuwe data:
- Gebruik cross-validation
- Implementeer regularisatie
- Verzamel meer training data
- Reduceer model complexiteit
2. Data Leakage
Toekomstige informatie lekt naar het model:
- Zorgvuldige feature selection
- Correct train-validation-test split
- Time-aware splits voor temporele data
3. Imbalanced Data
# Technieken voor imbalanced datasets
from sklearn.utils.class_weight import compute_class_weight
from imblearn.over_sampling import SMOTE
# Class weights
class_weights = compute_class_weight(
'balanced',
classes=np.unique(y_train),
y=y_train
)
# SMOTE voor oversampling
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
Volgende Stappen in ML
Nu je de basics kent, kun je verder gaan met:
Geavanceerde Algoritmes
- Support Vector Machines (SVM): Voor complexe classificatie
- Gradient Boosting: XGBoost, LightGBM voor competities
- Neural Networks: TensorFlow, PyTorch voor deep learning
Specialized Domains
- Natural Language Processing: Tekstanalyse met NLTK, spaCy
- Computer Vision: Beeldherkenning met OpenCV
- Time Series: Forecasting met statsmodels
MLOps en Productie
- Model Deployment: Flask, FastAPI voor APIs
- Model Monitoring: Drift detection en performance tracking
- Version Control: MLflow, DVC voor model versioning
Praktische Tips voor Beginners
- Start Klein: Begin met eenvoudige datasets en problemen
- Begrijp je Data: Spendeer tijd aan exploratory data analysis
- Experimenteer: Probeer verschillende algoritmes en parameters
- Documenteer: Houd bij wat werkt en wat niet
- Valideer: Gebruik altijd proper validation technieken
- Itereer: ML is een cyclisch proces van verbetering
Conclusie
Machine Learning met Python opent een wereld van mogelijkheden. Van het voorspellen van huizenprijzen tot het herkennen van afbeeldingen, de toepassingen zijn eindeloos. De combinatie van Python's simpliciteit en de kracht van libraries zoals scikit-learn maakt ML toegankelijk voor iedereen.
Het belangrijkste is om te beginnen met echte problemen en geleidelijk complexere technieken te leren. Elke ML-expert begon ooit met hun eerste "Hello World" model.
Klaar om je ML-reis te beginnen? Bekijk onze Data Science & AI cursus of neem contact met ons op voor persoonlijke begeleiding!