首页 > 解决方案 > Pandas:快速随机负采样

问题描述

假设我有一个包含给定用户的正样本和上下文特征的 DataFrame:

   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与 a 交互的 a cashtag,用target= 1 表示。

什么是我为每个交互生成比例为 1:2 (+ve:-ve) 的负样本的快速方法,用target= -1 表示?

编辑:为了清楚起见,下面的样本(对于前两个阳性样本)

   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

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

检查是否尚未为该组合输入负样本也user很有帮助cashtag

标签: pythonpandas

解决方案


这是我的解决方案:

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   

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


推荐阅读