В настоящее время я работаю над задачей встраивания элементов в систему рекомендаций и хочу оценить эффективность нового алгоритма встраивания со старыми.Я прочитал несколько статей о вложении графов, и почти в каждой статье упоминается нормальный метод оценки вложений, который является предсказанием ссылок.Но ни одна из этих статей не описала, как именно вы это делаете.Поэтому мой вопрос заключается в том, как оценить вложения с помощью предсказания ссылок?
Алгоритм, который я пытаюсь применить, заключается в следующем: сначала ориентированный граф строится на последовательностях щелчков пользователя, каждый узел в графе представляет элемент, и еслипользователь один раз щелкнул элемент A, затем щелкнул B, должно быть два узла A и B и ребро AB с весом 1. Когда другой пользователь нажал A, а затем щелкнул B, вес ребра AB добавляется на 1. Затем новая последовательностьНабор данных генерируется случайным блужданием по графику с использованием исходящих весов в качестве вероятностей телепортации.Наконец, SkipGram выполняется для новых последовательностей для генерации вложений узлов.
Как упоминалось во многих статьях, я удалил определенную долю ребер в графе в качестве положительных выборок тестового набора (например, 0,25) и сгенерированных случайным образомнекоторые фальшивые края как отрицательные.Ну и что дальше?Должен ли я просто генерировать поддельные ребра для реальных ребер в обучающем наборе, объединить вложения двух узлов на каждом ребре и построить общий классификатор, такой как логистическая регрессия, и проверить его на тестовом наборе?Или я должен рассчитать AUC на тестовом наборе с косинусным сходством двух узлов и меткой 0/1, указывающей, действительно ли два узла соединены?Или я должен рассчитать AUC с помощью произведения сигмоидальной точки вложения двух узлов и метки 0/1, указывающей, действительно ли два узла соединены, поскольку именно так вы вычисляете вероятность на последнем слое?
# these are example describing the three methods above
item_emb = np.random.random(400).reshape(100, 4) # assume we have 100 items and have embedded them into a 4-dimension vector space.
test_node = np.random.randint(0, 100, size=200).reshape(100, 2) # assume we have 100 pairs of nodes
test_label = np.random.randint(0, 2, size=100).reshape(100, 1) # assume this is the label indicating if the pair of nodes are really connected
def test_A():
# use logistic regression
train_node = ... # generate true and fake node pairs in a similar way
train_label = ... # generate true and fake node pairs in a similar way
train_feat = np.hstack(
item_emb[train_node[:, 0]],
item_emb[train_node[:, 1]]) # concatenate the embeddings
test_feat = np.hstack(
item_emb[test_node[:, 0]],
item_emb[test_node[:, 1]]) # concatenate the embeddings
lr = sklearn.linear_models.LogisticRegression().fit(train_feat, train_label)
auc = roc_auc_score(test_label, lr.predict_proba(test_feat)[:,1])
return auc
def test_B():
# use cosine similarity
emb1 = item_emb[test_node[:, 0]]
emb2 = item_emb[test_node[:, 1]]
cosine_sim = emb1 * emb2 / (np.linalg.norm(emb1, axis=1)*np.linalg.norm(emb2,axis=1)
auc = roc_auc_score(test_label, cosine_sim)
return auc
def test_C():
# use dot product
# here we extract the softmax weights and biases from the training network
softmax_weights = ... # same shape as item_emb
softmax_biases = ... # shape of (item_emb.shape[0], 1)
embedded_item = item_emb[test_node[:, 0]] # target item embedding
softmaxed_context = softmax_weights[test_node[:, 1]] + softmax_biases
dot_prod = np.sum(embeded_item * softmaxed_context, axis=1)
auc = roc_auc_score(test_label, dot_prod)
return auc
Я попробовал три метода в нескольких тестах, и они не всегда говорят одно и то же.Некоторые комбинации параметров работают лучше с testA () и плохо в других метриках, некоторые наоборот .. и т.д.К сожалению, нет такой комбинации параметров, которая бы выполняла другие во всех трех метриках ... Вопрос в том, какую метрику мне использовать?