Juhend ennustamise linkimiseks - kuidas ennustada oma tulevikuühendusi Facebookis

Ülevaade

  • Sissejuhatus ennustamise linkimiseks, kuidas see töötab ja kus seda reaalajas kasutada saab
  • Siit saate teada linkide ennustamise tähtsuse kohta sotsiaalmeedias
  • Ehitage Pythoni abil oma esimene Linki ennustamise mudel Facebooki kasutusjuhtumiks

Sissejuhatus

Kas olete kunagi mõelnud, kes võiks olla teie järgmine Facebooki-ühendus? Kas olete huvitatud järgmisest taotlusest?

Mis siis, kui ma ütleksin, et on olemas viis seda ennustada?

Armastan ajurünnakuid ja nende probleemilahenduste tulekut, kui sirvin oma Facebooki kontot. See on üks andmeteadlase mõtteviisi omajagu!

Enamikku sotsiaalmeediaplatvorme, sealhulgas Facebooki, saab struktureerida graafikutena. Registreeritud kasutajad on ühendatud võrkude universumis. Ja nende võrkude ja graafikutega töötamiseks vajame teistsuguseid lähenemisviise, tööriistu ja algoritme (traditsiooniliste masinõppemeetodite asemel).

Nii et selles artiklis lahendame sotsiaalsete võrgustike probleemi graafikute ja masinõppe abil. Enne Facebooki juhtumiuuringu alustamist ja selle Pythonis rakendamist mõistame kõigepealt lingi ennustamise põhimõisteid ja komponente!

Soovitan läbida järgmised artiklid, et saada ülevaade sellest, mis graafikud on ja kuidas need töötavad:

Sisukord

  1. Ülevaade sotsiaalse võrgustiku analüüsist
  2. Krundi linkide ennustamisel
  3. Lingi ennustamisprobleemi lahendamise strateegia
  4. Juhtumianalüüs: ennustage Facebooki lehtede edaspidiseid seoseid - andmete mõistmine - andmestiku ettevalmistamise mudeli ehitamine - funktsioonide eraldamine - mudeli koostamine: lingi ennustusmudel

Ülevaade sotsiaalse võrgustiku analüüsist

Määratleme kõigepealt sotsiaalse võrgustiku, enne kui sukelduda lingi ennustamise kontseptsiooni.

Suhtlusvõrgustik kujutab endast sisuliselt sotsiaalsete üksuste, näiteks inimeste, organisatsioonide, valitsuste, poliitiliste parteide jne suhete esindamist.

Nende üksuste omavaheline suhtlus loob kujuteldamatu hulga andmeid postituste, vestlussõnumite, säutsude, meeldimiste, kommentaaride, jagamiste jne kujul. See avab võimaluste ja kasutamise juhtumite, kus saame töötada.

See viib meid sotsiaalse võrgustiku analüüsi (SNA) juurde. Me võime seda määratleda kui mitme tegevuse kombinatsiooni, mida teostatakse sotsiaalmeedias. Need tegevused hõlmavad andmete kogumist veebipõhistest sotsiaalmeedia saitidelt ja nende andmete kasutamist äriotsuste tegemiseks.

Suhtlusvõrgustike analüüsi eelised võivad olla väga rahuldust pakkuvad. Siin on mõned peamised eelised:

  • Aitab teil oma publikut paremini mõista
  • Kasutatakse klientide segmenteerimiseks
  • Kasutatakse soovituslike süsteemide kujundamisel
  • Avastage muu hulgas võltsuudiseid

Krundi linkide ennustamisel

Lingi ennustamine on üks olulisemaid uurimisteemasid graafikute ja võrkude valdkonnas. Lingi ennustamise eesmärk on tuvastada sõlmepaarid, mis moodustavad kas lingi või mitte.

Lingi ennustamisel on reaalainete rakendustes palju kasutusvõimalusi. Siin on mõned olulised lingi ennustamise kasutusjuhud:

  • Ennustage, millised kliendid ostavad tõenäoliselt selliseid tooteid veebiturgudel nagu Amazon. See võib aidata paremate tootesoovituste andmisel
  • Soovitage organisatsiooni töötajate vahelist suhtlust või koostööd
  • Tehke terroristide võrgustikest elutähtis teave

Selles artiklis uurime linkide ennustamise pisut erinevat kasutusjuhtu - linkide ennustamist veebipõhises sotsiaalses võrgustikus!

Lingi ennustamisprobleemi lahendamise strateegia

Kui suudame graafikut kuidagi kujutada struktureeritud andmestiku kujul, millel on omaduste komplekt, siis võib-olla saame kasutada masinõpet, et ennustada linkide teket graafi ühendamata sõlmepaaride vahel.

Võtame selle idee mõistmiseks näiva graafiku. Allpool on esitatud 7-sõlmeline graaf ja ühendamata sõlmpaarid on AF, BD, BE, BG ja EG:

Graafik ajal t

Oletame nüüd, et analüüsime andmeid ja tulime välja allolev graafik. Loodud on mõned uued ühendused (lingid punasega):

Graafik ajahetkel t + n

Mis tahes masinõppe mudeli ehitamiseks peab meil olema ennustajate ja sihtmuutujate komplekt, eks? Kus need muutujad on? Noh, me saame selle ise graafikult! Vaatame, kuidas seda tehakse.

Meie eesmärk on ennustada, kas suvalise 2 ühendamata sõlme vahel oleks seos. Ajal t saadavast võrgust saame välja võtta järgmised sõlmepaarid, millel pole nende vahel sidemeid:

  1. AF
  2. BD
  3. BE
  4. BG
  5. EG

Pange tähele, et mugavuse huvides olen kaalunud ainult neid sõlme, mis paiknevad paarist lingist eraldi.

Järgmine samm on meie jaoks funktsioonide loomine iga sõlmepaari jaoks. Hea uudis on see, et funktsioonide eraldamiseks võrgu sõlmedest on mitu tehnikat. Oletame, et kasutame ühte neist tehnikast ja ehitame kõigi nende paaride jaoks funktsioone. Kuid me ei tea endiselt, mis on sihtmuutuja. Pole vaja muretseda - seda on meil ka lihtne hankida.

Vaadake graafikut ajahetkel t + n. Näeme, et võrgus on kolm uut lüli vastavalt paaride AF, BD ja BE jaoks. Seetõttu omistame igaühele neist väärtuse 1. Sõlmepaaridele BG ja EG omistatakse 0, kuna sõlmede vahel pole endiselt seoseid.

Seega näevad andmed välja järgmised:

Nüüd, kui meil on sihtmuutuja, saame ehitada masinõppe mudeli, kasutades neid andmeid lingi ennustamise teostamiseks.

Nii peame sihtmuutuja eraldamiseks, st sõlmepaari vahelise lingi olemasolu, kasutama kahel erineval ajahetkel sotsiaalseid graafikuid. Pidage siiski meeles, et reaalse stsenaariumi korral on meil ainult praeguse aja andmed.

Andmete väljavõtmine oma mudeli loomise graafikust

Ülaltoodud jaotises suutsime hankida sihtmuutujale silte, kuna meil oli graafikule juurdepääs ajal t + n. Reaalse stsenaariumi korral oleks meil aga käes vaid üks graafiku andmestik. Ongi!

Oletame, et meil on allpool sotsiaalvõrgustiku graafik, kus sõlmed on kasutajad ja servad tähistavad mingisugust suhet:

Kandidaadisõlmede paarid, mis võivad tulevikus lingi moodustada, on (1 ja 2), (2 ja 4), (5 ja 6), (8 ja 10) jne. Peame üles ehitama mudeli, mis ennustab, kas nende sõlmepaaride vahel oleks seos või mitte. Just see on lingi ennustamine!

Lingi ennustamise mudeli ehitamiseks peame sellest graafikust ette valmistama treeningu andmestiku. Seda saab teha lihtsa triki abil.

Pilt sellest - kuidas see graafik mingil hetkel minevikust välja näeks? Sõlmede vahel oleks vähem servi, kuna suhtlusvõrgus luuakse ühendused aja jooksul järk-järgult.

Seega, pidades seda meeles, võime mõned graafikud servad juhuslikult peita antud graafikult ja järgida treeningute andmekogumi loomiseks sama tehnikat, mida selgitati eelmises jaotises.

Kustutage lingid graafikult

Lingide või servade eemaldamisel peaksime vältima servade eemaldamist, mis võivad tekitada isoleeritud sõlme (sõlme ilma servata) või isoleeritud võrgu. Võtame ära mõned servad meie võrgustikust:

Nagu näete, on sõlmepaaride (1 ja 4), (7 ja 9) ning (3 ja 8) servad eemaldatud.

Lisage eraldatud andmetele sildid

Järgmisena peaksime looma funktsioonid kõigile ühendamata sõlmepaaridele, sealhulgas ka nendele, mille servad oleme ära jätnud. Eemaldatud servad tähistatakse numbriga 1 ja ühendamata sõlmepaarid tähisega "0".

Sihtmuutuja on selles andmekogumis väga tasakaalustamata. Seda kohtate ka reaalainete graafikutes. Ühendamata sõlmede paaride arv oleks tohutu.

Alustame juhtumianalüüsi ja lahendame lüli ennustamise probleemi Pythoni abil.

Juhtumianalüüs: Ennustage Facebooki lehtede edaspidiseid seoseid

Siin rakendame kõik eelnimetatu vinge reaalse stsenaariumi jaoks.

Töötame graafikute andmestikuga, milles sõlmed on populaarsete toidukomplekside Facebooki lehed ja kogu maailmas tuntud kokad. Kui kaks lehte (sõlme) meeldivad üksteisele, siis on nende vahel serv (link).

Andmekogumi saate alla laadida siit.

Eesmärk: luua linkide ennustamise mudel tulevaste linkide (vastastikuste meeldimiste) ennustamiseks ühendamata sõlmede vahel (Facebooki lehed).

Süütame oma Jupyteri sülearvuti (või Colabi)!

Andmetest aru saamine

Esmalt impordime kõik vajalikud raamatukogud ja moodulid:

Laadime Facebooki lehed sõlmedeks ja vastastikused meeldimised lehtede vahel servadena:

Väljund: (620, 2102)

Meil on 620 sõlme ja 2 102 linki. Loome nüüd kõigi sõlmede andmeraami. Selle andmekaadri iga rida tähistab linki, mille sõlmed moodustavad vastavalt veerus „node_1” ja „node_2”:

fb_df.head ()

Sõlmed '276', '58', '132', '603' ja '398' moodustavad lüli sõlmega '0'. Seda Facebooki lehtede paigutust saame graafiku kujul hõlpsalt kirjeldada:

Vau, see näeb üsna midagi välja. Sellega me tegeleme - Facebooki lehtede traatvõrk (sinised punktid). Mustad jooned on lingid või servad, mis ühendavad kõik sõlmed üksteisega.

Andmekogu ettevalmistamine mudeli koostamiseks

Andmekogu peame ette valmistama suunamata graafi järgi. Sellel andmestikul on sõlmepaaride tunnused ja sihtmuutuja oleks oma olemuselt binaarne, osutades linkide olemasolule (või mitte).

Tooge lahti ühendamata sõlmepaarid - negatiivsed proovid

Oleme juba aru saanud, et lingi ennustamise probleemi lahendamiseks peame etteantud graafikust valmistama andmekogumi. Selle andmestiku suurema osa moodustavad negatiivsed valimid või ühendamata sõlmepaarid. Selles jaotises näitan teile, kuidas saame graafist lahti ühendamata sõlmepaare.

Esiteks loome külgnevusmaatriksi, et leida, millised sõlmede paarid pole ühendatud.

Näiteks on allpool oleva graafiku külgnevus ruudukujuline maatriks, milles read ja veerud on tähistatud graafi sõlmedega:

Lingid tähistatakse maatriksi väärtustega. 1 tähendab, et sõlmepaari vahel on link ja 0 tähendab, et sõlmepaari vahel on link. Näiteks sõlmedel 1 ja 3 on maatriksis ristmikul 0 ja ka nendel sõlmedel puudub ülaltoodud graafikul serv.

Kasutame seda külgnevusmaatriksi omadust, et leida algse graafi G alt kõik ühendamata sõlmepaarid:

Vaatame lähipiirkonna maatriksi kuju:

adj_G.kuju

Väljund: (620, 620)

Nagu näete, on see ruudukujuline maatriks. Nüüd läbime nulli asukohtade leidmiseks naabermaatriksi. Pange tähele, et me ei pea läbima kogu maatriksit. Maatriksi väärtused on samad diagonaali kohal ja all, nagu näete allpool:

Saame otsida diagonaali kohal (roheline osa) või allpool asuvaid väärtusi (punane osa). Otsime nullide diagonaalväärtused:

Siit leiate, kui palju ühendamata sõlmepaare meil andmestikus on:

len (kõik_seotud_paigad)

Väljund: 19 018

Meil on 19 018 ühendamata paari. Need sõlmepaarid toimivad lingi ennustusmudeli treenimise ajal negatiivsete proovidena. Hoidkem neid paare andmekaadris:

Eemaldage lingid ühendatud sõlmepaaridelt - positiivsed proovid

Nagu eespool arutasime, kukutame mõned servad graafikult juhuslikult. Servade juhuslik eemaldamine võib aga lõdvalt ühendatud sõlmed ja graafi fragmendid ära lõigata. Selle eest peame hoolitsema. Peame veenduma, et servade langemise protsessis peaksid kõik graafi sõlmed olema ühendatud.

Allpool asuvas koodiplokis kontrollime kõigepealt, kas sõlmepaari mahalangemine põhjustab graafiku lõhenemise (arv_ ühendatud_komponente> 1) või sõlmede arvu vähenemine. Kui mõlemat asja ei juhtu, siis kukutame selle sõlmepaari ja korrake sama protsessi järgmise sõlmepaariga.

Lõpuks saame nimekirja sõlmepaaridest, mida saab graafikult maha visata ja kõik sõlmed jäävad ikkagi puutumata:

len (omissible_links_index)

Väljund: 1483

Meil on üle 1400 lingi, mille saame graafikult maha tõmmata. Need mahalangenud servad toimivad positiivsete treenimisnäidetena lüli ennustamise mudeli koolituse ajal.

Andmed mudelikoolituse jaoks

Järgmisena lisame need eemaldatavad servad ühendamata sõlmepaaride andmeraami. Kuna need uued servad on positiivsed proovid, on nende sihtväärtus 1:

Kontrollime sihtmuutuja väärtuste jaotust:

andmed ['link']. väärtus_arvud ()

0 -19018 1 -1483

Selgub, et tegemist on väga tasakaalustamata andmetega. Lingi ja ilma lingi suhe on lihtsalt 8% lähedal. Järgmises jaotises ekstraheerime kõigi nende sõlmepaaride funktsioonid.

Funktsioonide ekstraheerimine

Pärast linkide kukutamist eraldame graafikust sõlmefunktsioonid kaevandamiseks algoritmi node2vec. Niisiis, loome kõigepealt uue graafiku pärast eemaldatavate linkide kukutamist:

Järgmisena installime sõlme2vec teeki. See on üsna sarnane DeepWalki algoritmiga. See hõlmab siiski kallutatud juhuslikke jalutuskäike. Node2vec kohta lisateabe saamiseks peaksite kindlasti tutvuma selle paberiga node2vec: Scalable Feature Learning for Networks.

Praegu pidage meeles, et node2vec kasutatakse graafi sõlmede vektorkujul. Installime selle:

! pip install node2vec

Kohalikku masinasse installimine võib võtta natuke aega (see on üsna kiire, kui kasutate Colabi).

Nüüd koolitame node2vec mudeli oma graafikul (G_data):

Järgmisena rakendame koolitatud node2vec mudelit andmekaadri andmetes iga sõlmepaari jaoks. Paari või serva omaduste arvutamiseks liidame selle paari sõlmede omadused kokku:

x = [(n2w_model [str (i)] + n2w_model [str (j)]) jaoks i, j zip-is (andmed ['node_1'], andmed ['node_2'])]

Meie linkide ennustamise mudeli ehitamine

Meie mudeli toimivuse kinnitamiseks peaksime oma andmed jagama kaheks osaks - ühe mudeli treenimiseks ja teise mudeli toimivuse testimiseks:

Sobigem kõigepealt logistiline regressioonimudel:

Ennustame nüüd testkomplekti:

ennustused = lr.predict_proba (xtest)

Oma mudeli toimivuse kontrollimiseks kasutame AUC-ROC skoori.

roc_auc_score (ytest, ennustused [:, 1])

Väljund: 0,7817

Logistliku regressioonimudeli abil saame tulemuse 0,78. Vaatame, kas keerukama mudeli abil saame parema hinde.

Koolitus peatus pärast 208. iteratsiooni, kuna rakendasime varase peatumise kriteeriume. Kõige tähtsam on see, et mudel sai katsekomplektil muljetavaldava 0,9273 AUC skoori. Soovitan teil erinevate parameetrite kohta lisateabe saamiseks tutvuda lightGBM-i dokumentatsiooniga.

Lõpumärkused

Graafikutel on tohutu potentsiaal. Saame seda kasutada paljude reaalse maailma probleemide lahendamiseks, millest ühe seose ennustamine on üks.

Selles artiklis oleme näidanud, kuidas linkide ennustamise probleemiga saab masinõpet kasutades lahendada ning millised on piirangud ja olulised aspektid, mida peame sellise probleemi lahendamisel silmas pidama.

Küsige julgelt küsimusi või jätke oma tagasiside allpool olevasse kommentaaride jaotisse. Jätkake uurimist!

Algselt avaldati see aadressil https://www.analyticsvidhya.com 16. jaanuaril 2020.