"Distribution fitting" und "kernel density estimation"

"Distribution fitting" und "kernel density estimation"

Ziel: aus gegebenen Stichproben einer Wahrscheinlichkeitsverteilung die Verteilung herleiten

Beispiel: Altersverteilung der Titanic-Daten

titanic["Age"].plot.hist(density=True, bins=20)

Kernel Density Estimation

Visualisierung der Kernel Density Estimation (KDE):

titanic["Age"].plot.kde(xlim=(0, 80))

Kernel Density Estimation = Approximation einer Dichtefunktion durch kombinieren (summieren) vieler Basisfunktionen (z.B. Normalverteilungen)

siehe: Python Data Science Handbook: Kernel Density Estimation

Distribution fitting

Paket scipy.stats: Erlaubt es, aus Beispieldaten verschiedene Arten von Verteilungen zur Approximation herzuleiten:

  • normal
  • skew normal
  • log-normal
  • gamma
  • ...

Distribution fitting

Approximierung einer Distribution - via normal oder skew normal:

from scipy import stats

# location=mu, scale=sigma
(location, scale) = stats.norm.fit(titanic["Age"].dropna())
dist_norm = stats.norm(location, scale)

(shape, location, scale) = stats.skewnorm.fit(titanic["Age"].dropna())
dist_skewnorm = stats.skewnorm(shape, location, scale)

Distribution fitting

Visualisierung:

x = np.linspace(0, 80, 100)
plt.plot(x, dist_norm.pdf(x))
plt.plot(x, dist_skewnorm.pdf(x))
titanic["Age"].plot.hist(density=True, bins=20)

Distribution fitting

Aufgabe: Verwende weitere Verteilungen (z.B. lognorm, gamma, ...)

Distribution fitting

Evaluierung (Kolmogorov-Smirnov-Test):

stats.kstest(titanic["Age"].dropna(), dist_norm.cdf)

# KstestResult(statistic=0.054, pvalue=0.029)

Lineare Regression

Regression

Lineare Regression: Festlegen einer linearen Funktion, die die Datenpunkte bestmöglich approximiert (kleinste Quadratsumme)

  • unabhängige Variable (x)
  • abhängige Variable (y)

Lineare Regression

Beispiel: Wir betrachten verschiedene Einkäufe bei verschiedenen Supermärkten:

  • 1 l Milch, 1 kg Brot: 5.00€
  • 2 l Milch, 3 kg Brot: 13.50€
  • 3 l Milch, 2 kg Brot: 10.90€
  • (0 l Milch, 0 kg Brot: 0€)

Aufgabe: Schätzung der Preise von:

  • 1 l Milch
  • 1 kg Brot
  • 1 l Milch und 2 kg Brot

Diese Aufgabe kann mit Hilfe von Regression beantwortet werden.

Lineare Regression

Eingangsdaten:

1, 1 → 5.00
2, 3 → 13.50
3, 2 → 10.90
0, 0 → 0.00

Ergebnis einer linearen Regression:

price = 0.05 + 1.13*x + 3.73*y

Lineare Regression

verbreitetste Variante:

OLS (ordinary least squares): die Summe der Quadrate der Abweichungen soll minimal werden

Metriken

allgemein:

  • F-Test: Wahrscheinlichkeit, dass eine Korrelation besteht (oder nicht) (Annahme: normalverteilte unabhängige Größen)
  • RMSE (root mean squared error): Quadratwurzel der mittleren Abweichungsquadrate
  • R² (Bestimmtheitsmaß)
    • Maß, das den relativen Fehler ausdrückt (zwischen 0 und 1)
    • wie viel der Varianz der abhöngigen Variablen kann durch die unabhängigen Variablen erklärt werden?
  • Akaike-Informationskriterium (AIC), Bayessches Informationskriterium (BIC)

Metriken

Werte für einzelne unabhängige Variablen:

  • value: geschätzter Koeffizient
  • std error: Standardabweichung für Koeffizient
  • p-value: Wahrscheinlichkeit, dass "Output" von dieser Variable unabhängig ist
  • t-statistic: Verhältnis zwischen beobachteter Abweichung und zufällig erwarteter Abweichung

Lineare Regression mit statsmodels

Lineare Regression mit Python

Python-Pakete für lineare Regression:

  • statsmodels
  • scikit-learn

Beispiel: Diabetes-Daten

Ziel: Korrelation zwischen Patientendaten und fortschreiten einer Diabetes-Erkrankung nach einem Jahr

from sklearn.datasets import load_diabetes

# load dataset as a pandas dataframe
dataset = load_diabetes(as_frame=True)

print(dataset.DESCR)

print(dataset.data)
print(dataset.target)
print(dataset.target.describe())

Beispiel: Diabetes-Daten

import statsmodels.api as sm

# add constant column for base value of y (intercept)
x = sm.add_constant(dataset.data)

y = dataset.target

Beispiel: Diabetes-Daten

model = sm.OLS(y, x)

res = model.fit()

res.summary()

Beispiel: Diabetes-Daten

behalte nur Werte, deren Einfluss signifikant sind:

x_cleaned = x.drop(["age", "s3", "s6", "s4"], axis=1)

Regression: Polynomiale Regression und Regularisierung

Polynomiale Regression

anstatt einers linearen Verhältnisses wird ein polynomiales (oder anderes) Verhältnis zwischen unabhängigen und abhängiger Variable angenommen

Polynomiale Regression

Annahme einer quadratischen Beziehung zum Alter in den Diabetes-Daten

Hinzufügen einer weiteren Spalte:

x["age_squared"] = x["age"] ** 2

Regularisierung

Regularisierung, um große Koeffizienten zu vermeiden:

  • L_1-Regularisierung (Lasso): hohe Absolutwerte der Koeffizienten werden bestraft
  • L_2-Regularisierung (Ridge): hohe Quadrate der Koeffizienten werden bestraft
model.fit_regularized(alpha=0.01, L1_wt=0.1)

Logistische Regression mit statsmodels

Logistische Regression mit statsmodels

Passende Regression bei binären Klassifikationen (0 / 1): Logistische Regression

Logistische Regression mit statsmodels

Beispiel: Logistische Regression für Überleben auf der Titanic

https://www.kaggle.com/jojoker/titanic-survival-chance-with-statsmodels

Logistische Regression mit statsmodels

Daten importieren:

import pandas as pd
titanic = pd.read_csv(
    "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv",
    index_col="PassengerId",
)

Logistische Regression mit statsmodels

Daten vorbereiten:

# column with a numeric value
titanic["Female"] = titanic["Sex"].replace(
    {"female": 1, "male": 0}
)

# remove rows with missing age
titanic = titanic.dropna(subset=["Age"])

Logistische Regression mit statsmodels

import statsmodels.api as sm

x = titanic[["Pclass", "Age", "SibSp", "Parch", "Fare", "Female"]]
x = sm.add_constant(x)

y = titanic["Survived"]

Logistische Regression mit statsmodels

model = sm.Logit(y, x)
results = model.fit()
results.summary()

Logistische Regression mit statsmodels

Verwerfen von Attributen mit hohem p-Wert:

x = x.drop(["Parch", "Fare"], axis=1)

Dimensionsreduktion

Dimensionsreduktion

Vereinfachung von Daten mit einer großen Anzahl an Merkmalen zu Daten mit weniger, aber aussagekräftigeren Merkmalen

Techniken

  • Feature Selection: Wähle nur manche Merkmale aus, verwirf den Rest
  • Hauptkomponentenanalyse
  • Autoencoder (neuronales Netzwerk)
  • Manifold Learning

siehe auch: Dimensionality Reduction on Machine Learning Mastery

Techniken

Beispiel: MovieLens-Empfehlungen

Wir wenden einen Dimensionsreduktionsalgorithmus auf die MovieLens-Benutzerbewertungen an, um die Bewertungsdaten auf wenige Merkmale (ca 25) herunterzubrechen und dadurch gut ähnliche Filme empfehlen zu können.

Clustering

Clustering

Ziel: Finden von Gruppierungen (Clustern) von Datenpunkten

Strategien:

  • k-Means Clustering
  • Gaussian Mixture Models

k-Means Clustering

Zum Verfahren: Es werden im n-dimensionalen Raum gewisse Clusterzentren bestimmt. Ein Datenpunkt wird zu jenem Cluster gezählt, zu dessen Zentrum er den geringsten Abstand hat.

Bestimmung der Clusterzentren:

Initialisierung: zufällige Festlegung der Zentren

Wiederholt:

  • bestimmen der Zugehörigkeit jedes Datenpunktes basierend auf den Zentren
  • neue Festlegung der Zentren als Mittel der ihm zugeordneten Punkte

Dieses Verfahren konvergiert.

Python Data Science Handbook - k-Means Clustering

k-Means Clustering: Beispiel

Beispiel für Iris-Abmessungen (unter Der Annahme, dass die Spezies unbekannt sind):

measurements = np.array([[5.1, 3.5, 1.4, 0.2],
                         [4.9, 3.0, 1.4, 0.2],
                         [4.7, 3.2, 1.3, 0.2], ...])

from sklearn.cluster import KMeans

model = KMeans(n_clusters=3)
model.fit(measurements)

k-Means Clustering: Beispiel

Cluster-Zentren:

model.cluster_centers_

k-Means Clustering: Beispiel

Visualisierung der Zentren:

species_pred = model.predict(measurements)

plt.scatter(
    measurements[:, 0],
    measurements[:, 1],
    c=species_pred
)

k-Means Clustering

Beispiele: