1

我正在寻找一种优雅的方式来以特定方式对数据集进行采样。我找到了一些解决方案,但我想知道你们中是否有人知道更好的方法。

这是我正在查看的任务:

我想平衡我的数据集,以便类 0 的实例数量与类 1 的实例数量相同,因此在下面的示例中,我们有 5 个类 1 的实例和 11 个类 0 的实例:

编号 | 班级
------ | ------
1 | 1
1 | 0
1 | 0
1 | 0
1 | 0
2 | 1
2 | 1
2 | 0
2 | 0
2 | 0
3 | 1
3 | 1
3 | 0
3 | 0
3 | 0
3 | 0

到目前为止,我刚刚随机删除了 6 个 0 类实例,但我想防止一个 id 的所有实例都被删除。我尝试使用 sklearn 进行分层“拆分”,但它不起作用,因为并非每个 id 都包含超过 1 个项目。所需的输出应类似于以下内容:

编号 | 班级
------ | ------
1 | 1
1 | 0
2 | 1
2 | 1
2 | 0
2 | 0
3 | 1
3 | 1
3 | 0
3 | 0

有什么好主意吗?

4

2 回答 2

1

我想到了这个:

  1. 取类 = 0 数据集的一部分
  2. 取类 = 数据集的 1 部分
  3. 来自 class0 数据集的样本与 class1 数据集中的行数相同
  4. 连接
    df0 = df[df['class'] == 0]
    df1 = df[df['class'] == 1]
    df_strat = pd.concat([df0.sample(df1.shape[0]),df1])
于 2017-08-23T17:27:25.837 回答
1

我最好的猜测:从每个 id 中“保护”一个随机行(使用这些行创建单独的数据框),然后从原始数据框中删除直到满意(包括“受保护”数据框中的类将与剩余的内容对齐的事实)并连接两个数据框?

于 2017-08-23T17:05:42.163 回答