Nichtparametrische isotonische Regression mit Scikit-Learn

Beginner

This tutorial is from open-source community. Access the source code

Einführung

In diesem Tutorial lernen wir die isotone Regression kennen, eine nicht-parametrische Regressionsmethode, die eine nicht-abnehmende Näherung einer Funktion findet, während der mittlere quadratische Fehler auf den Trainingsdaten minimiert wird. Wir werden die beliebte Python-Machine-Learning-Bibliothek scikit-learn verwenden, um die isotone Regression zu implementieren und sie mit der linearen Regression zu vergleichen.

Tipps für die VM

Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Importieren der erforderlichen Bibliotheken

Wir beginnen mit dem Importieren der erforderlichen Bibliotheken für dieses Tutorial, nämlich NumPy, Matplotlib und scikit-learn.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

from sklearn.linear_model import LinearRegression
from sklearn.isotonic import IsotonicRegression
from sklearn.utils import check_random_state

Daten generieren

Als nächstes werden wir einige Daten generieren, die wir für unsere Regression verwenden. Wir werden einen nicht-linearen monotonen Trend mit homoskedastischem gleichförmigem Rauschen erstellen.

n = 100
x = np.arange(n)
rs = check_random_state(0)
y = rs.randint(-50, 50, size=(n,)) + 50.0 * np.log1p(np.arange(n))

Isotone und lineare Regressionsmodelle anpassen

Wir werden nun sowohl das isotone als auch das lineare Regressionsmodell an die generierten Daten anpassen.

ir = IsotonicRegression(out_of_bounds="clip")
y_ = ir.fit_transform(x, y)

lr = LinearRegression()
lr.fit(x[:, np.newaxis], y)  ## x muss 2d für LinearRegression sein

Ergebnisse plotten

Schließlich werden wir die Ergebnisse beider Regressionsmodelle plotten, um zu visualisieren, wie gut sie die Daten anpassen.

segments = [[[i, y[i]], [i, y_[i]]] for i in range(n)]
lc = LineCollection(segments, zorder=0)
lc.set_array(np.ones(len(y)))
lc.set_linewidths(np.full(n, 0.5))

fig, (ax0, ax1) = plt.subplots(ncols=2, figsize=(12, 6))

ax0.plot(x, y, "C0.", markersize=12)
ax0.plot(x, y_, "C1.-", markersize=12)
ax0.plot(x, lr.predict(x[:, np.newaxis]), "C2-")
ax0.add_collection(lc)
ax0.legend(("Training data", "Isotonic fit", "Linear fit"), loc="lower right")
ax0.set_title("Isotonic regression fit on noisy data (n=%d)" % n)

x_test = np.linspace(-10, 110, 1000)
ax1.plot(x_test, ir.predict(x_test), "C1-")
ax1.plot(ir.X_thresholds_, ir.y_thresholds_, "C1.", markersize=12)
ax1.set_title("Prediction function (%d thresholds)" % len(ir.X_thresholds_))

plt.show()

Zusammenfassung

In diesem Tutorial haben wir uns mit der isotonen Regression beschäftigt, einer nicht-parametrischen Regressionsmethode, die eine nicht-abnehmende Näherung einer Funktion findet, während der mittlere quadratische Fehler auf den Trainingsdaten minimiert wird. Wir haben auch die isotonen Regression mit scikit-learn implementiert und sie mit der linearen Regression verglichen.