使用seaborn.objects绘制回归置信区间

问题描述 投票:0回答:1

如何使用

objects
API 绘制具有置信限的回归线(如
sns.regplot
/
sns.lmplot
)?

基于

so.Band
fmri
的例子,我认为它会是这样的:

import seaborn as sns
import seaborn.objects as so

df = sns.load_dataset("tips")

(so.Plot(df, x="total_bill", y="tip")
   .add(so.Dots())
   .add(so.Line(), so.PolyFit()) # regression line
   .add(so.Band(), so.Est())     # confidence band
)

但我得到了意想不到的结果(左)。我期待类似

regplot
乐队(右)的东西。

current and expected output

python pandas seaborn scatter-plot seaborn-objects
1个回答
3
投票

seaborn.object
只能聚合提供的数据(例如直方图的键/值对)。您的用例更加复杂,您需要自己创建引导回归数据。其他 API 能够即时执行此操作,但
object
目前还不能(请参阅注释)。

考虑准备引导预测的代码

import seaborn as sns
import seaborn.objects as so
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import BaggingRegressor

# data
df = sns.load_dataset("tips")

# bootstrap regression: tip ~ bill
X = df['total_bill'].values.reshape(-1,1)
y = df['tip'].values
model = BaggingRegressor(LinearRegression(),
                         n_estimators=100,
                         max_samples=1.0, # 100% of the dataset
                         bootstrap=True)

model.fit(X, y)
bootstrapped_preds = pd.DataFrame([m.predict(X) for m in model.estimators_]).T

# combine bootstrapped preds and original data
df_pred = pd.concat([df[['total_bill']], pd.DataFrame(bootstrapped_preds)], axis=1)
df_pred = pd.melt(df_pred, id_vars='total_bill', value_vars=list(range(50)), value_name='tip')
df_pred['type'] = 'pred'
df_pred = pd.concat([df_pred,df[['total_bill','tip']]],axis=0)
df_pred['type'] = df_pred['type'].fillna('observed')

这个绘制了围绕预测的 2 x 标准差。

# plot
import seaborn as sns
import seaborn.objects as so

(so.Plot(df_pred, x="total_bill", y="tip", color="type")
    .add(so.Band(), so.Est(errorbar=('sd',2), n_boot=1000))
    .add(so.Dot(), so.Agg())
)

生成这个数字 enter image description here

这是完整的笔记本


Seaborn 的 object API 目前还不成熟(尽管非常有趣!)并且还不支持某些请求的功能。维护者也不接受一些太过分的PR,承诺一旦代码稳定就会提供更多功能。引用 git 讨论(23 年 2 月):

我相信 PolyFit 现在基本上是一个占位符,用于提供基本功能,但将来可能会发生变化,这就是文档不完整的原因。 至于拥有更多的对象,我认为答案在#3133:它是 肯定是想要拥有更多对象,但可能一旦 API 可用 更稳定。现在添加对象意味着更多的维护和 不鼓励在必要时更改 API。让他们进来 对我来说,讨论似乎是一个很好的妥协:可供其他人访问 用户,但没有维护压力。

我的建议是不要尝试寻找 hack,而只需使用标准 API 并为未来版本的改进点赞

seaborn.objects

© www.soinside.com 2019 - 2024. All rights reserved.