如何使用
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
乐队(右)的东西。
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())
)
这是完整的笔记本。
Seaborn 的 object API 目前还不成熟(尽管非常有趣!)并且还不支持某些请求的功能。维护者也不接受一些太过分的PR,承诺一旦代码稳定就会提供更多功能。引用 git 讨论(23 年 2 月):
我相信 PolyFit 现在基本上是一个占位符,用于提供基本功能,但将来可能会发生变化,这就是文档不完整的原因。 至于拥有更多的对象,我认为答案在#3133:它是 肯定是想要拥有更多对象,但可能一旦 API 可用 更稳定。现在添加对象意味着更多的维护和 不鼓励在必要时更改 API。让他们进来 对我来说,讨论似乎是一个很好的妥协:可供其他人访问 用户,但没有维护压力。
我的建议是不要尝试寻找 hack,而只需使用标准 API 并为未来版本的改进点赞
seaborn.objects
。