如何确保某个数据点不在分层交叉验证拆分的测试集中?
How to ensure a certain datapoint is not in the test set in stratified cross validation split?
我有一个如下所示的 DataFrame。
d = {'col1': [1, 2,3,4,5,6,7,8], 'col2': ['a', 'a','b', 'b', 'c', 'c', 'd', 'd']}
df = pd.DataFrame(data=d)
df
col1 col2
0 1 a
1 2 a
2 3 b
3 4 b
4 5 c
5 6 c
6 7 d
7 8 d
当我使用 k 折交叉验证 时,我想确保 col2 中的值仅存在于训练集中或测试集中。也就是说,在拆分期间,如果 df['col2'][0] = a
和 df['col2'][1] = a
,则索引为 0 和 1 的行都应该在训练集中,否则在测试集中。不应该是第0行在训练集中,第1行在测试集中。
有没有简单的方法来做到这一点?
编辑:有没有一种方法可以将 DataFrame 分成两部分,这样每个部分都包含在 [=14= 中具有值 a
的所有数据点] 在第一个 DataFrame 或第二个但不是两者?我尝试使用 groupby
但它 returns 是一个对象,当我将它转换为字典时,我只能通过键访问它,即 a, b, c, d
您可以通过如下执行 GroupShuffleSplit
来确保变量值仅存在于集合中:
from sklearn.model_selection import GroupShuffleSplit
import pandas as pd
d = {'col1': [1, 2,3,4,5,6,7,8],
'col2': ['a', 'a','b', 'b', 'c', 'c', 'd', 'd'],
'label': [1,1,1,1,0,0,0,0]}
df = pd.DataFrame(data=d)
X = df[['col1', 'col2']]
y = df['label']
groups= df['col2']
gss = GroupShuffleSplit(n_splits=2, train_size=.8, random_state=42)
for train_idx, test_idx in gss.split(X, y, groups):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
在@Antoine Dubuis 的帮助下,我找到了我想做的事情的 sklearn 实现 - 称为 StratifiedGroupKFold。
截至 2021 年 7 月,它仍在开发中,但可以从 development/nightly 版本开始使用。我建议创建一个单独的虚拟环境来使用它。
我已经用过了,目前看来还可以,所以希望它能尽快发布稳定版本。
我有一个如下所示的 DataFrame。
d = {'col1': [1, 2,3,4,5,6,7,8], 'col2': ['a', 'a','b', 'b', 'c', 'c', 'd', 'd']}
df = pd.DataFrame(data=d)
df
col1 col2
0 1 a
1 2 a
2 3 b
3 4 b
4 5 c
5 6 c
6 7 d
7 8 d
当我使用 k 折交叉验证 时,我想确保 col2 中的值仅存在于训练集中或测试集中。也就是说,在拆分期间,如果 df['col2'][0] = a
和 df['col2'][1] = a
,则索引为 0 和 1 的行都应该在训练集中,否则在测试集中。不应该是第0行在训练集中,第1行在测试集中。
有没有简单的方法来做到这一点?
编辑:有没有一种方法可以将 DataFrame 分成两部分,这样每个部分都包含在 [=14= 中具有值 a
的所有数据点] 在第一个 DataFrame 或第二个但不是两者?我尝试使用 groupby
但它 returns 是一个对象,当我将它转换为字典时,我只能通过键访问它,即 a, b, c, d
您可以通过如下执行 GroupShuffleSplit
来确保变量值仅存在于集合中:
from sklearn.model_selection import GroupShuffleSplit
import pandas as pd
d = {'col1': [1, 2,3,4,5,6,7,8],
'col2': ['a', 'a','b', 'b', 'c', 'c', 'd', 'd'],
'label': [1,1,1,1,0,0,0,0]}
df = pd.DataFrame(data=d)
X = df[['col1', 'col2']]
y = df['label']
groups= df['col2']
gss = GroupShuffleSplit(n_splits=2, train_size=.8, random_state=42)
for train_idx, test_idx in gss.split(X, y, groups):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
在@Antoine Dubuis 的帮助下,我找到了我想做的事情的 sklearn 实现 - 称为 StratifiedGroupKFold。
截至 2021 年 7 月,它仍在开发中,但可以从 development/nightly 版本开始使用。我建议创建一个单独的虚拟环境来使用它。
我已经用过了,目前看来还可以,所以希望它能尽快发布稳定版本。