Jaa


Opetusohjelma: Synthea-tietojoukon suhteiden etsiminen semanttisen linkin avulla

Tässä opetusohjelmassa kuvataan, miten voit tunnistaa yhteydet julkisessa Synthea-tietojoukossa semanttisen linkin avulla.

Kun käsittelet uusia tietoja tai työskentelet ilman aiemmin luotua tietomallia, voi olla hyödyllistä löytää suhteet automaattisesti. Tämän suhteen tunnistuksen avulla voit tehdä seuraavaa:

  • ymmärtää mallia korkealla tasolla,
  • saada lisää merkityksellisiä tietoja valmistelevan tietoanalyysin aikana,
  • vahvistetaan päivitetyt tiedot tai uudet, saapuvat tiedot ja
  • tietojen puhdistaminen.

Vaikka suhteita tiedettäisiin jo etukäteen, suhteiden etsiminen voi auttaa ymmärtämään tietomallia paremmin tai tunnistamaan tietojen laatuun liittyviä ongelmia.

Tässä opetusohjelmassa aloitat yksinkertaisella perusesimerkinnällä, jossa kokeillaan vain kolmea taulukkoa, jotta niiden välisiä yhteyksiä on helppo seurata. Sen jälkeen näytät monimutkaisemman esimerkin, jossa on suurempi taulukkojoukko.

Tässä opetusohjelmassa opit:

  • Käytä semanttisen linkin Python-kirjaston (SemPy) komponentteja, jotka tukevat Power BI -integrointia ja auttavat tietojen analysoinnin automatisoinnissa. Näitä osia ovat seuraavat:
    • FabricDataFrame – pandas-kaltainen rakenne, joka on parannettu semanttisten lisätietojen avulla.
    • Funktiot semanttisten mallien hakemiseen Fabric-työtilasta muistikirjaan.
    • Funktiot, jotka automatisoivat semanttisten mallien suhteiden etsimistä ja visualisointia.
  • Semanttisten mallien suhteiden etsimisprosessin vianmääritys, jossa on useita taulukoita ja keskenään riippuvaisia.

Edellytykset

  • Etsi ja valitse työtila valitsemalla vasemmasta siirtymisruudusta Työtilat . Tästä työtilasta tulee nykyinen työtilasi.

Seuraa mukana muistikirjassa

relationships_detection_tutorial.ipynb-muistikirja on tämän opetusohjelman mukana.

Jos haluat avata tämän opetusohjelman liitteenä olevan muistikirjan, tuo muistikirja työtilaasi noudattamalla ohjeita kohdassa Järjestelmän valmisteleminen datatieteen opetusohjelmia varten.

Jos haluat kopioida ja liittää koodin tältä sivulta, voit luoda uuden muistikirjan.

Muista liittää lakehouse muistikirjaan ennen kuin aloitat koodin suorittamisen.

Muistikirjan asettaminen

Tässä osiossa määrität muistikirjaympäristön, joka sisältää tarvittavat moduulit ja tiedot.

  1. Asenna SemPy PyPI: %pip stä muistikirjan sisäisen asennustoiminnon avulla:

    %pip install semantic-link
    
  2. Suorita semPy-moduulien tarpeellinen tuonti, jotka tarvitset myöhemmin:

    import pandas as pd
    
    from sempy.samples import download_synthea
    from sempy.relationships import (
        find_relationships,
        list_relationship_violations,
        plot_relationship_metadata
    )
    
  3. Tuo pandas, jotta voit pakottaa määritysvaihtoehdon, joka auttaa tulosteen muotoilussa:

    import pandas as pd
    pd.set_option('display.max_colwidth', None)
    
  4. Hae mallitiedot. Tässä opetusohjelmassa käytetään synteettisten potilastietojen Synthea-tietojoukkoa (pieni versio selvyyden vuoksi):

    download_synthea(which='small')
    

Suhteiden havaitseminen pienessä Synthea-taulukoiden alijoukossa

  1. Valitse kolme taulukkoa suuremmasta joukkoa:

    • patients määrittää potilastiedot
    • encounters täsmennetään potilaat, joilla oli lääketieteellisiä kohtaamisia (esimerkiksi lääkärinkäynti, toimenpide)
    • providers määrittää, mitkä lääketieteelliset palveluntarjoajat osallistuvat potilaiden hoitoon

    Taulukko encounters ratkaisee monta moneen -yhteyden kohteiden välille patients ja providers voidaan kuvata assositiiviseksi entiteetiksi:

    patients = pd.read_csv('synthea/csv/patients.csv')
    providers = pd.read_csv('synthea/csv/providers.csv')
    encounters = pd.read_csv('synthea/csv/encounters.csv')
    
  2. Etsi taulukoiden väliset suhteet SemPy-funktion find_relationships avulla:

    suggested_relationships = find_relationships([patients, providers, encounters])
    suggested_relationships
    
  3. Visualisoi suhteet DataFrame kaaviona SemPy-funktion plot_relationship_metadata avulla.

    plot_relationship_metadata(suggested_relationships)
    

    Näyttökuva, joka näyttää tietojoukon taulukoiden väliset suhteet.

    Funktio määrittää suhdehierarkian vasemmalta puolelta oikealle, mikä vastaa tuloksen "from"- ja "to"-taulukoita. Toisin sanoen vasemmalla puolella olevat riippumattomat "from"-taulukot osoittavat oikeanpuoleisiin riippuvuustaulukoihin viiteavaimillaan. Jokaisessa entiteettiruudussa näkyvät sarakkeet, jotka osallistuvat suhteen "kohteesta" tai "to"-puolelle.

    Oletusarvon mukaan suhteet luodaan muodossa "m:1" (ei muodossa "1:m") tai "1:1". 1:1-suhteet voidaan luoda jommallakummalla tai kummallakin tavalla sen mukaan, ylittääkö coverage_threshold yhdistettyjen arvojen suhde kaikkiin arvoihin vain yhteen tai molempiin suuntiin. Myöhemmin tässä opetusohjelmassa käsittelet m:m-suhteita harvemmin.

Suhteiden tunnistusongelmien vianmääritys

Perusesimerkki näyttää onnistuneen suhteen tunnistamisen puhtaissa Synthea-tiedoissa . Käytännössä tiedot ovat harvoin puhtaita, mikä estää onnistuneen tunnistamisen. On useita tekniikoita, joista voi olla hyötyä, kun tiedot eivät ole puhtaita.

Tässä opetusohjelman osiossa käsitellään suhteiden havaitsemista, kun semanttinen malli sisältää likaista tietoja.

  1. Aloita käsittelemällä alkuperäisiä DataFrames-kehyksiä, jotta saat "likaiset" tiedot, ja tulosta virheellisten tietojen koko.

    # create a dirty 'patients' dataframe by dropping some rows using head() and duplicating some rows using concat()
    patients_dirty = pd.concat([patients.head(1000), patients.head(50)], axis=0)
    
    # create a dirty 'providers' dataframe by dropping some rows using head()
    providers_dirty = providers.head(5000)
    
    # the dirty dataframes have fewer records than the clean ones
    print(len(patients_dirty))
    print(len(providers_dirty))
    
    
  2. Vertailun vuoksi alkuperäisten taulukoiden tulostuskoot:

    print(len(patients))
    print(len(providers))
    
  3. Etsi taulukoiden väliset suhteet SemPy-funktion find_relationships avulla:

    find_relationships([patients_dirty, providers_dirty, encounters])
    

    Koodin tulos näyttää, että suhteita ei havaita aiemmin käyttöön otettujen virheellisen semanttisen mallin luomisen virheiden vuoksi.

Käytä vahvistusta

Vahvistus on paras työkalu suhteiden tunnistamisen virheiden vianmääritykseen, koska:

  • Se ilmoittaa selvästi, miksi tietty suhde ei noudata viiteavainsääntöjä, joten sitä ei voida havaita.
  • Se toimii nopeasti suurten semanttisten mallien kanssa, koska se keskittyy vain määritettyihin suhteisiin eikä suorita hakua.

Vahvistus voi käyttää mitä tahansa DataFrame-kehystä, jos sarakkeet ovat samankaltaisia kuin kohteen luomat sarakkeet find_relationships. Seuraavassa koodissa suggested_relationships DataFrame viittaa kohteeseen patients eikä patients_dirty, mutta voit aliaksena DataFrame-kehyksen hakemiston avulla:

dirty_tables = {
    "patients": patients_dirty,
    "providers" : providers_dirty,
    "encounters": encounters
}

errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors

Löysennä hakuehtoja

Hämärämmissä skenaarioissa voit kokeilla hakuehtojesi löysäämistä. Tämä menetelmä lisää false-positiivisten positiivisten mahdollisuutta.

  1. Määritä include_many_to_many=True ja arvioi, auttaako se:

    find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=1)
    

    Tulokset osoittavat, että suhde encounters kohteesta kohteeseen patients havaittiin, mutta ongelmia on kaksi:

    • Suhde ilmaisee suunnan kohteesta patients kohteeseen encounters, mikä on käänteisenä odotetusta suhteesta. Tämä johtuu siitä, että kaikki patients tapahtui niin, että encounters (Coverage From on 1.0) encounters kattaa vain osittain patients (Coverage To = 0,85), koska potilaiden rivejä puuttuu.
    • Pienen kardinaliteetin sarakkeessa on vahingossa vastaavuus GENDER , joka sattuu vastaamaan molempien taulukoiden nimeä ja arvoa, mutta se ei ole kiinnostava "m:1"-suhde. -ja Unique Count To -sarakkeet ilmoittavat Unique Count From pienen kardinaliteetin.
  2. Suorita uudelleen find_relationships , jotta voit etsiä vain "m:1"-suhteita, mutta alaosassa coverage_threshold=0.5:

    find_relationships(dirty_tables, include_many_to_many=False, coverage_threshold=0.5)
    

    Tulos näyttää suhteiden oikean suunnan kohteesta encounters providerskohteeseen . Yhteyttä encounters kohteesta kohteeseen patients ei kuitenkaan tunnisteta, koska patients se ei ole yksilöivä, joten se ei voi olla m:1-suhteen "Yksi"-puolella.

  3. Löysennä sekä include_many_to_many=True että coverage_threshold=0.5:

    find_relationships(dirty_tables, include_many_to_many=True, coverage_threshold=0.5)
    

    Nyt molemmat kiinnostavat suhteet ovat näkyvissä, mutta melua on paljon enemmän:

    • Matala kardinaliteettivastaavuus GENDER on olemassa.
    • Esiin tuli suurempi kardinaliteetti "m:m" -vastaavuus ORGANIZATION , mikä tekee selväksi, että ORGANIZATION sarakkeen normalisointi on todennäköisesti poistettu molemmista taulukoista.

Täsmää sarakkeiden nimet

SemPy ottaa oletusarvoisesti huomioon, että se vastaa vain määritteitä, jotka näyttävät nimien samankaltaisuuden, ja hyödyntää sitä, että tietokannan suunnittelijat nimeävät liittyvät sarakkeet yleensä samalla tavalla. Tämä toiminta auttaa välttämään vääriä suhteita, joita esiintyy useimmin pienen kardinaliteetin kokonaislukuavaimilla. Jos käytössä ovat 1,2,3,...,10 esimerkiksi tuoteluokat ja 1,2,3,...,10 tilauksen tilakoodi, ne sekoitetaan toisiinsa, kun tarkastellaan arvojen yhdistämismäärityksiä ottamatta sarakkeiden nimiä huomioon. Virheellisten suhteiden ei pitäisi olla ongelmia GUID-tunnuksen kaltaisten avainten kanssa.

SemPy tarkastelee sarakkeiden nimien ja taulukoiden nimien välistä samankaltaisuutta. Vastaavuus on likimääräinen ja kirjainkoolla ei ole merkitystä. Se ohittaa useimmin havaitut "decorator"-alimerkkijonot, kuten "tunnus", "koodi", "nimi", "avain", "pk", "fk". Tämän seurauksena yleisimmät vastaavuustapaukset ovat:

  • määrite nimeltä "column" entiteetissä "foo" vastaa määritettä nimeltä "column" (myös "COLUMN" tai "Column") entiteetissä 'bar'.
  • entiteetin foo-entiteetissä "column"-määrite vastaa määritettä, jonka nimi on column_id rivillä.
  • määrite nimeltä bar entiteetissä "foo" vastaa määritettä nimeltä "code" kohteessa 'bar'.

Tunnistaminen suoritetaan nopeammin, kun sarakkeiden nimet täsmäytellään ensin.

  1. Täsmää sarakkeiden nimet:

    • Jos haluat tietää, mitkä sarakkeet on valittu jatkoarviointia varten, käytä verbose=2 -asetusta (verbose=1 luetteloi vain käsiteltävät entiteetit).
    • name_similarity_threshold Parametri määrittää, miten sarakkeita verrataan. Raja-arvo 1 ilmaisee, että olet kiinnostunut vain 100 %:n vastaamisesta.
    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
    

    100 prosentin samankaltaisuudet eivät selitä pieniä eroja nimien välillä. Esimerkissä taulukoilla on monikkomuotoinen ja "s"-jälkiliite, minkä tuloksena ei ole tarkkaa vastaavuutta. Tätä käsitellään hyvin oletusarvon name_similarity_threshold=0.8mukaisesti.

  2. Suorita uudelleen käyttäen oletusarvoa name_similarity_threshold=0.8:

    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
    

    Huomaa, että monikkomuodon patients Tunnusta verrataan nyt yksikön patient kanssa ilman, että suoritusaikaan lisätään liian monta muuta virheellistä vertailua.

  3. Suorita uudelleen käyttäen oletusarvoa name_similarity_threshold=0:

    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
    

    Jos arvoksi vaihdetaan name_similarity_threshold 0, se tarkoittaa myös sitä, että haluat verrata kaikkia sarakkeita. Tämä on harvoin tarpeen, ja se kasvattaa suoritusaikaa ja vääriä vastaavuuksia, joita on tarkistettava. Huomaa vertailujen määrä yksityiskohtaisessa tulosteessa.

Yhteenveto vianmääritysvihjeistä

  1. Aloita m:1-yhteyksien tarkasta vastaavuuden alusta (eli oletus include_many_to_many=False ja coverage_threshold=1.0). Tämä on yleensä mitä haluat.
  2. Keskity ahtaasti taulukoiden pienempiin alijoukkoihin.
  3. Käytä vahvistusta tietojen laatuongelmien tunnistamiseen.
  4. Käytä verbose=2 tätä, jos haluat ymmärtää, mitä sarakkeita käsitellään suhteessa. Tämä voi aiheuttaa suuren tulostemäärän.
  5. Ota huomioon hakuargumenttien kompromissit. include_many_to_many=True ja coverage_threshold<1.0 se voi aiheuttaa vääriä suhteita, joita on ehkä vaikeampi analysoida ja jotka on suodatettava.

Suhteiden havaitseminen koko Synthea-tietojoukossa

Yksinkertainen perusesimerkki oli kätevä oppimis- ja vianmääritystyökalu. Käytännössä voit aloittaa semanttisesta mallista, kuten koko Synthea-tietojoukosta , jossa on paljon enemmän taulukoita. Tutustu koko synthea-tietojoukkoon seuraavasti.

  1. Lue kaikki tiedostot synthea/csv-hakemistosta:

    all_tables = {
        "allergies": pd.read_csv('synthea/csv/allergies.csv'),
        "careplans": pd.read_csv('synthea/csv/careplans.csv'),
        "conditions": pd.read_csv('synthea/csv/conditions.csv'),
        "devices": pd.read_csv('synthea/csv/devices.csv'),
        "encounters": pd.read_csv('synthea/csv/encounters.csv'),
        "imaging_studies": pd.read_csv('synthea/csv/imaging_studies.csv'),
        "immunizations": pd.read_csv('synthea/csv/immunizations.csv'),
        "medications": pd.read_csv('synthea/csv/medications.csv'),
        "observations": pd.read_csv('synthea/csv/observations.csv'),
        "organizations": pd.read_csv('synthea/csv/organizations.csv'),
        "patients": pd.read_csv('synthea/csv/patients.csv'),
        "payer_transitions": pd.read_csv('synthea/csv/payer_transitions.csv'),
        "payers": pd.read_csv('synthea/csv/payers.csv'),
        "procedures": pd.read_csv('synthea/csv/procedures.csv'),
        "providers": pd.read_csv('synthea/csv/providers.csv'),
        "supplies": pd.read_csv('synthea/csv/supplies.csv'),
    }
    
  2. Etsi taulukoiden väliset suhteet SemPy-funktion find_relationships avulla:

    suggested_relationships = find_relationships(all_tables)
    suggested_relationships
    
  3. Visualisoi suhteet:

    plot_relationship_metadata(suggested_relationships)
    

    Näyttökuva taulukoiden välisistä suhteista.

  4. Laske, kuinka monta uutta m:m-suhdetta kohteen kanssa include_many_to_many=Truehavaitaan. Nämä suhteet täydentävät aiemmin näytettyjä "m:1"-suhteita. siksi sinun täytyy suodattaa :n mukaan multiplicity:

    suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) 
    suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
    
  5. Voit lajitella suhdetietoja eri sarakkeiden mukaan, jotta saat syvemmän käsityksen niiden luonteesta. Voit esimerkiksi järjestää tulokset -, ja Row Count From Row Count To-mukaan, mikä auttaa tunnistamaan suurimmat taulukot.

    suggested_relationships.sort_values(['Row Count From', 'Row Count To'], ascending=False)
    

    Erilaisessa semanttisessa mallissa olisi ehkä tärkeää keskittyä tyhjäarvojen Null Count From määrään tai Coverage To.

    Tämän analyysin avulla voit ymmärtää, voiko jokin suhteista olla virheellinen, ja jos ne on poistettava ehdokasluettelosta.

Katso muut opetusohjelmat semanttisesta linkistä /SemPy:stä: