Разделение тестовых наборов поездов для прогнозирования ссылок Node2vec в Stellargraph

Я пытаюсь понять, как использовать класс EdgeSplitter Stellargraph. В частности, примеры на документация по обучению модели предсказания ссылок на основе Node2Vec разбивает граф на следующие части:

Распределение сэмплов по наборам train, val и test

Следуя примерам в документации , сначала вы выбираете 10% ссылок полного графа, чтобы получить тестовый набор:

# Define an edge splitter on the original graph:
edge_splitter_test = EdgeSplitter(graph)

# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from graph, and obtain the
# reduced graph graph_test with the sampled links removed:
graph_test, examples_test, labels_test = edge_splitter_test.train_test_split(
    p=0.1, method="global"
)

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

# Do the same process to compute a training subset from within the test graph
edge_splitter_train = EdgeSplitter(graph_test)
graph_train, examples, labels = edge_splitter_train.train_test_split(
    p=0.1, method="global"
)

Следуя предыдущей логике, graph_train соответствует graph_test с удаленными обучающими ссылками.

Насколько я понимаю, дальше по коду мы используем graph_train для обучения внедрению и обучающим образцам (примеры, метки) для обучения классификатора. Итак, у меня есть несколько вопросов здесь:

  • Почему мы используем непересекающиеся наборы обучающих данных для обучения разных частей модели? Разве мы не должны обучать и встраивание, и классификатор с полным обучающим набором ссылок?
  • Почему набор тестов такой большой? Не лучше ли иметь большинство образцов в обучающем наборе?
  • Как правильно использовать класс EdgeSplitter?

Заранее спасибо за вашу помощь!


person Jaime Oliver Huidobro    schedule 27.08.2020    source источник


Ответы (1)


Почему непересекающиеся множества: это может иметь значение, а может и не иметь, в зависимости от алгоритма встраивания. Риск с ребрами, которые и алгоритм встраивания, и классификатор видят как цели, заключается в том, что алгоритм встраивания может кодировать необобщаемые признаки.

Например, теоретически одной функцией встраивания может быть идентификатор узла, а затем у вас могут быть другие функции, кодирующие всю окрестность узла. Таким образом, при странном объединении встраивания двух узлов в вектор связи или при использовании многослойной модели можно создать двоичную функцию, которая равна 1, если два узла соединены во время обучения встраиванию, и 0 в противном случае. В этом случае классификатор, возможно, просто научится использовать эту тривиальную функцию, которой нет (т.е. имеет значение 0), когда вы переходите к тестовым данным.

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

Почему тестовый набор такой большой. Вы, скорее всего, получите более высокий балл с большим набором поездов. Пока эксперимент повторяется с разными разбиениями и дисперсия находится под контролем, можно увеличить размер поезда.

Как правильно использовать EdgeSplitter: я не знаю, что здесь означает "правильно". Я думаю, что разделение графов все еще является активной областью исследований.

person Jacob Sznajdman    schedule 21.12.2020