Εκμάθηση: Εντοπισμός σχέσεων στο σύνολο δεδομένων Synthea , με χρήση σημασιολογικής σύνδεσης
Αυτή η εκμάθηση παρουσιάζει τον τρόπο εντοπισμού σχέσεων στο δημόσιο σύνολο δεδομένων Synthea , χρησιμοποιώντας σημασιολογική σύνδεση.
Όταν εργάζεστε με νέα δεδομένα ή εργάζεστε χωρίς υπάρχον μοντέλο δεδομένων, μπορεί να είναι χρήσιμο να ανακαλύψετε αυτόματα σχέσεις. Αυτός ο εντοπισμός σχέσεων μπορεί να σας βοηθήσει να κάνετε τα εξής:
- κατανόηση του μοντέλου σε υψηλό επίπεδο,
- αποκτήστε περισσότερες πληροφορίες κατά τη διάρκεια της διερευνητικής ανάλυσης δεδομένων,
- επικύρωση ενημερωμένων δεδομένων ή νέων, εισερχόμενων δεδομένων και
- την εκκαθάριση δεδομένων.
Ακόμη και αν οι σχέσεις είναι γνωστές εκ των προτέρων, η αναζήτηση σχέσεων μπορεί να βοηθήσει στην καλύτερη κατανόηση του μοντέλου δεδομένων ή στον προσδιορισμό προβλημάτων ποιότητας δεδομένων.
Σε αυτό το πρόγραμμα εκμάθησης, ξεκινάτε με ένα απλό παράδειγμα γραμμής βάσης, όπου πειραματίζεστε με μόνο τρεις πίνακες, έτσι ώστε να είναι εύκολο να ακολουθήσετε τις συνδέσεις μεταξύ τους. Στη συνέχεια, θα δείτε ένα πιο σύνθετο παράδειγμα με ένα μεγαλύτερο σύνολο πινάκων.
Σε αυτό το εκπαιδευτικό βοήθημα, θα μάθετε πώς μπορείτε να κάνετε τα εξής:
- Χρησιμοποιήστε στοιχεία της βιβλιοθήκης Python (SemPy) μιας σημασιολογικής σύνδεσης που υποστηρίζουν ενοποίηση με το Power BI και βοηθούν στην αυτοματοποίηση της ανάλυσης δεδομένων. Αυτά τα στοιχεία περιλαμβάνουν:
- FabricDataFrame - μια δομή που μοιάζει με pandas ενισχυμένη με πρόσθετες σημασιολογικές πληροφορίες.
- Συναρτήσεις για την άντληση σημασιολογικών μοντέλων από έναν χώρο εργασίας Fabric στο σημειωματάριό σας.
- Συναρτήσεις που αυτοματοποιούν τον εντοπισμό και την απεικόνιση σχέσεων στα σημασιολογικά μοντέλα σας.
- Αντιμετώπιση προβλημάτων κατά τη διαδικασία εντοπισμού σχέσεων για σημασιολογικά μοντέλα με πολλούς πίνακες και αλληλεξαρτίες.
Προαπαιτούμενα στοιχεία
Λάβετε μια συνδρομή Microsoft Fabric. Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση του Microsoft Fabric.
Εισέλθετε στο Microsoft Fabric.
Χρησιμοποιήστε την εναλλαγή εμπειρίας στην αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε στην εμπειρία Synapse Data Science.
- Επιλέξτε Χώροι εργασίας από το αριστερό παράθυρο περιήγησης για να βρείτε και να επιλέξετε τον χώρο εργασίας σας. Αυτός ο χώρος εργασίας γίνεται ο τρέχων χώρος εργασίας σας.
Ακολουθήστε τις οδηγίες στο σημειωματάριο
Το σημειωματάριο relationships_detection_tutorial.ipynb συνοδεύει αυτή την εκμάθηση.
Για να ανοίξετε το σημειωματάριο που συνοδεύει αυτό το εκπαιδευτικό βοήθημα, ακολουθήστε τις οδηγίες στο θέμα Προετοιμασία του συστήματός σας για προγράμματα εκμάθησης επιστήμης δεδομένων, για να εισαγάγετε το σημειωματάριο στον χώρο εργασίας σας.
Εάν προτιμάτε να αντιγράψετε και να επικολλήσετε τον κώδικα από αυτή τη σελίδα, μπορείτε να δημιουργήσετε ένα νέο σημειωματάριο.
Φροντίστε να επισυνάψετε ένα lakehouse στο σημειωματάριο προτού ξεκινήσετε την εκτέλεση κώδικα.
Ρύθμιση του σημειωματάριου
Σε αυτή την ενότητα, ρυθμίζετε ένα περιβάλλον σημειωματάριου με τις απαραίτητες λειτουργικές μονάδες και δεδομένα.
Εγκαταστήστε
SemPy
από το PyPI χρησιμοποιώντας τη%pip
δυνατότητα ενσωματωμένης εγκατάστασης μέσα στο σημειωματάριο:%pip install semantic-link
Εκτελέστε τις απαραίτητες εισαγωγές λειτουργικών μονάδων SemPy που θα χρειαστείτε αργότερα:
import pandas as pd from sempy.samples import download_synthea from sempy.relationships import ( find_relationships, list_relationship_violations, plot_relationship_metadata )
Εισαγάγετε pandas για την επιβολή μιας επιλογής ρύθμισης παραμέτρων που βοηθά με τη μορφοποίηση εξόδου:
import pandas as pd pd.set_option('display.max_colwidth', None)
Τραβήξτε το δείγμα δεδομένων. Για αυτό το εκπαιδευτικό βοήθημα, χρησιμοποιείτε το σύνολο δεδομένων Synthea των συνθετικών ιατρικών αρχείων (μικρή έκδοση για λόγους ευκολίας):
download_synthea(which='small')
Εντοπισμός σχέσεων σε ένα μικρό υποσύνολο πινάκων Synthea
Επιλέξτε τρεις πίνακες από ένα μεγαλύτερο σύνολο:
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')
Εύρεση σχέσεων μεταξύ των πινάκων χρησιμοποιώντας τη συνάρτηση SemPy
find_relationships
:suggested_relationships = find_relationships([patients, providers, encounters]) suggested_relationships
Απεικονίστε τις σχέσεις DataFrame ως γράφημα, χρησιμοποιώντας τη συνάρτηση SemPy
plot_relationship_metadata
.plot_relationship_metadata(suggested_relationships)
Η συνάρτηση καθορίζει την ιεραρχία σχέσεων από την αριστερή πλευρά προς τα δεξιά, η οποία αντιστοιχεί σε πίνακες "από" και "προς" στο αποτέλεσμα. Με άλλα λόγια, οι ανεξάρτητοι πίνακες "από" στην αριστερή πλευρά χρησιμοποιούν τα εξωτερικά κλειδιά τους για να υποδείίσουν τους πίνακες εξάρτησης "προς" στη δεξιά πλευρά. Κάθε πλαίσιο οντότητας εμφανίζει στήλες που συμμετέχουν είτε στην πλευρά "από" είτε στην πλευρά "προς" μιας σχέσης.
Από προεπιλογή, οι σχέσεις δημιουργούνται ως "m:1" (όχι ως "1:m") ή "1:1". Οι σχέσεις "1:1" μπορούν να δημιουργηθούν με έναν ή και τους δύο τρόπους, ανάλογα με το εάν η αναλογία των αντιστοιχισμένων τιμών προς όλες τις τιμές υπερβαίνει
coverage_threshold
μόνο μία ή και τις δύο κατευθύνσεις. Παρακάτω σε αυτή την εκμάθηση, θα καλύψετε τις λιγότερο συχνές σχέσεις "m:m".
Αντιμετώπιση προβλημάτων εντοπισμού σχέσεων
Το παράδειγμα γραμμής βάσης εμφανίζει έναν επιτυχή εντοπισμό σχέσεων σε καθαρά δεδομένα Synthea . Στην πράξη, τα δεδομένα είναι σπάνια καθαρά, γεγονός που αποτρέπει τον επιτυχή εντοπισμό. Υπάρχουν διάφορες τεχνικές που μπορεί να είναι χρήσιμες όταν τα δεδομένα δεν είναι καθαρά.
Αυτή η ενότητα αυτού του προγράμματος εκμάθησης αντιμετωπίζει τον εντοπισμό σχέσεων όταν το μοντέλο σημασιολογίας περιέχει εσφαλμένα δεδομένα.
Ξεκινήστε με τον χειρισμό των αρχικών 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))
Για λόγους σύγκρισης, τα μεγέθη εκτύπωσης των αρχικών πινάκων:
print(len(patients)) print(len(providers))
Εύρεση σχέσεων μεταξύ των πινάκων χρησιμοποιώντας τη συνάρτηση 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
Χαλαρώνει τα κριτήρια αναζήτησης
Σε πιο ασαφή σενάρια, μπορείτε να δοκιμάσετε να χαλαρώσετε τα κριτήρια αναζήτησής σας. Αυτή η μέθοδος αυξάνει την πιθανότητα ψευδώς θετικών στοιχείων.
Ορίστε
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
.
- Η σχέση υποδεικνύει μια κατεύθυνση από
Επαναλάβετε την εκτέλεση
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".Χαλαρώνετε και τα δύο
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" συμφωνεί με ένα χαρακτηριστικό που ονομάζεται "κώδικας" στη "γραμμή".
Αντιστοιχίζοντας πρώτα τα ονόματα στηλών, ο εντοπισμός εκτελείται ταχύτερα.
Ταιριάξτε τα ονόματα των στηλών:
- Για να κατανοήσετε ποιες στήλες είναι επιλεγμένες για περαιτέρω αξιολόγηση, χρησιμοποιήστε την
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
- Για να κατανοήσετε ποιες στήλες είναι επιλεγμένες για περαιτέρω αξιολόγηση, χρησιμοποιήστε την
Επανάληψη με την προεπιλογή
name_similarity_threshold=0.8
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0.8);
Παρατηρήστε ότι το αναγνωριστικό για την πληθυντική μορφή
patients
συγκρίνεται τώρα με τον ενικόpatient
χωρίς να προσθέσετε πάρα πολλές άλλες ψευδείς συγκρίσεις στον χρόνο εκτέλεσης.Επανάληψη με την προεπιλογή
name_similarity_threshold=0
:find_relationships(dirty_tables, verbose=2, name_similarity_threshold=0);
Η αλλαγή
name_similarity_threshold
σε 0 είναι το άλλο άκρο και υποδεικνύει ότι θέλετε να συγκρίνετε όλες τις στήλες. Αυτό είναι σπανίως απαραίτητο και έχει ως αποτέλεσμα αυξημένο χρόνο εκτέλεσης και ψευδείς αντιστοιχίες που πρέπει να εξεταστούν. Παρατηρήστε τον αριθμό συγκρίσεων στην λεπτομερή έξοδο.
Σύνοψη των συμβουλών αντιμετώπισης προβλημάτων
- Ξεκινήστε από την ακριβή συμφωνία για σχέσεις "m:1" (δηλαδή, την προεπιλογή
include_many_to_many=False
καιcoverage_threshold=1.0
το ). Συνήθως αυτό είναι που θέλετε. - Χρησιμοποιήστε μια στενή εστίαση σε μικρότερα υποσύνολα πινάκων.
- Χρησιμοποιήστε την επικύρωση για να εντοπίσετε προβλήματα ποιότητας δεδομένων.
- Χρησιμοποιήστε
verbose=2
την εάν θέλετε να κατανοήσετε ποιες στήλες λαμβάνονται υπόψη για τη σχέση. Αυτό μπορεί να οδηγήσει σε μεγάλη ποσότητα εξόδου. - Να γνωρίζετε τις αντιδικίες των ορισμάτων αναζήτησης.
include_many_to_many=True
Τα καιcoverage_threshold<1.0
μπορεί να παράγουν ψευδείς σχέσεις που μπορεί να είναι πιο δύσκολο να αναλυθούν και θα χρειαστεί να φιλτραριστούν.
Εντοπισμός σχέσεων στο πλήρες σύνολο δεδομένων Synthea
Το απλό παράδειγμα γραμμής βάσης ήταν ένα εύχρηστο εργαλείο εκμάθησης και αντιμετώπισης προβλημάτων. Στην πράξη, μπορείτε να ξεκινήσετε από ένα σημασιολογικό μοντέλο, όπως το πλήρες σύνολο δεδομένων Synthea , το οποίο έχει πολύ περισσότερους πίνακες. Εξερευνήστε το πλήρες σύνολο δεδομένων synthea ως εξής.
Ανάγνωση όλων των αρχείων από τον κατάλογο 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'), }
Εύρεση σχέσεων μεταξύ των πινάκων, με χρήση της συνάρτησης
find_relationships
SemPy:suggested_relationships = find_relationships(all_tables) suggested_relationships
Απεικόνιση σχέσεων:
plot_relationship_metadata(suggested_relationships)
Μετρήστε πόσες νέες σχέσεις "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']
Μπορείτε να ταξινομήσετε τα δεδομένα σχέσης κατά διάφορες στήλες για να κατανοήσετε βαθύτερα τη φύση τους. Για παράδειγμα, μπορείτε να επιλέξετε να παραγγείλετε τα αποτελέσματα κατά
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:
- Εκμάθηση: Εκκαθάριση δεδομένων με λειτουργικές εξαρτήσεις
- Εκμάθηση: Ανάλυση λειτουργικών εξαρτήσεων σε ένα δείγμα σημασιολογικού μοντέλου
- Εκμάθηση: Εντοπισμός σχέσεων σε ένα μοντέλο σημασιολογίας, με χρήση σημασιολογικής σύνδεσης
- Εκμάθηση: Εξαγωγή και υπολογισμός μετρήσεων Power BI από ένα σημειωματάριο Jupyter