Κοινή χρήση μέσω


Εκμάθηση: Εντοπισμός σχέσεων στο σύνολο δεδομένων Synthea, με χρήση σημασιολογικής σύνδεσης

Αυτή η εκμάθηση παρουσιάζει τον τρόπο εντοπισμού σχέσεων στο δημόσιο τη Synthea σύνολο δεδομένων, χρησιμοποιώντας σύνδεση σημασιολογίας.

Όταν εργάζεστε με νέα δεδομένα ή εργάζεστε χωρίς υπάρχον μοντέλο δεδομένων, μπορεί να είναι χρήσιμο να ανακαλύψετε αυτόματα σχέσεις. Αυτός ο εντοπισμός σχέσεων μπορεί να σας βοηθήσει να κάνετε τα εξής:

  • κατανόηση του μοντέλου σε υψηλό επίπεδο,
  • αποκτήστε περισσότερες πληροφορίες κατά τη διάρκεια της διερευνητικής ανάλυσης δεδομένων,
  • επικύρωση ενημερωμένων δεδομένων ή νέων, εισερχόμενων δεδομένων και
  • την εκκαθάριση δεδομένων.

Ακόμη και αν οι σχέσεις είναι γνωστές εκ των προτέρων, η αναζήτηση σχέσεων μπορεί να βοηθήσει στην καλύτερη κατανόηση του μοντέλου δεδομένων ή στον προσδιορισμό προβλημάτων ποιότητας δεδομένων.

Σε αυτό το πρόγραμμα εκμάθησης, ξεκινάτε με ένα απλό παράδειγμα γραμμής βάσης, όπου πειραματίζεστε με μόνο τρεις πίνακες, έτσι ώστε να είναι εύκολο να ακολουθήσετε τις συνδέσεις μεταξύ τους. Στη συνέχεια, θα δείτε ένα πιο σύνθετο παράδειγμα με ένα μεγαλύτερο σύνολο πινάκων.

Σε αυτή την εκμάθηση, θα μάθετε πώς μπορείτε να κάνετε τα εξής:

  • Χρησιμοποιήστε στοιχεία της βιβλιοθήκης Python της σημασιολογικής σύνδεσης (SemPy) που υποστηρίζουν ενοποίηση με το Power BI και βοηθούν στην αυτοματοποίηση της ανάλυσης δεδομένων. Αυτά τα στοιχεία περιλαμβάνουν:
    • FabricDataFrame - μια δομή που μοιάζει με pandas ενισχυμένη με πρόσθετες σημασιολογικές πληροφορίες.
    • Συναρτήσεις για την άντληση σημασιολογικών μοντέλων από έναν χώρο εργασίας Fabric στο σημειωματάριό σας.
    • Συναρτήσεις που αυτοματοποιούν τον εντοπισμό και την απεικόνιση σχέσεων στα σημασιολογικά μοντέλα σας.
  • Αντιμετώπιση προβλημάτων κατά τη διαδικασία εντοπισμού σχέσεων για σημασιολογικά μοντέλα με πολλούς πίνακες και αλληλεξαρτίες.

Προϋποθέσεις

  • Λάβετε μια συνδρομής Microsoft Fabric . Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση microsoft Fabric.

  • Εισέλθετε για να το Microsoft Fabric.

  • Χρησιμοποιήστε την εναλλαγή εμπειρίας στην κάτω αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε σε Fabric.

    Στιγμιότυπο οθόνης του μενού εναλλαγής εμπειρίας, που εμφανίζει πού μπορείτε να επιλέξετε Επιστήμη δεδομένων.

  • Επιλέξτε χώροι εργασίας από το αριστερό παράθυρο περιήγησης για να βρείτε και να επιλέξετε τον χώρο εργασίας σας. Αυτός ο χώρος εργασίας γίνεται ο τρέχων χώρος εργασίας σας.

Ακολουθήστε τις οδηγίες στο σημειωματάριο

Το σημειωματάριο.ipynb relationships_detection_tutorial συνοδεύει αυτό το πρόγραμμα εκμάθησης.

Ρύθμιση του σημειωματάριου

Σε αυτή την ενότητα, ρυθμίζετε ένα περιβάλλον σημειωματάριου με τις απαραίτητες λειτουργικές μονάδες και δεδομένα.

  1. Εγκαταστήστε SemPy από το PyPI χρησιμοποιώντας τη δυνατότητα εγκατάστασης %pip εντός του σημειωματάριου:

    %pip install semantic-link
    
  2. Εκτελέστε τις απαραίτητες εισαγωγές λειτουργικών μονάδων SemPy που θα χρειαστείτε αργότερα:

    import pandas as pd
    
    from sempy.samples import download_synthea
    from sempy.relationships import (
        find_relationships,
        list_relationship_violations,
        plot_relationship_metadata
    )
    
  3. Εισαγάγετε pandas για την επιβολή μιας επιλογής ρύθμισης παραμέτρων που βοηθά με τη μορφοποίηση εξόδου:

    import pandas as pd
    pd.set_option('display.max_colwidth', None)
    
  4. Τραβήξτε το δείγμα δεδομένων. Για αυτό το εκπαιδευτικό βοήθημα, χρησιμοποιείτε το Synthea σύνολο δεδομένων συνθετικών ιατρικών αρχείων (μικρή έκδοση για λόγους ευκολίας):

    download_synthea(which='small')
    

Εντοπισμός σχέσεων σε ένα μικρό υποσύνολο πινάκων Synthea

  1. Επιλέξτε τρεις πίνακες από ένα μεγαλύτερο σύνολο:

    • patients καθορίζει πληροφορίες ασθενών
    • encounters καθορίζει τους ασθενείς που είχαν ιατρικές συναντήσεις (για παράδειγμα, ιατρικό ραντεβού, διαδικασία)
    • providers καθορίζει ποιοι ιατρικοί πάροχοι παρακολούθησαν

    Ο encounters πίνακας επιλύει μια σχέση πολλά-προς-πολλά μεταξύ patients και providers και μπορεί να περιγραφεί ως μια συσχετισμική οντότητα:

    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. Εύρεση σχέσεων μεταξύ των πινάκων χρησιμοποιώντας τη συνάρτηση find_relationships του SemPy:

    suggested_relationships = find_relationships([patients, providers, encounters])
    suggested_relationships
    
  3. Απεικονίστε τις σχέσεις DataFrame ως γράφημα, χρησιμοποιώντας τη plot_relationship_metadata συνάρτηση του SemPy.

    plot_relationship_metadata(suggested_relationships)
    

    Στιγμιότυπο οθόνης που εμφανίζει σχέσεις μεταξύ πινάκων στο σύνολο δεδομένων.

    Η συνάρτηση καθορίζει την ιεραρχία σχέσεων από την αριστερή πλευρά προς τα δεξιά, η οποία αντιστοιχεί σε πίνακες "από" και "προς" στο αποτέλεσμα. Με άλλα λόγια, οι ανεξάρτητοι πίνακες "από" στην αριστερή πλευρά χρησιμοποιούν τα εξωτερικά κλειδιά τους για να υποδείίσουν τους πίνακες εξάρτησης "προς" στη δεξιά πλευρά. Κάθε πλαίσιο οντότητας εμφανίζει στήλες που συμμετέχουν είτε στην πλευρά "από" είτε στην πλευρά "προς" μιας σχέσης.

    Από προεπιλογή, οι σχέσεις δημιουργούνται ως "m:1" (όχι ως "1:m") ή "1:1". Οι σχέσεις "1:1" μπορούν να δημιουργηθούν με έναν ή και τους δύο τρόπους, ανάλογα με το αν η αναλογία των αντιστοιχισμένων τιμών προς όλες τις τιμές υπερβαίνει coverage_threshold σε μία ή και στις δύο κατευθύνσεις. Παρακάτω σε αυτή την εκμάθηση, θα καλύψετε τις λιγότερο συχνές σχέσεις "m:m".

Αντιμετώπιση προβλημάτων εντοπισμού σχέσεων

Το παράδειγμα γραμμής βάσης εμφανίζει έναν επιτυχή εντοπισμό σχέσεων σε καθαρές δεδομένα Synthea. Στην πράξη, τα δεδομένα είναι σπάνια καθαρά, γεγονός που αποτρέπει τον επιτυχή εντοπισμό. Υπάρχουν διάφορες τεχνικές που μπορεί να είναι χρήσιμες όταν τα δεδομένα δεν είναι καθαρά.

Αυτή η ενότητα αυτού του προγράμματος εκμάθησης αντιμετωπίζει τον εντοπισμό σχέσεων όταν το μοντέλο σημασιολογίας περιέχει εσφαλμένα δεδομένα.

  1. Ξεκινήστε με τον χειρισμό των αρχικών DataFrames για να λάβετε "βρώμικα" δεδομένα και εκτυπώστε το μέγεθος των βρώμικων δεδομένων.

    # 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. Για λόγους σύγκρισης, τα μεγέθη εκτύπωσης των αρχικών πινάκων:

    print(len(patients))
    print(len(providers))
    
  3. Εύρεση σχέσεων μεταξύ των πινάκων χρησιμοποιώντας τη συνάρτηση find_relationships του SemPy:

    find_relationships([patients_dirty, providers_dirty, encounters])
    

    Το αποτέλεσμα του κώδικα δείχνει ότι δεν ανιχνεύονται σχέσεις λόγω των σφαλμάτων που εισαγάγατε νωρίτερα για να δημιουργήσετε το "βρώμικο" σημασιολογικό μοντέλο.

Χρήση επικύρωσης

Η επικύρωση είναι το καλύτερο εργαλείο για την αντιμετώπιση προβλημάτων αποτυχιών εντοπισμού σχέσεων καθώς:

  • Αναφέρει σαφώς γιατί μια συγκεκριμένη σχέση δεν ακολουθεί τους κανόνες εξωτερικού κλειδιού και, επομένως, δεν μπορεί να εντοπιστεί.
  • Εκτελείται γρήγορα με μεγάλα σημασιολογικά μοντέλα καθώς εστιάζει μόνο στις δηλωμένες σχέσεις και δεν εκτελεί αναζήτηση.

Η επικύρωση μπορεί να χρησιμοποιήσει οποιοδήποτε DataFrame με στήλες παρόμοιες με αυτές που δημιουργήθηκαν από find_relationships. Στον παρακάτω κώδικα, το suggested_relationships DataFrame αναφέρεται σε patients αντί για patients_dirty, αλλά μπορείτε να προσθέσετε ψευδώνυμο στα DataFrames με ένα λεξικό:

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

errors = list_relationship_violations(dirty_tables, suggested_relationships)
errors

Χαλαρώνει τα κριτήρια αναζήτησης

Σε πιο ασαφή σενάρια, μπορείτε να δοκιμάσετε να χαλαρώσετε τα κριτήρια αναζήτησής σας. Αυτή η μέθοδος αυξάνει την πιθανότητα ψευδώς θετικών στοιχείων.

  1. Ορίστε include_many_to_many=True και αξιολογήστε εάν βοηθά:

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

    Τα αποτελέσματα δείχνουν ότι εντοπίστηκε η σχέση από encounters σε patients, αλλά υπάρχουν δύο προβλήματα:

    • Η σχέση υποδεικνύει μια κατεύθυνση από patients έως encounters, το οποίο είναι ένα αντίστροφο της αναμενόμενης σχέσης. Αυτό συμβαίνει γιατί όλα patients έτυχε να καλύπτονται από encounters (Coverage From είναι 1,0), ενώ encounters καλύπτονται μόνο εν μέρει από patients (Coverage To = 0,85), δεδομένου ότι λείπουν γραμμές ασθενών.
    • Υπάρχει μια τυχαία αντιστοίχιση σε μια στήλη GENDER χαμηλή πληθικότητα, η οποία τυχαίνει να συμφωνεί με το όνομα και την τιμή και στους δύο πίνακες, αλλά δεν είναι μια σχέση ενδιαφέροντος "μ:1". Η χαμηλή πληθικότητα υποδεικνύεται από Unique Count From και Unique Count To στήλες.
  2. Επαναλάβετε find_relationships για να αναζητήσετε μόνο σχέσεις "m:1", αλλά με χαμηλότερο coverage_threshold=0.5:

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

    Το αποτέλεσμα εμφανίζει τη σωστή κατεύθυνση των σχέσεων από encounters έως providers. Ωστόσο, η σχέση από encounters σε patients δεν ανιχνεύεται, επειδή patients δεν είναι μοναδική, επομένως δεν μπορεί να βρίσκεται στην πλευρά "Ένα" της σχέσης "m:1".

  3. Χαλαρώστε τόσο include_many_to_many=True όσο και coverage_threshold=0.5:

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

    Τώρα και οι δύο σχέσεις ενδιαφέροντος είναι ορατές, αλλά υπάρχει πολύ περισσότερος θόρυβος:

    • Η αντιστοίχιση χαμηλής πληθικότητας στην GENDER υπάρχει.
    • Εμφανίστηκε μια συμφωνία υψηλότερης πληθικότητας "m:m" στον ORGANIZATION, καθιστώντας προφανές ότι ORGANIZATION είναι πιθανό μια στήλη να μην κανονικοποιείται και στους δύο πίνακες.

Αντιστοίχιση ονομάτων στηλών

Από προεπιλογή, το SemPy θεωρεί ότι συμφωνεί μόνο με χαρακτηριστικά που εμφανίζουν ομοιότητα ονόματος, εκμεταλλευόμενοι το γεγονός ότι οι σχεδιαστές βάσεων δεδομένων συνήθως ονομάζουν τις σχετικές στήλες με τον ίδιο τρόπο. Αυτή η συμπεριφορά βοηθά στην αποφυγή ψευδών σχέσεων, οι οποίες εμφανίζονται συχνότερα με ακέραια κλειδιά χαμηλής πληθικότητας. Για παράδειγμα, εάν υπάρχουν 1,2,3,...,10 κατηγορίες προϊόντων και 1,2,3,...,10 κωδικό κατάστασης παραγγελίας, θα συγχέονται μεταξύ τους όταν εξετάζουν μόνο αντιστοιχίσεις τιμών χωρίς να λαμβάνονται υπόψη τα ονόματα στηλών. Οι ψευδείς σχέσεις δεν πρέπει να αποτελούν πρόβλημα με κλειδιά τύπου GUID.

Η SemPy εξετάζει μια ομοιότητα μεταξύ των ονομάτων στηλών και των ονομάτων πινάκων. Η αντιστοίχιση είναι κατά προσέγγιση και δεν κάνει διάκριση πεζών-κεφαλαίων. Αγνοεί τις δευτερεύουσες συμβολοσειρές "decorator" που χρησιμοποιούνται συχνότερα, όπως "id", "code", "name", "key", "pk", "fk". Κατά συνέπεια, οι πιο τυπικές περιπτώσεις αντιστοίχισης είναι οι εξής:

  • ένα χαρακτηριστικό που ονομάζεται "στήλη" στην οντότητα "foo" συμφωνεί με ένα χαρακτηριστικό που ονομάζεται "στήλη" (επίσης "COLUMN" ή "Column") στην οντότητα "bar".
  • ένα χαρακτηριστικό που ονομάζεται "στήλη" στην οντότητα "foo" συμφωνεί με ένα χαρακτηριστικό που ονομάζεται "column_id" στο "bar".
  • ένα χαρακτηριστικό που ονομάζεται "ράβδος" στην οντότητα "foo" συμφωνεί με ένα χαρακτηριστικό που ονομάζεται "κώδικας" στη "γραμμή".

Αντιστοιχίζοντας πρώτα τα ονόματα στηλών, ο εντοπισμός εκτελείται ταχύτερα.

  1. Ταιριάξτε τα ονόματα των στηλών:

    • Για να κατανοήσετε ποιες στήλες επιλέγονται για περαιτέρω αξιολόγηση, χρησιμοποιήστε την επιλογή verbose=2 (verbose=1 παραθέτει μόνο τις οντότητες που υποβάλλονται σε επεξεργασία).
    • Η παράμετρος name_similarity_threshold καθορίζει τον τρόπο σύγκρισης των στηλών. Το όριο 1 υποδεικνύει ότι σας ενδιαφέρουν 100% αγώνας μόνο.
    find_relationships(dirty_tables, verbose=2, name_similarity_threshold=1.0);
    

    Αν εκτελείται στα 100% ομοιότητα δεν λαμβάνει υπόψη τις μικρές διαφορές μεταξύ των ονομάτων. Στο παράδειγμά σας, οι πίνακες έχουν μια μορφή πληθυντικού με επίθημα "s", το οποίο δεν έχει ως αποτέλεσμα ακριβή συμφωνία. Αυτό αντιμετωπίζεται καλά με την προεπιλεγμένη name_similarity_threshold=0.8.

  2. Επαναλάβετε την εκτέλεση με την προεπιλεγμένη name_similarity_threshold=0.8:

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

    Παρατηρήστε ότι το αναγνωριστικό για τη μορφή πληθυντικού patients συγκρίνεται τώρα με τον ενικό patient χωρίς να προστίθεται πάρα πολλές άλλες ψευδείς συγκρίσεις στον χρόνο εκτέλεσης.

  3. Επαναλάβετε την εκτέλεση με την προεπιλεγμένη name_similarity_threshold=0:

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

    Η αλλαγή name_similarity_threshold σε 0 είναι το άλλο άκρο και υποδεικνύει ότι θέλετε να συγκρίνετε όλες τις στήλες. Αυτό είναι σπανίως απαραίτητο και έχει ως αποτέλεσμα αυξημένο χρόνο εκτέλεσης και ψευδείς αντιστοιχίες που πρέπει να εξεταστούν. Παρατηρήστε τον αριθμό συγκρίσεων στην λεπτομερή έξοδο.

Σύνοψη των συμβουλών αντιμετώπισης προβλημάτων

  1. Ξεκινήστε από την ακριβή συμφωνία για σχέσεις "m:1" (δηλαδή, την προεπιλεγμένη include_many_to_many=False και coverage_threshold=1.0). Συνήθως αυτό είναι που θέλετε.
  2. Χρησιμοποιήστε μια στενή εστίαση σε μικρότερα υποσύνολα πινάκων.
  3. Χρησιμοποιήστε την επικύρωση για να εντοπίσετε προβλήματα ποιότητας δεδομένων.
  4. Χρησιμοποιήστε verbose=2 εάν θέλετε να κατανοήσετε ποιες στήλες λαμβάνονται υπόψη για σχέση. Αυτό μπορεί να οδηγήσει σε μεγάλη ποσότητα εξόδου.
  5. Να γνωρίζετε τις αντιδικίες των ορισμάτων αναζήτησης. include_many_to_many=True και coverage_threshold<1.0 μπορεί να παράγουν ψευδείς σχέσεις που μπορεί να είναι πιο δύσκολο να αναλυθούν και θα χρειαστεί να φιλτραριστούν.

Εντοπισμός σχέσεων στο πλήρες σύνολο δεδομένων Synthea

Το απλό παράδειγμα γραμμής βάσης ήταν ένα εύχρηστο εργαλείο εκμάθησης και αντιμετώπισης προβλημάτων. Στην πράξη, μπορείτε να ξεκινήσετε από ένα σημασιολογικό μοντέλο, όπως το πλήρες Synthea σύνολο δεδομένων, το οποίο έχει πολύ περισσότερους πίνακες. Εξερευνήστε την πλήρη synthea σύνολο δεδομένων ως εξής.

  1. Ανάγνωση όλων των αρχείων από τον κατάλογο synthea/csv του :

    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. Εύρεση σχέσεων μεταξύ των πινάκων, χρησιμοποιώντας τη συνάρτηση find_relationships του SemPy:

    suggested_relationships = find_relationships(all_tables)
    suggested_relationships
    
  3. Απεικόνιση σχέσεων:

    plot_relationship_metadata(suggested_relationships)
    

    Στιγμιότυπο οθόνης των σχέσεων μεταξύ πινάκων.

  4. Μετρήστε πόσες νέες σχέσεις "m:m" θα εντοπιστούν με include_many_to_many=True. Αυτές οι σχέσεις είναι επιπλέον των σχέσεων που εμφανίζονται προηγουμένως "m:1". Επομένως, πρέπει να φιλτράρετε με βάση multiplicity:

    suggested_relationships = find_relationships(all_tables, coverage_threshold=1.0, include_many_to_many=True) 
    suggested_relationships[suggested_relationships['Multiplicity']=='m:m']
    
  5. Μπορείτε να ταξινομήσετε τα δεδομένα σχέσης κατά διάφορες στήλες για να κατανοήσετε βαθύτερα τη φύση τους. Για παράδειγμα, μπορείτε να επιλέξετε να παραγγείλετε την έξοδο κατά Row Count From και Row Count To, που βοηθούν στον προσδιορισμό των μεγαλύτερων πινάκων.

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

    Σε ένα διαφορετικό μοντέλο σημασιολογίας, ίσως θα ήταν σημαντικό να εστιάσετε στον αριθμό των null Null Count From ή Coverage To.

    Αυτή η ανάλυση μπορεί να σας βοηθήσει να κατανοήσετε εάν οποιαδήποτε από τις σχέσεις μπορεί να μην είναι έγκυρη και εάν χρειάζεται να τις καταργήσετε από τη λίστα υποψηφίων.

Δείτε άλλα προγράμματα εκμάθησης για τη σημασιολογική σύνδεση / SemPy: