Linkprediction с использованием Hinsage / Graphsage возвращает NaN
Я пытаюсь выполнить прогнозирование ссылок с помощью HinSAGE в пакете python stellargraph.
У меня есть сеть людей и продуктов, с переходом от человека к человеку (ЗНАЕТ) и от человека к продукту (КУПИЛ). И людям, и продуктам был прикреплен вектор свойств, хотя и отличный от каждого типа (вектор людей - 1024, продукты - 200). Я пытаюсь создать алгоритм прогнозирования ссылок от человека к продукту на основе всей информации в сети. Причина, по которой я использую HinSAGE, - это возможность индуктивного обучения.
У меня есть код ниже, и я думал, что делаю его аналогично примерам
https://stellargraph.readthedocs.io/en/stable/demos/link-prediction/hinsage-link-prediction.html https://stellargraph.readthedocs.io/en/stable/demos/link-prediction/graphsage-link -prediction.html
но я продолжаю получать "nan" в качестве моих прогнозов на выходе, у кого-нибудь есть предложение, что я могу попробовать?
import networkx as nx
import pandas as pd
import numpy as np
from tensorflow.keras import Model, optimizers, losses, metrics
import stellargraph as sg
from stellargraph.data import EdgeSplitter
from stellargraph.mapper import HinSAGELinkGenerator
from stellargraph.layer import HinSAGE, link_classification, link_regression
from sklearn.model_selection import train_test_split
graph.info()
#StellarGraph: Undirected multigraph
# Nodes: 54226, Edges: 259120
#
# Node types:
# products: [45027]
# Features: float32 vector, length 200
# Edge types: products-BOUGHT->person
# person: [9199]
# Features: float32 vector, length 1024
# Edge types: person-KNOWS->person, person-BOUGHT->product
#
# Edge types:
# person-KNOWS->person: [246131]
# Weights: all 1 (default)
# Features: none
# person-BOUGHT->product: [12989]
# Weights: all 1 (default)
# Features: none
import networkx as nx
import pandas as pd
import numpy as np
import os
import random
from tensorflow.keras import Model, optimizers, losses, metrics
import stellargraph as sg
from stellargraph.data import EdgeSplitter
from stellargraph.mapper import HinSAGELinkGenerator
from stellargraph.layer import HinSAGE, link_classification
from stellargraph.data import UniformRandomWalk
from stellargraph.data import UnsupervisedSampler
from sklearn.model_selection import train_test_split
from stellargraph.layer import HinSAGE, link_regression
edge_splitter_test = EdgeSplitter(graph)
graph_test, edges_test, labels_test = edge_splitter_test.train_test_split(
p=0.1, method="global", edge_label="BOUGHT"
)
edge_splitter_train = EdgeSplitter(graph_test, graph)
graph_train, edges_train, labels_train = edge_splitter_train.train_test_split(
p=0.1, method="global", edge_label="BOUGHT"
)
num_samples = [8, 4]
G = graph
batch_size = 20
epochs = 20
generator = HinSAGELinkGenerator(
G, batch_size, num_samples, head_node_types=["person", "product"]
)
train_gen = generator.flow(edges_train, labels_train, shuffle=True)
test_gen = generator.flow(edges_test, labels_test)
hinsage_layer_sizes = [32, 32]
assert len(hinsage_layer_sizes) == len(num_samples)
hinsage = HinSAGE(
layer_sizes=hinsage_layer_sizes, generator=generator, bias=True, dropout=0.0
)
# Expose input and output sockets of hinsage:
x_inp, x_out = hinsage.in_out_tensors()
# Final estimator layer
prediction = link_classification(
output_dim=1, output_act="sigmoid", edge_embedding_method="concat"
)(x_out)
model = Model(inputs=x_inp, outputs=prediction)
model.compile(
optimizer=optimizers.Adam(),
loss=losses.binary_crossentropy,
metrics=["acc"],
)
history = model.fit(train_gen, epochs=epochs, validation_data=test_gen, verbose=2)
1 ответ
Итак, я нашел проблему, может быть полезно другим. Если есть какой-либо узел, содержащий недостающие данные, он просто создаст NA. Особенно опасно, если вы создаете свой график, объединяя фреймы данных pandas, у меня была опечатка в одном файле, который был интегрирован и привел к проблеме.