Ziel: aus gegebenen Stichproben einer Wahrscheinlichkeitsverteilung die Verteilung herleiten
Beispiel: Altersverteilung der Titanic-Daten
titanic["Age"].plot.hist(density=True, bins=20)
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
Paket scipy.stats
: Erlaubt es, aus Beispieldaten verschiedene Arten von Verteilungen zur Approximation herzuleiten:
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)
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)
Aufgabe: Verwende weitere Verteilungen (z.B. lognorm, gamma, ...)
Evaluierung (Kolmogorov-Smirnov-Test):
stats.kstest(titanic["Age"].dropna(), dist_norm.cdf)
# KstestResult(statistic=0.054, pvalue=0.029)
Lineare Regression: Festlegen einer linearen Funktion, die die Datenpunkte bestmöglich approximiert (kleinste Quadratsumme)
Beispiel: Wir betrachten verschiedene Einkäufe bei verschiedenen Supermärkten:
Aufgabe: Schätzung der Preise von:
Diese Aufgabe kann mit Hilfe von Regression beantwortet werden.
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
verbreitetste Variante:
OLS (ordinary least squares): die Summe der Quadrate der Abweichungen soll minimal werden
allgemein:
Werte für einzelne unabhängige Variablen:
Python-Pakete für lineare Regression:
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())
import statsmodels.api as sm
# add constant column for base value of y (intercept)
x = sm.add_constant(dataset.data)
y = dataset.target
model = sm.OLS(y, x)
res = model.fit()
res.summary()
behalte nur Werte, deren Einfluss signifikant sind:
x_cleaned = x.drop(["age", "s3", "s6", "s4"], axis=1)
anstatt einers linearen Verhältnisses wird ein polynomiales (oder anderes) Verhältnis zwischen unabhängigen und abhängiger Variable angenommen
Annahme einer quadratischen Beziehung zum Alter in den Diabetes-Daten
Hinzufügen einer weiteren Spalte:
x["age_squared"] = x["age"] ** 2
Regularisierung, um große Koeffizienten zu vermeiden:
model.fit_regularized(alpha=0.01, L1_wt=0.1)
Passende Regression bei binären Klassifikationen (0 / 1): Logistische Regression
Beispiel: Logistische Regression für Überleben auf der Titanic
https://www.kaggle.com/jojoker/titanic-survival-chance-with-statsmodels
Daten importieren:
import pandas as pd
titanic = pd.read_csv(
"https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv",
index_col="PassengerId",
)
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"])
import statsmodels.api as sm
x = titanic[["Pclass", "Age", "SibSp", "Parch", "Fare", "Female"]]
x = sm.add_constant(x)
y = titanic["Survived"]
model = sm.Logit(y, x)
results = model.fit()
results.summary()
Verwerfen von Attributen mit hohem p-Wert:
x = x.drop(["Parch", "Fare"], axis=1)
Vereinfachung von Daten mit einer großen Anzahl an Merkmalen zu Daten mit weniger, aber aussagekräftigeren Merkmalen
siehe auch: Dimensionality Reduction on Machine Learning Mastery
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.
Ziel: Finden von Gruppierungen (Clustern) von Datenpunkten
Strategien:
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:
Dieses Verfahren konvergiert.
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)
Cluster-Zentren:
model.cluster_centers_
Visualisierung der Zentren:
species_pred = model.predict(measurements)
plt.scatter(
measurements[:, 0],
measurements[:, 1],
c=species_pred
)
Beispiele: