说我有一个给定用户的充满正样本和上下文特征的数据框:
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倍。
检查是否还没有为该user
,cashtag
组合输入阴性样本。
答案 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
新的随机行放在数据帧的末尾