Прежде чем углубиться в поиски решения, я рекомендую хорошо понять ваши данные и потратить большую часть вашего времени на изучение проблемы и подготовку набора данных.
Так что из описанного вами сценария кажется, что мне ваша проблема , учитывая два узла и их атрибуты предсказывают, если есть ссылка , это может интерпретироваться как задача двоичной классификации. Я предоставлю первоначальное минималистичное c простое решение.
меня смутило то, что вы упомянули, что у вас есть только link_attributes.iloc[:5,:7]
link_attributes, но не атрибуты узла. В случае, если у вас есть атрибуты узла, это имеет больше смысла, потому что тогда мы просто создаем комбинации пар узлов и помечаем пары, которые не связаны как 0 or not_connected
, а те, которые связаны как 1 or connected
.
Итак, давайте сделаем набор данных. Поскольку я не совсем понимаю, что означают атрибуты ссылки, давайте сгенерируем случайные данные, но мы можем адаптировать лучший пример, если вы отредактируете свой вопрос с более подробной информацией о ваших данных.
О создании набора данных Для каждого узла в отображении мы создадим 10 фиктивных случайных столбцов только для демонстрации.
Затем мы создадим список всех авторов и соавторов с именем list_of_authors
и генерируем пары из этого вызова, pair_of_authors
.
для каждого pair of authors
мы пометим их как связанные или несвязанные, используя mapping
, для этого я создал функцию с именем check_if_pair_is_linked
.
После этого я покажу, как создать простое базовое решение для задачи. Мы будем использовать scikit-learn with большой список простых в использовании моделей для классификации.
Код
Я сложил код и описал его в 3 основных простых шага:
- подготовить ваши входные данные для создания набора данных (с использованием сопоставлений и атрибутов)
- создать набор данных (для каждой пары авторов, пометьте затем как связанные или нет и объедините их атрибуты)
- Используйте sci-kit, чтобы научиться подбирать, прогнозировать и оценивать модель
import itertools
import pandas as pd
import numpy as np
from sklearn.metrics import classification_report
from sklearn import svm
######## first preparing data to create a dataset
+-- 17 lines: ### we already have mappings {---------------------------------------------------------------------------------------------------
This part creates -----> mappings => {
0:[coauthor12,coauthor17231,...],
1:[...],
...,
732: [...]
}
i author_attributes => {
0:[a0_1,attr0_2,...,attr0_10],
1:[a1_1,attr1_2,...,attr1_10],
...,
732: [...]
}
#### Generating our Dataset and preparing dataset to the scikit-learn library(and most other) format
### The idea is generating pairs of authors regardless if they're linked or not and label if a pair is linked
+-- 24 lines: {--------------------------------------------------------------------------------------------------------------------------------
This part creates, a list of pairs of authors containing (attributes_of_both_authors, is_linked_label)
-----> dataset = [
([a0_1,...,a0_10,a1_1,...,a1_10],label_pair0_1)),
([a0_1,...,a0_10,a2_1,...,a2_10],label_pair1_2),
...
([a142_1,...,a142_10,a37_1,...,a37_10],label_pair142_37),
]
#### Training and evaluating a simple machine learning solution
+-- 12 lines: ---------------------------------------------------------------------------------------------------------------------------------This part outputs a report about the model after training the model with a training dataset and evaluate the model in a test dataset (I used the same train data and test data but dont ever do that in a real scenario)
-----> precision recall f1-score support
0 0.93 1.00 0.96 466
1 1.00 0.10 0.18 40
Решение :
import itertools
import pandas as pd
import numpy as np
from sklearn.metrics import classification_report
from sklearn import svm
######## first preparing data to create a dataset
#### we already have mappings
def generate_random_author_attributes(mapping):
author_attributes = {}
for author in mapping.keys():
author_attributes[author] = np.random.random(10).tolist()
for coauthors in mapping.values():
for coauthor in coauthors:
if author_attributes.get(coauthor, False):
pass # check if this coauthor was alredy added
else:
author_attributes[coauthor] = np.random.random(10).tolist()
return author_attributes
mapping = {
0: [2860, 3117],
1: [318, 1610, 1776, 1865, 2283, 2507, 3076, 3108, 3182, 3357, 3675, 4040],
2: [164, 413, 1448, 1650, 3119, 3238],
}
#### hopefully you have attributes like this, for each author you have some attributes, I created 10 random values for each for demonstrating
author_attributes = generate_random_author_attributes(mapping)
#### Generating our Dataset and preparing dataset to the scikit-learn library(and most other) format
### The idea is generating pairs of authors regardless if they're linked or not and label if a pair is linked
def check_if_pair_is_linked(pair_of_authors, mapping):
''' return 1 if linked, 0 if not linked'''
coauthors_of_author0 = mapping.get(pair_of_authors[0],[])
coauthors_of_author1 = mapping.get(pair_of_authors[1],[])
if(pair_of_authors[1] in coauthors_of_author0) or (pair_of_authors[0] in coauthors_of_author1):
return 1
else:
return 0
def create_dataset(author_attributes, mapping):
list_of_all_authors = list(itertools.chain.from_iterable([coauthors for coauthors in mapping.values()]))
list_of_all_authors.extend(mapping.keys())
dataset = []
for pair_of_authors in itertools.permutations(list_of_all_authors, 2):
pair_label = check_if_pair_is_linked(pair_of_authors, mapping)
pair_attributes = author_attributes[pair_of_authors[0]] + author_attributes[pair_of_authors[1]]
dataset.append((pair_attributes,pair_label))
return dataset
dataset=create_dataset(author_attributes, mapping)
X_train = [pair_attributes for pair_attributes,_ in dataset]
y_train = [pair_label for _,pair_label in dataset]
#### Training and evaluating a simple machine learning solution
binary_classifier = svm.SVC()
binary_classifier.fit(X_train, y_train)
#### Checking if the model is good
X_test = X_train # never use you train data as test data
y_test = y_train
true_pairs_label = y_test
predicted_pairs_label = binary_classifier.predict(X_test)
print(classification_report(true_pairs_label, predicted_pairs_label))
ВЫХОД
precision recall f1-score support
0 0.93 1.00 0.96 466
1 1.00 0.15 0.26 40
accuracy 0.93 506
macro avg 0.97 0.57 0.61 506
weighted avg 0.94 0.93 0.91 506