Ръководство за прогнозиране на връзки - Как да предвидите бъдещите си връзки във Facebook

Преглед

  • Въведение за свързване на прогнозите, как работи и къде можете да го използвате в реалния свят
  • Научете за значението на Link Prediction в социалните медии
  • Изградете първия си модел за прогнозиране на линкове за случай на използване във Facebook, използвайки Python

Въведение

Чудили ли сте се някога коя може да е следващата ви връзка във Facebook? Любопитно от кого може да дойде следващото искане?

Ами ако ви кажа, че има начин да предскажете това?

Обичам мозъчната атака и измислям тези твърдения за проблеми, когато разглеждам акаунта си във Facebook. Това е един от предимствата да имаш мислене на учен с данни!

Повечето платформи за социални медии, включително Facebook, могат да бъдат структурирани като графики. Регистрираните потребители са свързани помежду си във вселена от мрежи. И за да работим по тези мрежи и графики, се нуждаем от различен набор от подходи, инструменти и алгоритми (вместо традиционните методи за машинно обучение).

Така че в тази статия ще решим проблем в социалната мрежа с помощта на графики и машинно обучение. Първо ще разберем основните концепции и компоненти на прогнозирането на връзки, преди да се заемем с казус във Facebook и да го приложим в Python!

Препоръчвам ви да разгледате по-долу статиите, за да разгледате какво представляват графиките и как работят:

Съдържание

  1. Преглед на анализите в социалните мрежи
  2. Праймер за прогнозиране на връзката
  3. Стратегия за решаване на проблем за прогнозиране на връзката
  4. Пример: Прогнозиране на бъдещите връзки между страниците във Facebook - Разбиране на данните - Изграждане на модел за подготовка на данни - Извличане на функции - Изграждане на модел: Модел за прогнозиране на връзки

Преглед на анализите в социалните мрежи

Нека първо да определим социална мрежа, преди да се потопим в концепцията за прогнозиране на връзки.

Социалната мрежа по същество представлява представителство на взаимоотношенията между социални субекти, като хора, организации, правителства, политически партии и т.н.

Взаимодействията между тези образувания генерират невъобразими количества данни под формата на публикации, съобщения в чат, туитове, харесвания, коментари, споделяния и др. Това отваря прозорец с възможности и случаи, по които можем да работим.

Това ни отвежда към Анализ на социалната мрежа (SNA). Можем да го определим като комбинация от няколко дейности, които се извършват в социалните медии. Тези дейности включват събиране на данни от онлайн сайтове за социални медии и използване на тези данни за вземане на бизнес решения.

Ползите от анализа на социалните мрежи могат да бъдат изключително полезни. Ето няколко основни предимства:

  • Помага да разберете по-добре аудиторията си
  • Използва се за сегментиране на клиенти
  • Използва се за проектиране на препоръчителни системи
  • Разкрийте фалшиви новини, наред с други неща

Праймер за прогнозиране на връзката

Предсказването на връзки е една от най-важните изследователски теми в областта на графиките и мрежите. Целта на прогнозирането на връзката е да се идентифицират двойки възли, които или ще образуват връзка, или не в бъдеще.

Прогнозата за връзки има много приложения в реални приложения. Ето някои от важните случаи на използване на прогнозата за връзки:

  • Предскажете кои клиенти вероятно ще купуват какви продукти на онлайн пазари като Amazon. Той може да помогне за по-добри препоръки за продукти
  • Предложете взаимодействие или сътрудничество между служителите в дадена организация
  • Извличане на жизненоважна информация от терористични мрежи

В тази статия ще изследваме малко по-различен случай на използване на прогнозирането на връзки - предвиждане на връзки в онлайн социална мрежа!

Стратегия за решаване на проблем за прогнозиране на връзката

Ако можем по някакъв начин да представим графика под формата на структуриран набор данни, който има набор от функции, тогава може би можем да използваме машинно обучение, за да прогнозираме образуването на връзки между несвързаните двойки възли на графиката.

Нека вземем фиктивна графика, за да разберем тази идея. По-долу е показана 7-та възлова графика и несвързаните двойки възли са AF, BD, BE, BG и EG:

Графика по време t

Да речем, че анализираме данните и излязохме с графиката по-долу. Оформени са няколко нови връзки (връзки в червено):

Графика във време t + n

Трябва да имаме набор от променливи за прогноза и целева променлива, за да изградим всякакъв вид модел на машинно обучение, нали? И така, къде са тези променливи? Е, можем да го вземем от самата графика! Да видим как се прави.

Нашата цел е да предвидим дали би имало връзка между 2 несвързани възли. От мрежата в момент t можем да извлечем следните двойки възли, които нямат връзка между тях:

  1. AF
  2. BD
  3. БЪДА
  4. БГ
  5. EG

Моля, обърнете внимание, че за удобство разгледах само тези възли, които са няколко връзки един от друг.

Следващата стъпка за нас е да създадем функции за всяка двойка възли. Добрата новина е, че има няколко техники за извличане на функции от възлите в мрежа. Да речем, че използваме една от тези техники и изграждаме функции за всяка от тези двойки. Все още обаче не знаем каква е целевата променлива. Няма за какво да се притесняваме - лесно можем да се сдобием и с това.

Погледнете графиката във време t + n. Можем да видим, че има три нови връзки в мрежата за двойките съответно AF, BD и BE. Следователно ние ще присвоим на всеки един от тях стойност 1. На двойките възли BG и EG ще бъдат присвоени 0, защото все още няма връзки между възлите.

Следователно данните ще изглеждат така:

Сега, когато имаме целевата променлива, можем да изградим модел на машинно обучение с помощта на тези данни за извършване на прогнозиране на връзки.

И така, ето как трябва да използваме социални графики в два различни инстанции от време, за да извлечем целевата променлива, т.е. наличието на връзка между двойка възел. Имайте предвид обаче, че в реални сценарии ще разполагаме само с данни за сегашното време.

Извадете данни от графика за изграждане на вашия модел

В горния раздел успяхме да получим етикети за целевата променлива, тъй като имахме достъп до графиката по време t + n. Въпреки това, в реални сценарии, ние ще имаме само един графичен набор от данни в ръка. Това е!

Да речем, че имаме графиката по-долу на социална мрежа, където възлите са потребителите, а краищата представляват някакъв вид връзка:

Кандидатните двойки възли, които могат да образуват връзка в бъдеще, са (1 и 2), (2 и 4), (5 и 6), (8 и 10) и т.н. Трябва да изградим модел, който ще предвиди дали би имало връзка между тези двойки възли или не. За това се прави прогноза за връзки!

За да изградим модел за прогнозиране на връзката обаче, трябва да подготвим набор от данни за обучение от тази графика. Може да се направи с помощта на прост трик.

Представете си това - как би изглеждала тази графика в някакъв момент в миналото? Между възлите ще има по-малко ръбове, защото връзките в социална мрежа се изграждат постепенно с течение на времето.

Следователно, имайки това предвид, можем да скрием произволно някои от ръбовете от дадената графика и след това да следваме същата техника, както е обяснено в предишния раздел, за да създадем тренировъчния набор от данни.

Зачеркнете връзките от графиката

Докато премахваме връзки или ръбове, трябва да избягваме премахването на ръба, който може да създаде изолиран възел (възел без ръб) или изолирана мрежа. Нека свалим някои от краищата от нашата мрежа:

Както можете да видите, ръбовете в двойките възли (1 и 4), (7 и 9) и (3 и 8) са премахнати.

Добавете етикети към извлечени данни

След това трябва да създадем функции за всички несвързани двойки възли, включително тези, за които сме пропуснали ръбовете. Отстранените ръбове ще бъдат маркирани като '1', а несвързаните двойки възли като '0'.

Целевата променлива ще бъде силно дисбалансирана в този набор от данни. Това е, което ще срещнете и в реални графики. Броят на несвързаните двойки възли би бил огромен.

Нека да се заемем с казус и да решим проблема с предсказването на връзката с помощта на Python.

Пример: Прогнозирайте бъдещи връзки между Facebook страници

Тук ще приложим всичко по-горе в страхотен сценарий от реалния свят.

Ще работим с графичен набор от данни, в който възлите са Facebook страници на популярни фуги за храна и добре известни готвачи от цял ​​свят. Ако някакви две страници (възли) се харесват помежду си, тогава има ръб (връзка) между тях.

Можете да изтеглите набора от данни от тук.

Цел: Изградете модел за прогнозиране на връзки, за да предвидите бъдещи връзки (взаимни харесвания) между несвързани възли (Facebook страници).

Нека да запалим нашата тетрадка на Юпитер (или колаб)!

Разбиране на данните

Първо ще импортираме всички необходими библиотеки и модули:

Нека да заредим Facebook страниците като възли и взаимни харесвания между страниците като ръбове:

Изход: (620, 2102)

Имаме 620 възли и 2,102 връзки. Нека сега създадем рамка от данни за всички възли. Всеки ред от тази рамка от данни представлява връзка, образувана от възлите в колоните съответно „node_1“ и „node_2“:

fb_df.head ()

Възлите '276', '58', '132', '603' и '398' образуват връзки с възела '0'. Лесно можем да представим тази подредба на Facebook страниците под формата на графика:

Леле, това изглежда доста. С това ще се занимаваме - телена мрежа от страници във Facebook (сини точки). Черните линии са връзките или ръбовете, свързващи всички възли един с друг.

Подготовка на набор от данни за изграждане на модели

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

Извличане на несвързани двойки възли - отрицателни проби

Вече разбрахме, че за да разрешим проблема с прогнозиране на връзката, трябва да подготвим набор от данни от дадената графика. Основна част от този набор от данни са отрицателните проби или несвързаните двойки възли. В този раздел ще ви покажа как можем да извлечем несвързаните двойки възли от графика.

Първо, ние ще създадем матрица на прилежане, за да открием кои двойки възли не са свързани.

Например, съседността на графиката по-долу е квадратна матрица, в която редовете и колоните са представени от възлите на графиката:

Връзките се означават със стойностите в матрицата. 1 означава, че има връзка между двойката на възела и 0 означава, че има връзка между двойката на възела. Например, възлите 1 и 3 имат 0 в кръстовището си в матрицата и тези възли също нямат ръб в горната графика.

Ние ще използваме това свойство на матрицата на прилежащата среда, за да намерим всички несвързани двойки възли от оригиналната графика G:

Нека да разгледаме формата на матрицата на прилежащите:

adj_G.shape

Изход: (620, 620)

Както можете да видите, това е квадратна матрица. Сега ще прекосим матрицата на съседство, за да намерим позициите на нулите. Моля, обърнете внимание, че не е необходимо да преминаваме през цялата матрица. Стойностите в матрицата са същите над и под диагонала, както можете да видите по-долу:

Можем да търсим чрез стойностите над диагонала (зелена част) или стойностите по-долу (червена част). Нека търсим диагоналните стойности за нула:

Ето колко несвързани двойки възли имаме в нашия набор от данни:

LEN (all_unconnected_pairs)

Изход: 19,018

Имаме 19 018 несвързани двойки. Тези двойки възли ще действат като отрицателни проби по време на обучението на модела за прогнозиране на връзката. Нека да запазим тези двойки в рамка от данни:

Премахване на връзки от свързани двойки възли - положителни проби

Както обсъдихме по-горе, на случаен принцип ще изпуснем някои от краищата от графиката. Въпреки това, произволното премахване на ръбовете може да доведе до отрязване на слабо свързани възли и фрагменти от графиката. Това е нещо, за което трябва да се погрижим. Трябва да сме сигурни, че в процеса на изпускане на ръбовете всички възли на графиката трябва да останат свързани.

В блока с кодове по-долу първо ще проверим дали пускането на една двойка възел води до разделяне на графиката (число_свързани_компоненти> 1) или намаляване на броя на възлите. Ако и двете неща не се случват, ние изпускаме тази двойка възел и повтаряме същия процес със следващата двойка възел.

В крайна сметка ще получим списък от двойки възли, които могат да бъдат изпуснати от графиката и всички възли все още ще останат непокътнати:

дъл (omissible_links_index)

Изход: 1483

Имаме над 1400 връзки, които можем да изпуснем от графиката. Тези отпуснати ръбове ще действат като положителни примери за обучение по време на обучението на модела за прогнозиране на връзката.

Данни за обучението по модели

След това ще добавим тези подвижни ръбове към рамката от данни на несвързани двойки възли. Тъй като тези нови ръбове са положителни проби, те ще имат целева стойност „1“:

Нека проверим разпределението на стойностите на целевата променлива:

[данни "връзка"]. value_counts ()

0 -19018 1 -1483

Оказва се, че това са силно небалансирани данни. Съотношението между връзка и без връзка е близо 8%. В следващия раздел ще извлечем функции за всички тези двойки възли.

Извличане на функции

Ще използваме алгоритъма node2vec за извличане на функции на възел от графиката след пускане на връзките. И така, нека първо създадем нова графика, след като пуснем сменяемите връзки:

След това ще инсталираме библиотеката node2vec. Доста прилича на алгоритъма DeepWalk. Това обаче включва предубедени случайни разходки. За да знаете повече за node2vec, определено трябва да разгледате тази книга node2vec: Мащабируемо обучение за функции за мрежи.

Засега само имайте предвид, че node2vec се използва за векторно представяне на възли на графика. Нека го инсталираме:

! pip инсталирайте node2vec

Инсталирането на вашата локална машина може да отнеме известно време (доста бързо е, ако използвате Colab).

Сега ще обучим модела node2vec на нашата графика (G_data):

След това ще приложим обучения модел node2vec на всяка една възлова двойка в рамката от данни "данни". За да изчислим характеристиките на чифт или ръб, ще добавим характеристиките на възлите в тази двойка:

x = [(n2w_model [str (i)] + n2w_model [str (j)]) за i, j in zip (data ['node_1'], data ['node_2'])]

Изграждане на нашия модел за прогнозиране на връзката

За да потвърдим ефективността на нашия модел, трябва да разделим данните си на две части - едната за обучение на модела, а другата за тестване на работата на модела:

Нека първо поставим логистичен регресионен модел:

Сега ще направим прогнози за тестовия набор:

прогнози = lr.predict_proba (xtest)

Ще използваме оценката AUC-ROC, за да проверим ефективността на нашия модел.

roc_auc_score (ytest, прогнози [:, 1])

Изход: 0.7817

Получаваме резултат 0,78, използвайки логистичен регресионен модел. Нека да видим дали можем да получим по-добър резултат, като използваме по-сложен модел.

Обучението спря след 208-та итерация, защото приложихме критериите за ранно спиране. Най-важното е, че моделът получи впечатляващ 0.9273 AUC резултат на тестовия комплект. Съветвам ви да разгледате документацията на lightGBM, за да научите повече за различните параметри.

Крайни бележки

Има огромен потенциал в графиките. Можем да използваме това за решаване на голям брой проблеми в реалния свят, от които прогнозирането на връзката е едно.

В тази статия сме показали как може да се реши проблемът с прогнозирането на връзката с машинно обучение и какви са ограниченията и важните аспекти, които трябва да имаме предвид, докато решаваме такъв проблем.

Моля, не се колебайте да задавате въпроси или да оставите отзивите си в секцията за коментари по-долу. Продължете да изследвате!

Първоначално публикуван на https://www.analyticsvidhya.com на 16 януари 2020 г.