Gibt es eine Bibliothek, die eine segmentierte lineare Regression in Python durchführen würde?

7

In R gibt es ein Paket mit dem Namen segmentiert. Gibt es in Python ein ähnliches Paket?

vikasreddy
quelle
Gibt es etwas Spezielles, das Sie brauchen? Für bekannte Unterbrechungspunkte kann dies nur durch eine Interaktion mit einer Indikatorfunktion (0 vor, 1 nach der Unterbrechung) oder einem linearen Spline modelliert werden. Der erste Ansatz hat einen Sprung, der zweite Ansatz führt zu einer verbundenen stückweisen Regressionslinie.
Josef

Antworten:

7

Nein, derzeit gibt es in Python kein Paket, das die segmentierte lineare Regression so gründlich segmentiert wie die in R (z. B. in diesem Blogbeitrag aufgeführte R-Pakete ). Alternativ können Sie einen Bayes'schen Markov-Ketten-Monte-Carlo-Algorithmus in Python verwenden, um Ihr segmentiertes Modell zu erstellen.

Die segmentierte lineare Regression, wie sie von allen R-Paketen im obigen Link implementiert wird, lässt keine zusätzlichen Parametereinschränkungen (dh Prioritäten) zu. Da diese Pakete einen häufigeren Ansatz verfolgen, liefert das resultierende Modell keine Wahrscheinlichkeitsverteilungen für das Modell Parameter (dh Haltepunkte, Steigungen usw.). Das Definieren eines segmentierten Modells in häufig verwendeten Statistikmodellen ist noch restriktiver, da für das Modell ein fester x-Koordinaten-Haltepunkt erforderlich ist.

Sie können ein segmentiertes Modell in Python mit dem Bayesian Markov Chain Monte Carlo-Algorithmus emcee entwerfen . Jake Vanderplas schrieb einen nützlichen Blog-Beitrag und ein Papier zur Implementierung von Emcee mit Vergleichen zu PyMC und PyStan.

Beispiel:

  • Segmentiertes Modell mit Daten:

Segmentierte Regression

  • Wahrscheinlichkeitsverteilungen von Anpassungsparametern:

Geben Sie hier die Bildbeschreibung ein

Samuel Harrold
quelle
0

Geben Sie hier die Bildbeschreibung ein

Dies ist eine eigene Implementierung.

import numpy as np
import matplotlib.pylab as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression

# parameters for setup
n_data = 20

# segmented linear regression parameters
n_seg = 3

np.random.seed(0)
fig, (ax0, ax1) = plt.subplots(1, 2)

# example 1
#xs = np.sort(np.random.rand(n_data))
#ys = np.random.rand(n_data) * .3 + np.tanh(5* (xs -.5))

# example 2
xs = np.linspace(-1, 1, 20)
ys = np.random.rand(n_data) * .3 + np.tanh(3*xs)

dys = np.gradient(ys, xs)

rgr = DecisionTreeRegressor(max_leaf_nodes=n_seg)
rgr.fit(xs.reshape(-1, 1), dys.reshape(-1, 1))
dys_dt = rgr.predict(xs.reshape(-1, 1)).flatten()

ys_sl = np.ones(len(xs)) * np.nan
for y in np.unique(dys_dt):
    msk = dys_dt == y
    lin_reg = LinearRegression()
    lin_reg.fit(xs[msk].reshape(-1, 1), ys[msk].reshape(-1, 1))
    ys_sl[msk] = lin_reg.predict(xs[msk].reshape(-1, 1)).flatten()
    ax0.plot([xs[msk][0], xs[msk][-1]],
             [ys_sl[msk][0], ys_sl[msk][-1]],
             color='r', zorder=1)

ax0.set_title('values')
ax0.scatter(xs, ys, label='data')
ax0.scatter(xs, ys_sl, s=3**2, label='seg lin reg', color='g', zorder=5)
ax0.legend()

ax1.set_title('slope')
ax1.scatter(xs, dys, label='data')
ax1.scatter(xs, dys_dt, label='DecisionTree', s=2**2)
ax1.legend()

plt.show()
Markus Dutschke
quelle