【发布时间】:2019-03-15 01:50:11
【问题描述】:
使用以下数据框,只有 2 个可能的标签:
name f1 f2 label
0 A 8 9 1
1 A 5 3 1
2 B 8 9 0
3 C 9 2 0
4 C 8 1 0
5 C 9 1 0
6 D 2 1 0
7 D 9 7 0
8 D 3 1 0
9 E 5 1 1
10 E 3 6 1
11 E 7 1 1
我编写了一个代码来按“名称”列对数据进行分组并将结果转换为一个 numpy 数组,因此每一行都是特定组的所有样本的集合,而标签是另一个 numpy 数组:
数据:
[[8 9] [5 3] [0 0]] # A lable = 1
[[8 9] [0 0] [0 0]] # B lable = 0
[[9 2] [8 1] [9 1]] # C lable = 0
[[2 1] [9 7] [3 1]] # D lable = 0
[[5 1] [3 6] [7 1]] # E lable = 1
标签:
[[1]
[0]
[0]
[0]
[1]]
代码:
import pandas as pd
import numpy as np
def prepare_data(group_name):
df = pd.read_csv("../data/tmp.csv")
group_index = df.groupby(group_name).cumcount()
data = (df.set_index([group_name, group_index])
.unstack(fill_value=0).stack())
target = np.array(data['label'].groupby(level=0).apply(lambda x: [x.values[0]]).tolist())
data = data.loc[:, data.columns != 'label']
data = np.array(data.groupby(level=0).apply(lambda x: x.values.tolist()).tolist())
print(data)
print(target)
prepare_data('name')
我想从过度代表的类中重新采样并删除实例。
即
[[8 9] [5 3] [0 0]] # A lable = 1
[[8 9] [0 0] [0 0]] # B lable = 0
[[9 2] [8 1] [9 1]] # C lable = 0
# group D was deleted randomly from the '0' labels
[[5 1] [3 6] [7 1]] # E lable = 1
将是一个可接受的解决方案,因为删除 D(标记为“0”)将产生 2 * 标签“1”和 2 * 标签“0”的平衡数据集。
【问题讨论】:
-
imbalanced-learn包有很好的过采样/欠采样实用程序。 -
我不知道为什么
D被删除了?你能定义“过度代表”吗? -
D 是随机选择的,只是因为它具有类 '0',删除一个 '0' 样本提供了 2(1) 和 2(0) 的平衡数据集。
-
名称和标签总是匹配的情况吗?例如我们可以有
name = A和label = 0的一行和name = A和label = 1的另一行 -
不,name 是唯一值,例如 A 只能是 1 或 0,不能同时是两者
标签: python pandas numpy machine-learning dataset