Dezember 21, 2025
14 Min. Lesezeit

Interviewfragen für Senior Data Scientists: Der umfassende Leitfaden

interview
career-advice
job-search
Interviewfragen für Senior Data Scientists: Der umfassende Leitfaden
MB

Milad Bonakdar

Autor

Meistern Sie fortgeschrittene Data-Science-Konzepte mit wichtigen Interviewfragen zu fortgeschrittenen ML-Algorithmen, Deep Learning, Modellbereitstellung, Feature Engineering, A/B-Tests und Big Data für Senior Data Scientists.


Einführung

Von erfahrenen Data Scientists wird erwartet, dass sie End-to-End-Machine-Learning-Lösungen entwerfen, die Modellleistung optimieren, Modelle in der Produktion bereitstellen und Erkenntnisse an Stakeholder kommunizieren. Diese Rolle erfordert fundierte Kenntnisse in fortgeschrittenen Algorithmen, Feature Engineering, Modellbereitstellung und die Fähigkeit, komplexe Geschäftsprobleme mit Daten zu lösen.

Dieser umfassende Leitfaden behandelt wichtige Interviewfragen für Senior Data Scientists, die fortgeschrittenes maschinelles Lernen, Deep Learning, Feature Engineering, Modellbereitstellung, A/B-Tests und Big-Data-Technologien umfassen. Jede Frage enthält detaillierte Antworten, eine Seltenheitsbewertung und Schwierigkeitsgrade.


Fortgeschrittenes maschinelles Lernen (6 Fragen)

1. Erläutern Sie den Bias-Variance-Tradeoff.

Antwort: Der Bias-Variance-Tradeoff beschreibt die Beziehung zwischen Modellkomplexität und Vorhersagefehler.

  • Bias (Verzerrung): Fehler durch zu vereinfachende Annahmen (Underfitting)
  • Variance (Varianz): Fehler durch Empfindlichkeit gegenüber Schwankungen der Trainingsdaten (Overfitting)
  • Tradeoff (Abwägung): Die Verringerung des Bias erhöht die Varianz und umgekehrt
  • Ziel: Finden Sie ein optimales Gleichgewicht, das den Gesamtfehler minimiert
Loading diagram...
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

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

# Modell mit hohem Bias (max_depth=1)
high_bias = DecisionTreeRegressor(max_depth=1)

# Modell mit hoher Varianz (max_depth=20)
high_variance = DecisionTreeRegressor(max_depth=20)

# Optimales Modell (max_depth=3)
optimal = DecisionTreeRegressor(max_depth=3)

# Lernkurven zeigen den Bias-Variance-Tradeoff
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"Trainingsscore: {train_scores.mean():.2f}")
print(f"Validierungsscore: {val_scores.mean():.2f}")

Seltenheit: Sehr häufig Schwierigkeit: Schwer


2. Was ist Regularisierung und erklären Sie L1- vs. L2-Regularisierung.

Antwort: Die Regularisierung fügt der Verlustfunktion einen Strafterm hinzu, um Overfitting zu verhindern.

  • L1 (Lasso):
    • Strafe: Summe der Absolutwerte der Koeffizienten
    • Effekt: Sparse Modelle (einige Koeffizienten werden genau 0)
    • Verwendung: Feature-Auswahl
  • L2 (Ridge):
    • Strafe: Summe der quadrierten Koeffizienten
    • Effekt: Schrumpft Koeffizienten in Richtung 0 (aber nicht genau 0)
    • Verwendung: Wenn alle Features potenziell relevant sind
  • Elastic Net: Kombiniert L1 und 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

# Daten mit vielen Features generieren
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)

# L1-Regularisierung (Lasso)
lasso = Lasso(alpha=1.0)
lasso.fit(X_train, y_train)
print(f"Lasso-Koeffizienten: {np.sum(lasso.coef_ != 0)} ungleich Null von {len(lasso.coef_)}")

# L2-Regularisierung (Ridge)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
print(f"Ridge-Koeffizienten: {np.sum(ridge.coef_ != 0)} ungleich Null von {len(ridge.coef_)}")

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

print(f"\nLasso-Score: {lasso.score(X_test, y_test):.3f}")
print(f"Ridge-Score: {ridge.score(X_test, y_test):.3f}")
print(f"Elastic-Net-Score: {elastic.score(X_test, y_test):.3f}")

Seltenheit: Sehr häufig Schwierigkeit: Mittel


3. Erläutern Sie Ensemble-Methoden: Bagging vs. Boosting.

Antwort: Ensemble-Methoden kombinieren mehrere Modelle, um die Leistung zu verbessern.

  • Bagging (Bootstrap Aggregating):
    • Trainieren Sie Modelle parallel auf zufälligen Teilmengen
    • Reduziert die Varianz
    • Beispiel: Random Forest
  • Boosting:
    • Trainieren Sie Modelle sequenziell, wobei jedes vorherige Fehler korrigiert
    • Reduziert den Bias
    • Beispiele: 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

# Daten laden
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"Random Forest (Bagging) Genauigkeit: {rf_score:.3f}")
print(f"Gradient Boosting Genauigkeit: {gb_score:.3f}")

# Kreuzvalidierung
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"\nRF CV Scores: {rf_cv.mean():.3f} (+/- {rf_cv.std():.3f})")
print(f"GB CV Scores: {gb_cv.mean():.3f} (+/- {gb_cv.std():.3f})")

Seltenheit: Sehr häufig Schwierigkeit: Schwer


4. Was ist Kreuzvalidierung und warum ist K-Fold besser als Train-Test-Split?

Antwort: Die Kreuzvalidierung bewertet die Modellleistung robuster als eine einzelne Train-Test-Aufteilung.

  • K-Fold CV:
    • Teilt die Daten in k Folds auf
    • Trainiert k Mal, wobei jedes Mal ein anderer Fold als Validierung verwendet wird
    • Mittelt die Ergebnisse
  • Vorteile:
    • Zuverlässigere Leistungsschätzung
    • Verwendet alle Daten sowohl für das Training als auch für die Validierung
    • Reduziert die Varianz in der Leistungsschätzung
  • Variationen: 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)

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

# Stratified K-Fold (behält die Klassenverteilung bei)
stratified_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
stratified_scores = cross_val_score(model, X, y, cv=stratified_kfold)
print(f"\nStratified K-Fold Scores: {stratified_scores}")
print(f"Mittelwert: {stratified_scores.mean():.3f} (+/- {stratified_scores.std():.3f})")

# Benutzerdefinierte Kreuzvalidierung
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"\nTestgenauigkeit: {cv_results['test_accuracy'].mean():.3f}")
print(f"Testpräzision: {cv_results['test_precision_macro'].mean():.3f}")
print(f"Test-Recall: {cv_results['test_recall_macro'].mean():.3f}")

Seltenheit: Sehr häufig Schwierigkeit: Mittel


5. Erläutern Sie Techniken zur Dimensionsreduktion (PCA, t-SNE).

Antwort: Die Dimensionsreduktion reduziert die Anzahl der Features unter Beibehaltung von Informationen.

  • PCA (Principal Component Analysis):
    • Lineare Transformation
    • Findet Richtungen maximaler Varianz
    • Bewahrt die globale Struktur
    • Schnell, interpretierbar
  • t-SNE (t-Distributed Stochastic Neighbor Embedding):
    • Nichtlineare Transformation
    • Bewahrt die lokale Struktur
    • Gut zur Visualisierung
    • Langsamer, nicht zur Feature-Extraktion
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# Hochdimensionale Daten laden
digits = load_digits()
X, y = digits.data, digits.target

print(f"Originalform: {X.shape}")

# PCA - Reduzierung auf 2 Dimensionen
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print(f"PCA-Form: {X_pca.shape}")
print(f"Erklärte Varianzrate: {pca.explained_variance_ratio_}")
print(f"Gesamte erklärte Varianz: {pca.explained_variance_ratio_.sum():.3f}")

# t-SNE - Reduzierung auf 2 Dimensionen
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
print(f"t-SNE-Form: {X_tsne.shape}")

# PCA zur Feature-Extraktion (behält 95 % der Varianz bei)
pca_95 = PCA(n_components=0.95)
X_reduced = pca_95.fit_transform(X)
print(f"\nKomponenten für 95 % Varianz: {pca_95.n_components_}")
print(f"Reduzierte Form: {X_reduced.shape}")

Seltenheit: Häufig Schwierigkeit: Schwer


6. Was ist die ROC-Kurve und AUC? Wann würden Sie sie verwenden?

Antwort: Die ROC-Kurve (Receiver Operating Characteristic) stellt die True Positive Rate vs. False Positive Rate bei verschiedenen Schwellenwerten dar.

  • AUC (Area Under Curve): Einzelne Metrik, die ROC zusammenfasst
    • AUC = 1.0: Perfekter Klassifikator
    • AUC = 0.5: Zufälliger Klassifikator
    • AUC < 0.5: Schlechter als zufällig
  • Anwendungsfälle:
    • Vergleich von Modellen
    • Imbalancierte Datensätze
    • Wenn Sie einen Schwellenwert auswählen müssen
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

# Daten laden
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
)

# Modell trainieren
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)

# Wahrscheinlichkeitsvorhersagen abrufen
y_pred_proba = model.predict_proba(X_test)[:, 1]

# ROC-Kurve berechnen
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)

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

# Alternative: direkte AUC-Berechnung
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"AUC (direkt): {auc_score:.3f}")

# Optimalen Schwellenwert finden (Youden's J-Statistik)
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
print(f"Optimaler Schwellenwert: {optimal_threshold:.3f}")

Seltenheit: Sehr häufig Schwierigkeit: Mittel


Feature Engineering (4 Fragen)

7. Welche Techniken verwenden Sie für das Feature Engineering?

Antwort: Feature Engineering erstellt neue Features aus vorhandenen Daten, um die Modellleistung zu verbessern.

  • Techniken:
    • Codierung: One-Hot-, Label-, Zielcodierung
    • Skalierung: StandardScaler, MinMaxScaler
    • Binning: Diskretisieren Sie kontinuierliche Variablen
    • Polynomielle Features: Interaktionsterme
    • Domänenspezifisch: Datums-Features, Text-Features
    • Aggregationen: Gruppenstatistiken
from sklearn.preprocessing import StandardScaler, OneHotEncoder, PolynomialFeatures
import pandas as pd
import numpy as np

# Beispieldaten
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-Codierung
df_encoded = pd.get_dummies(df, columns=['department'], prefix='dept')

# Skalierung
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'])

# Datums-Features
df_encoded['year'] = df['date'].dt.year
df_encoded['month'] = df['date'].dt.month
df_encoded['day_of_week'] = df['date'].dt.dayofweek

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

# Interaktions-Features
df_encoded['age_salary_interaction'] = df['age'] * df['salary']

print(df_encoded.head())

Seltenheit: Sehr häufig Schwierigkeit: Mittel


8. Wie gehen Sie mit imbalancierten Datensätzen um?

Antwort: Imbalancierte Datensätze weisen ungleiche Klassenverteilungen auf, die Modelle verzerren können.

  • Techniken:
    • Resampling:
      • Oversampling der Minderheitsklasse (SMOTE)
      • Undersampling der Mehrheitsklasse
    • Klassengewichte: Bestrafen Sie die Fehlklassifizierung der Minderheitsklasse
    • Ensemble-Methoden: Balanced Random Forest
    • Bewertung: Verwenden Sie Präzision, Recall, F1, nicht nur Genauigkeit
    • Anomalieerkennung: Behandeln Sie Minderheiten als Anomalie
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

# Imbalanzierten Datensatz erstellen
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"Klassenverteilung: {np.bincount(y)}")

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

# 1. Ohne Behandlung des Ungleichgewichts
model_baseline = LogisticRegression()
model_baseline.fit(X_train, y_train)
y_pred_baseline = model_baseline.predict(X_test)
print("\nBaseline (keine Behandlung):")
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"\nNach 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("\nMit SMOTE:")
print(classification_report(y_test, y_pred_smote))

# 3. Klassengewichte
model_weighted = LogisticRegression(class_weight='balanced')
model_weighted.fit(X_train, y_train)
y_pred_weighted = model_weighted.predict(X_test)
print("\nMit Klassengewichten:")
print(classification_report(y_test, y_pred_weighted))

Seltenheit: Sehr häufig Schwierigkeit: Mittel


9. Erläutern Sie Techniken zur Feature-Auswahl.

Antwort: Die Feature-Auswahl identifiziert die relevantesten Features für die Modellierung.

  • Methoden:
    • Filtermethoden: Statistische Tests (Korrelation, Chi-Quadrat)
    • Wrapper-Methoden: Rekursive Feature-Eliminierung (RFE)
    • Eingebettete Methoden: Lasso, baumbasierte Feature-Wichtigkeit
    • Dimensionsreduktion: PCA (unterscheidet sich von der Auswahl)
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

# Daten laden
data = load_breast_cancer()
X, y = data.data, data.target

# 1. Filtermethode - SelectKBest mit Chi-Quadrat
X_scaled = MinMaxScaler().fit_transform(X)
selector_chi2 = SelectKBest(chi2, k=10)
X_chi2 = selector_chi2.fit_transform(X_scaled, y)
print(f"Original-Features: {X.shape[1]}")
print(f"Ausgewählte Features (chi2): {X_chi2.shape[1]}")

# 2. Wrapper-Methode - Rekursive Feature-Eliminierung
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"Ausgewählte Features (RFE): {X_rfe.shape[1]}")
print(f"Feature-Ranking: {rfe.ranking_}")

# 3. Eingebettete Methode - Baumbasierte Feature-Wichtigkeit
rf.fit(X, y)
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

print("\nTop 10 Features nach Wichtigkeit:")
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"\nAusgewählte Features (Wichtigkeit): {X_selected.shape[1]}")

Seltenheit: Häufig Schwierigkeit: Mittel


10. Wie gehen Sie mit kategorialen Variablen mit hoher Kardinalität um?

Antwort: Kategoriale Variablen mit hoher Kardinalität haben viele eindeutige Werte.

  • Techniken:
    • Zielcodierung: Ersetzen Sie sie durch den Zielmittelwert
    • Frequenzcodierung: Ersetzen Sie sie durch die Frequenz
    • Embedding: Lernen Sie dichte Darstellungen (neuronale Netze)
    • Gruppierung: Kombinieren Sie seltene Kategorien in "Sonstige"
    • Hashing: Hashen Sie auf eine feste Anzahl von Buckets
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Beispieldaten mit hoher Kardinalität
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"Eindeutige Städte: {df['city'].nunique()}")

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

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

# 3. Gruppieren seltener Kategorien
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"\nNach dem Gruppieren: {df['city_grouped'].nunique()} eindeutige Werte")

# 4. Hash-Codierung (mit der category_encoders-Bibliothek)
# 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())

Seltenheit: Häufig Schwierigkeit: Schwer


Modellbereitstellung und Produktion (4 Fragen)

11. Wie stellen Sie ein Machine-Learning-Modell in der Produktion bereit?

Antwort: Die Modellbereitstellung stellt Modelle für die reale Nutzung zur Verfügung.

  • Schritte:
    1. Modellserialisierung: Speichern Sie das Modell (Pickle, Joblib, ONNX)
    2. API-Entwicklung: Erstellen Sie eine REST-API (Flask, FastAPI)
    3. Containerisierung: Docker für Konsistenz
    4. Bereitstellung: Cloud-Plattformen (AWS, GCP, Azure)
    5. Überwachung: Verfolgen Sie Leistung und Drift
    6. CI/CD: Automatisierte Tests und Bereitstellung
# 1. Modell trainieren und speichern
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import joblib

# Modell trainieren
data = load_iris()
model = RandomForestClassifier()
model.fit(data.data, data.target)

# Modell speichern
joblib.dump(model, 'model.joblib')

# 2. API mit FastAPI erstellen
from fastapi import FastAPI
import numpy as np

app = FastAPI()

# Modell laden
model = joblib.load('model.joblib')

@app.post("/predict")
def predict(features: list):
    # In ein NumPy-Array konvertieren
    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. Verwendung
# curl -X POST "http://localhost:8000/predict" \
#      -H "Content-Type: application/json" \
#      -d '{"features": [5.1, 3.5, 1.4, 0.2]}'

Seltenheit: Sehr häufig Schwierigkeit: Schwer


12. Was ist Modellüberwachung und warum ist sie wichtig?

Antwort: Die Modellüberwachung verfolgt die Modellleistung in der Produktion.

  • Was ist zu überwachen:
    • Leistungsmetriken: Genauigkeit, Präzision, Recall
    • Datendrift: Änderungen der Eingabeverteilung
    • Konzeptdrift: Änderungen der Zielbeziehung
    • Systemmetriken: Latenz, Durchsatz, Fehler
  • Aktionen:
    • Benachrichtigungen bei Leistungsverschlechterung
    • Retrain mit neuen Daten
    • A/B-Tests neuer Modelle
import numpy as np
from scipy import stats

# Produktionsdaten simulieren
training_data = np.random.normal(0, 1, 1000)
production_data = np.random.normal(0.5, 1.2, 1000)  # Drifted

# Datendrift mit dem Kolmogorov-Smirnov-Test erkennen
statistic, p_value = stats.ks_2samp(training_data, production_data)

print(f"KS-Statistik: {statistic:.4f}")
print(f"P-Wert: {p_value:.4f}")

if p_value < 0.05:
    print("Datendrift erkannt! Erwägen Sie, das Modell neu zu trainieren.")
else:
    print("Keine signifikante Drift erkannt.")

# Modellleistung überwachen
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

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

Seltenheit: Häufig Schwierigkeit: Mittel


13. Erläutern Sie A/B-Tests im Kontext des maschinellen Lernens.

Antwort: A/B-Tests vergleichen zwei Versionen (Kontrolle vs. Behandlung), um festzustellen, welche besser abschneidet.

  • Prozess:
    1. Teilen Sie den Datenverkehr zufällig auf
    2. Stellen Sie jeder Gruppe verschiedene Modelle bereit
    3. Sammeln Sie Metriken
    4. Statistischer Test zur Bestimmung des Gewinners
  • Metriken: Konversionsrate, Umsatz, Engagement
  • Statistische Tests: T-Test, Chi-Quadrat, Bayes'sche Methoden
import numpy as np
from scipy import stats

# A/B-Testergebnisse simulieren
# Kontrollgruppe (Modell A)
control_conversions = 520
control_visitors = 10000

# Behandlungsgruppe (Modell B)
treatment_conversions = 580
treatment_visitors = 10000

# Konversionsraten berechnen
control_rate = control_conversions / control_visitors
treatment_rate = treatment_conversions / treatment_visitors

print(f"Kontrollkonversionsrate: {control_rate:.4f}")
print(f"Behandlungskonversionsrate: {treatment_rate:.4f}")
print(f"Lift: {((treatment_rate - control_rate) / control_rate * 100):.2f}%")

# Test auf statistische Signifikanz (Zwei-Proportionen-Z-Test)
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"\nZ-Score: {z_score:.4f}")
print(f"P-Wert: {p_value:.4f}")

if p_value < 0.05:
    print("Das Ergebnis ist statistisch signifikant!")
    if treatment_rate > control_rate:
        print("Die Behandlung (Modell B) ist besser.")
    else:
        print("Die Kontrolle (Modell A) ist besser.")
else:
    print("Kein statistisch signifikanter Unterschied.")

# Berechnung der Stichprobengröße
from statsmodels.stats.power import zt_ind_solve_power

required_sample = zt_ind_solve_power(
    effect_size=0.02,  # Minimal nachweisbarer Effekt
    alpha=0.05,
    power=0.8,
    alternative='two-sided'
)
print(f"\nErforderliche Stichprobengröße pro Gruppe: {int(required_sample)}")

Seltenheit: Häufig Schwierigkeit: Schwer


14. Was ist MLOps und warum ist es wichtig?

Antwort: MLOps (Machine Learning Operations) wendet DevOps-Prinzipien auf ML-Systeme an.

  • Komponenten:
    • Versionskontrolle: Code, Daten, Modelle
    • Automatisierte Tests: Unit-, Integrations-, Modelltests
    • CI/CD-Pipelines: Automatisierte Bereitstellung
    • Überwachung: Leistung, Drifterkennung
    • Reproduzierbarkeit: Experimentverfolgung
  • Tools: MLflow, Kubeflow, DVC, Weights & Biases
# Beispiel: MLflow zur Experimentverfolgung
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

# Daten laden
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
)

# MLflow-Lauf starten
with mlflow.start_run():
    # Parameter protokollieren
    n_estimators = 100
    max_depth = 5
    mlflow.log_param("n_estimators", n_estimators)
    mlflow.log_param("max_depth", max_depth)
    
    # Modell trainieren
    model = RandomForestClassifier(
        n_estimators=n_estimators,
        max_depth=max_depth,
        random_state=42
    )
    model.fit(X_train, y_train)
    
    # Bewerten
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    # Metriken protokollieren
Newsletter subscription

Wöchentliche Karrieretipps, die wirklich funktionieren

Erhalten Sie die neuesten Einblicke direkt in Ihr Postfach

Decorative doodle

Ihr nächstes Vorstellungsgespräch ist nur einen Lebenslauf entfernt

Erstellen Sie in wenigen Minuten einen professionellen, optimierten Lebenslauf. Keine Designkenntnisse erforderlich—nur bewährte Ergebnisse.

Meinen Lebenslauf erstellen

Diesen Beitrag teilen

Überwinden Sie die 75% ATS-Ablehnungsrate

3 von 4 Lebensläufen erreichen nie ein menschliches Auge. Unsere Keyword-Optimierung erhöht Ihre Erfolgsrate um bis zu 80% und stellt sicher, dass Recruiter Ihr Potenzial tatsächlich sehen.