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


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

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

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

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

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

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

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

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

Προαπαιτούμενα στοιχεία

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

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

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

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

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

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

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

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

Εάν προτιμάτε να αντιγράψετε και να επικολλήσετε τον κώδικα από αυτή τη σελίδα, μπορείτε να δημιουργήσετε ένα νέο σημειωματάριο.

Φροντίστε να επισυνάψετε ένα lakehouse στο σημειωματάριο προτού ξεκινήσετε την εκτέλεση κώδικα.

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

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

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

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

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

    find_relationships([patients_dirty, providers_dirty, encounters])
    

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

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

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

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

Η επικύρωση μπορεί να χρησιμοποιήσει οποιοδήποτε DataFrame με στήλες παρόμοιες με αυτές που δημιουργούνται από find_relationshipsτο . Στον παρακάτω κώδικα, το suggested_relationships DataFrame αναφέρεται σε αντί patients_dirtyγια patients , αλλά μπορείτε να ψευδώνυμο των 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 , η οποία τυχαίνει να συμφωνεί με το όνομα και την τιμή και στους δύο πίνακες, αλλά δεν είναι σχέση ενδιαφέροντος "m: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
    • Εμφανίστηκε μια συμφωνία ORGANIZATION υψηλότερης πληθικότητας "m:m", καθιστώντας προφανές ότι 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: