熊猫:快速随机阴性抽样

时间:2019-03-22 13:28:24

标签: python pandas

说我有一个给定用户的充满正样本和上下文特征的数据框:

   target  user  cashtag  sector  industry
0       1   170     4979       3        70
1       1   170     5539       3        70
2       1   170     7271       3        70
3       1   170     7428       3        70
4       1   170      686       7       139

其中正样本是与user相互作用的cashtag,并用target = 1表示。

对于每次交互,我有什么快速的方法以1:2(+ ve:-ve)的比率生成负样本,表示为target = -1?

编辑:以下示例(第2个阳性示例)

   target  user  cashtag  sector  industry
0       1   170     4979       3        70
1      -1   170     3224       7       181
2      -1   170     4331       7       180
3       1   170     5539       3        70
4      -1   170     9304       4        59
5      -1   170     3833       6       185

例如,对于用户与之交互的每个现金标签,我想随机选择两个他们未与之交互的其他现金标签,并将其作为负样本添加到数据框中;有效地将数据框的大小增加到其原始大小的3倍。

检查是否还没有为该usercashtag组合输入阴性样本。

1 个答案:

答案 0 :(得分:0)

这是我的解决方法:

data="""
target  user  cashtag  sector  industry
 1   170     4979       3        70
 1   170     5539       3        70
 1   170     7271       3        70
 1   170     7428       3        70
 1   170      686       7       139
 """
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
df1 = pd.DataFrame(columns = df.columns)
cashtag = df['cashtag'].values.tolist()

#function to randomize some numbers
def randomnumber(v):
    return np.random.randint(v, size=1)

def addNewRow(x):
    for i in range(2):                   #add 2 new rows
        cash = cashtag[0]
        while cash in cashtag:           #check if cashtag already used
            cash = randomnumber(5000)[0] #random number  between 0 and 5000
        cashtag.append(cash)
        sector = randomnumber(10)[0]
        industry = randomnumber(200)[0]
        df1.loc[df1.shape[0]] = [-1, x.user, cash, sector, industry]


df.apply(lambda x: addNewRow(x), axis=1)

df = df.append(df1).reset_index()
print(df)

输出:

    index target user cashtag sector industry
0       0      1  170    4979      3       70
1       1      1  170    5539      3       70
2       2      1  170    7271      3       70
3       3      1  170    7428      3       70
4       4      1  170     686      7      139
5       0     -1  170     544      2       59
6       1     -1  170    3202      8      165
7       2     -1  170    2673      0       40
8       3     -1  170    4021      1       30
9       4     -1  170     682      6        3
10      5     -1  170    2446      1       80
11      6     -1  170    4026      9      193
12      7     -1  170    4070      9      197
13      8     -1  170    2900      1       57
14      9     -1  170    3287      0       21   

新的随机行放在数据帧的末尾