R中有一个名为segmented的包。python中是否有类似的包?
是否有一个库可以在 python 中执行分段线性回归?
数据挖掘
Python
回归
线性回归
2021-10-11 06:44:27
3个回答
不,目前 Python 中没有一个包可以像 R 中那样彻底地执行分段线性回归(例如,本博文中列出的 R 包)。或者,您可以在 Python 中使用贝叶斯马尔可夫链蒙特卡罗算法来创建分段模型。
分段线性回归,由上述链接中的所有 R 包实现,不允许额外的参数约束(即先验),并且由于这些包采用频率论方法,因此生成的模型不会为您提供模型的概率分布参数(即断点、斜率等)。在statsmodels中定义一个分段模型,这是一个常客,甚至更具限制性,因为该模型需要一个固定的 x 坐标断点。
您可以使用贝叶斯马尔可夫链蒙特卡罗算法emcee在 Python 中设计分段模型。Jake Vanderplas 写了一篇有用的博客文章和论文,介绍了如何通过与 PyMC 和 PyStan 进行比较来实现 emcee。
例子:
- 带数据的分段模型:
- 拟合参数的概率分布:
这是我自己的一个实现。
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()
是的,现在有一个名为的 Python 包piecewise-regression
,它使用相同的算法实现了与分段 R 包类似的工具。
你可以从 pip 得到它
pip install piecewise-regression
这是一个适合的示例:
它非常易于使用,这里有代码示例。
完全披露:我写了这个包。