Я не уверен, что получил требование, чтобы у вас были взяты те же самые образцы. По определению, самозагрузка работает путем взятия случайной выборки, и поэтому от одного прогона к следующему будет небольшая изменчивость (если я не ошибаюсь).
Вы можете рассчитать CI так же, как это делает seaborn Итак:
# simulate data
rng = np.random.RandomState(42)
measure_names = np.tile(np.repeat(['Train BAC','Test BAC'],10),2)
model_numbers = np.repeat([0,1],20)
measure_values = np.concatenate((rng.uniform(low=0.6,high=1,size=20),
rng.uniform(low=0.5,high=0.8,size=20)
))
folds=np.tile([1,2,3,4,5,6,7,8,9,10],4)
plot_df = pd.DataFrame({'model_number':model_numbers,
'measure_name':measure_names,
'measure_value':measure_values,
'outer_fold':folds})
x_col = 'model_number'
y_col = 'measure_value'
hue_col = 'measure_name'
ci = 95
est = np.mean
n_boot = 1000
for gr,temp_df in plot_df.groupby([hue_col,x_col]):
print(gr,est(temp_df[y_col]), sns.utils.ci(sns.algorithms.bootstrap(temp_df[y_col], func=est,
n_boot=n_boot,
units=None,
seed=rng)))
, который выводит:
('Test BAC', 0) 0.7581071363371585 [0.69217109 0.8316217 ]
('Test BAC', 1) 0.6527812067134964 [0.59523784 0.71539669]
('Train BAC', 0) 0.8080546943810699 [0.73214414 0.88102816]
('Train BAC', 1) 0.6201161718490218 [0.57978654 0.66241543]
Обратите внимание, что если вы выполните l oop во второй раз, вы получите CI, которые похожи, но не совсем то же самое.
Если вы действительно хотите получить точные значения, которые использовались на графике Seaborn (обратите внимание, что, опять же, эти значения будут немного отличаться, если вы строите те же данные во второй раз), то вы могли бы извлеките значения непосредственно из художников Line2D, использованных для рисования панелей ошибок:
g = sns.catplot(x=x_col,
y=y_col,
hue=hue_col,
kind='point',
ci=ci,
estimator=est,
n_boot=n_boot,
seed=rng,
data=plot_df)
for l in g.ax.lines:
print(l.get_data())
output:
(array([0., 1.]), array([0.80805469, 0.62011617]))
(array([0., 0.]), array([0.73203808, 0.88129836])) # <<<<
(array([1., 1.]), array([0.57828366, 0.66300033])) # <<<<
(array([0., 1.]), array([0.75810714, 0.65278121]))
(array([0., 0.]), array([0.69124145, 0.83297914])) # <<<<
(array([1., 1.]), array([0.59113739, 0.71572469])) # <<<<