Как сделать предсказание ссылок с вложениями узлов? - PullRequest
0 голосов
/ 23 сентября 2019

В настоящее время я работаю над задачей встраивания элементов в систему рекомендаций и хочу оценить эффективность нового алгоритма встраивания со старыми.Я прочитал несколько статей о вложении графов, и почти в каждой статье упоминается нормальный метод оценки вложений, который является предсказанием ссылок.Но ни одна из этих статей не описала, как именно вы это делаете.Поэтому мой вопрос заключается в том, как оценить вложения с помощью предсказания ссылок?

Алгоритм, который я пытаюсь применить, заключается в следующем: сначала ориентированный граф строится на последовательностях щелчков пользователя, каждый узел в графе представляет элемент, и еслипользователь один раз щелкнул элемент 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 () и плохо в других метриках, некоторые наоборот .. и т.д.К сожалению, нет такой комбинации параметров, которая бы выполняла другие во всех трех метриках ... Вопрос в том, какую метрику мне использовать?

...