【问题标题】:Split data into train, test, validation with stratifying using Numpy使用 Numpy 将数据拆分为训练、测试和验证
【发布时间】:2019-01-27 19:31:12
【问题描述】:

我刚刚看到了这个answer on SO,它展示了如何使用 numpy 拆分数据。

假设我们要将它们拆分为0.80.10.1,分别用于训练、测试和验证,您可以这样操作:

train, test, val = np.split(df, [int(.8 * len(df)), int(.9 * len(df))])

我很想知道在使用这种方法拆分数据时如何考虑分层。

分层是拆分数据,同时保留数据中每个类别的先验。也就是说,如果您打算将0.8 用于训练集,则从您拥有的每个课程中获取 0.8。测试和训练也一样。

我尝试使用以下方法首先按类对数据进行分组:

grouped_df = df.groupby(class_col_name, group_keys=False)

但它没有显示正确的结果。


注意:我熟悉train_test_split

【问题讨论】:

标签: python python-3.x pandas numpy pandas-groupby


【解决方案1】:

只需使用您的 groupby 对象,grouped_df,它由每个子集数据框组成,然后您可以在其中运行所需的 np.split。然后将所有采样数据帧与pd.concat 连接起来。总之,这将根据您引用的消息分层

train_list = []; test_list = [], val_list = []
grouped_df = df.groupby(class_col_name)

# ITERATE THROUGH EACH SUBSET DF
for i, g in grouped_df:
    # STRATIFY THE g (CLASS) DATA FRAME
    train, test, val = np.split(g, [int(.8 * len(g)), int(.9 * len(g))])

    train_list.append(train); test_list.append(test); val_list.append(val)

final_train = pd.concat(train_list)
final_test = pd.concat(test_list)
final_val = pd.concat(val_list)

或者,使用列表推导的简写版本:

# LIST OF ARRAYS
arr_list = [np.split(g, [int(.8 * len(g)), int(.9 * len(g))]) for i, g in grouped_df]

final_train = pd.concat([t[0] for t in arr_list])
final_test = pd.concat([t[1] for t in arr_list])
final_val = pd.concat([v[2] for v in arr_list])

【讨论】:

  • 谢谢你:),您知道我们如何将您的 sn-p 优化到极致吗?
  • 很高兴听到。我无法立即看到任何优化空间。我们避免在循环中增长数据帧。请参阅编辑以获得更紧凑的版本,但可能不会有更好的性能。
【解决方案2】:

这假设您已经完成了分层,因此“类别”列指示每个条目属于哪个分层。

from collections import namedtuple

Dataset = namedtuple('Dataset', 'train test val')

grouped = df.groupby('headline')
splitted = {x: grouped.get_group(x).sample(frac=1) for x in grouped.groups}
datasets = {k:Dataset(*np.split(df, [int(.8 * len(df)), int(.9 * len(df))])) for k, df in splitted.items()}

这会按df 中分配的类别名称存储每个分层拆分。

数据集中的每个项目都是一个Dataset 命名元组,因此.train.test.val 可以分别访问训练、测试和验证子集。

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2021-01-19
    • 1970-01-01
    • 2016-07-28
    • 2018-11-19
    • 1970-01-01
    • 2020-12-01
    • 2021-04-19
    相关资源
    最近更新 更多