Jaa


Opetusohjelma: Suhteiden etsiminen Synthea -tietojoukosta semanttisen linkin avulla

Tässä opetusohjelmassa kuvataan, miten voit tunnistaa suhteet julkisessa Synthea tietojoukon 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

  • Hanki Microsoft Fabric -tilaus. Voit myös rekisteröityä microsoft fabric -kokeiluversion maksuttomaan .

  • Kirjaudu sisään Microsoft Fabric .

  • Vaihda Fabriciin aloitussivun vasemmassa alakulmassa olevan käyttökokemuksen vaihtajan avulla.

    Näyttökuva käyttökokemuksen vaihtajavalikosta, jossa näkyy, missä datatiede valitaan.

  • Valitse Työtilat vasemmasta siirtymisruudusta työtilan hakemiseksi ja valitsemiseksi. Tästä työtilasta tulee nykyinen työtilasi.

Seuraa mukana muistikirjassa

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

Muistikirjan asettaminen

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

  1. Asenna SemPy PyPI:stä käyttämällä muistikirjassa olevaa %pip asennusominaisuutta:

    %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 yksinkertaisuuden vuoksi):

    download_synthea(which='small')
    

Suhteiden havaitseminen pienessä Synthea -taulukoiden alijoukossa

  1. Valitse kolme taulukkoa suuremmasta joukkoa:

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

    encounters-taulukko ratkaisee patients ja providers välisen monta-moneen-suhteen, ja sitä 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-find_relationships funktiolla:

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

    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ö yhdistettyjen arvojen suhde kaikkiin arvoihin coverage_threshold 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 puhtaassa Synthea tietoja. 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-find_relationships funktiolla:

    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 find_relationships. Seuraavassa koodissa suggested_relationships DataFrame viittaa patients eikä patients_dirty, mutta voit aliaksena DataFrames-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ä yhteys encounterspatients havaittiin, mutta on olemassa kaksi ongelmaa:

    • Suhde ilmaisee suunnan patients:stä encounters, joka on käänteisenä odotetusta suhteesta. Tämä johtuu siitä, että kaikki patients sisältyvät encounters (Coverage From on 1,0), kun taas encounters katetaan vain osittain patients (Coverage To = 0, 85), koska potilaiden rivejä puuttuu.
    • Pienen kardinaliteetin GENDER sarakkeessa on vahingossa vastaavuus, joka sattuu vastaamaan molempien taulukoiden nimeä ja arvoa, mutta se ei ole kiinnostava "m:1"-suhde. Unique Count From ja Unique Count To sarakkeet ilmoittavat pienen kardinaliteetin.
  2. Suorita find_relationships uudelleen, jos haluat etsiä vain "m:1"-suhteita, mutta alemmalla coverage_threshold=0.5:

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

    Tulos näyttää suhteiden oikean suunnan encounters kohteeseen providers. Suhdetta encounterspatients ei kuitenkaan havaita, koska patients ei ole yksilöllinen, joten sitä 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:

    • GENDER matala kardinaliteetti vastaa toisiaan.
    • Suurempi kardinaliteettivastaavuus "m:m" ORGANIZATION ilmaantui, mikä tekee selväksi, että ORGANIZATION on todennäköisesti sarake, jonka normalisointi puretaan molempiin taulukoihin.

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 on esimerkiksi 1,2,3,...,10 tuoteluokkia ja 1,2,3,...,10 tilauksen tilakoodia, ne sekoitetaan toisiinsa, kun tarkastellaan arvojen yhdistämismäärityksiä ottamatta huomioon sarakkeiden nimiä. 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 sadasta% vain vastaavuus.
    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
    

    Jos luku on 100,% samankaltaisuutta ei oteta huomioon pienten nimien välisten erojen vuoksi. Esimerkissä taulukoilla on monikkomuotoinen ja "s"-jälkiliite, minkä tuloksena ei ole tarkkaa vastaavuutta. Tätä käsitellään hyvin oletusasetusten name_similarity_threshold=0.8.

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

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

    Huomaa, että monikkomuotoisen patients tunnusta verrataan nyt yksikön patient lisäämättä liikaa muita vääriä vertailuja suoritusaikaan.

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

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

    Toinen äärimmäinen name_similarity_threshold muuttaminen arvoon 0 on se, että haluat vertailla 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-suhteiden tarkasta vastaavuuden alusta (eli oletusasetus 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, 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 saattavat aiheuttaa vääriä suhteita, joita voi olla vaikeampi analysoida ja jotka on suodatettava.

Suhteiden havaitseminen Syntheatietojoukossa

Yksinkertainen perusesimerkki oli kätevä oppimis- ja vianmääritystyökalu. Käytännössä voit aloittaa semanttisesta mallista, kuten täydellisestä Synthea tietojoukosta, jossa on paljon enemmän taulukoita. Tutustu tietojoukon 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-find_relationships-funktiolla:

    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 löydetään include_many_to_many=Truekanssa. Nämä suhteet täydentävät aiemmin näytettyjä "m:1"-suhteita. Siksi sinun on suodatettava 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 Row Count From ja Row Count Tomukaan, 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 määrään Null Count From 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ä: