如果我使用Python中的seaborn库来绘制线性回归的结果,有没有办法找出回归的数值结果?例如,我可能想知道拟合系数或拟合的R 2.
我可以使用底层的statsmodels接口重新运行相同的拟合,但这似乎是不必要的重复工作,无论如何我想要能够比较结果系数,以确保数值结果与我的相同我在情节中看到了.
mwa*_*kom 21
没有办法做到这一点.
在我看来,要求可视化库为您提供统计建模结果是倒退的.statsmodels
,一个建模库,可以让您拟合模型,然后绘制一个与您所适合的模型完全对应的图.如果你想要那种确切的对应关系,这个操作顺序对我来说更有意义.
你可能会说"但是这些情节statsmodels
没有那么多的审美选择seaborn
".但我认为这是有道理的 - statsmodels
是一个建模库,有时在建模服务中使用可视化.seaborn
是一个可视化库,有时在可视化服务中使用建模.专业化很好,尝试做所有事情都很糟糕.
幸运的是,seaborn
并statsmodels
用整齐的数据.这意味着您真的需要很少的重复工作来通过适当的工具获得图表和模型.
Leg*_*e17 12
不幸的是,Seaborn 的创建者表示他不会添加这样的功能。下面是一些选项。(最后一部分包含我最初的建议,这是一个使用私有实现细节的黑客,seaborn
不是特别灵活。)
regplot
以下函数在散点图上叠加一条拟合线,并从 返回结果statsmodels
。这支持 最简单也可能是最常见的用法sns.regplot
,但没有实现任何更高级的功能。
import statsmodels.api as sm
def simple_regplot(
x, y, n_std=2, n_pts=100, ax=None, scatter_kws=None, line_kws=None, ci_kws=None
):
""" Draw a regression line with error interval. """
ax = plt.gca() if ax is None else ax
# calculate best-fit line and interval
x_fit = sm.add_constant(x)
fit_results = sm.OLS(y, x_fit).fit()
eval_x = sm.add_constant(np.linspace(np.min(x), np.max(x), n_pts))
pred = fit_results.get_prediction(eval_x)
# draw the fit line and error interval
ci_kws = {} if ci_kws is None else ci_kws
ax.fill_between(
eval_x[:, 1],
pred.predicted_mean - n_std * pred.se_mean,
pred.predicted_mean + n_std * pred.se_mean,
alpha=0.5,
**ci_kws,
)
line_kws = {} if line_kws is None else line_kws
h = ax.plot(eval_x[:, 1], pred.predicted_mean, **line_kws)
# draw the scatterplot
scatter_kws = {} if scatter_kws is None else scatter_kws
ax.scatter(x, y, c=h[0].get_color(), **scatter_kws)
return fit_results
Run Code Online (Sandbox Code Playgroud)
结果来自statsmodels
包含丰富的信息,例如:
>>> print(fit_results.summary())
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.477
Model: OLS Adj. R-squared: 0.471
Method: Least Squares F-statistic: 89.23
Date: Fri, 08 Jan 2021 Prob (F-statistic): 1.93e-15
Time: 17:56:00 Log-Likelihood: -137.94
No. Observations: 100 AIC: 279.9
Df Residuals: 98 BIC: 285.1
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1417 0.193 -0.735 0.464 -0.524 0.241
x1 3.1456 0.333 9.446 0.000 2.485 3.806
==============================================================================
Omnibus: 2.200 Durbin-Watson: 1.777
Prob(Omnibus): 0.333 Jarque-Bera (JB): 1.518
Skew: -0.002 Prob(JB): 0.468
Kurtosis: 2.396 Cond. No. 4.35
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Run Code Online (Sandbox Code Playgroud)
sns.regplot
与我下面的原始答案相比,上述方法的优点是很容易将其扩展到更复杂的拟合。
无耻的插件:这是regplot
我编写的一个扩展函数,它实现了 的大部分sns.regplot
功能:https : //github.com/ttesileanu/pydove。
虽然仍然缺少一些功能,但我编写的功能
statsmodels
计算置信区间而不是使用引导。log(x)
)。不幸的是,Seaborn 的创建者表示他不会添加这样的功能,所以这里有一个解决方法。
def regplot(
*args,
line_kws=None,
marker=None,
scatter_kws=None,
**kwargs
):
# this is the class that `sns.regplot` uses
plotter = sns.regression._RegressionPlotter(*args, **kwargs)
# this is essentially the code from `sns.regplot`
ax = kwargs.get("ax", None)
if ax is None:
ax = plt.gca()
scatter_kws = {} if scatter_kws is None else copy.copy(scatter_kws)
scatter_kws["marker"] = marker
line_kws = {} if line_kws is None else copy.copy(line_kws)
plotter.plot(ax, scatter_kws, line_kws)
# unfortunately the regression results aren't stored, so we rerun
grid, yhat, err_bands = plotter.fit_regression(plt.gca())
# also unfortunately, this doesn't return the parameters, so we infer them
slope = (yhat[-1] - yhat[0]) / (grid[-1] - grid[0])
intercept = yhat[0] - slope * grid[0]
return slope, intercept
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于线性回归,因为它只是从回归结果中推断出斜率和截距。好处是它使用了seaborn
自己的回归类,因此可以保证结果与显示的一致。缺点当然是我们使用了一个私有的实现细节,seaborn
它可以在任何时候中断。