Amazon Web Services ブログ

患者記録を AWS Lake Formation FindMatches 変換と一致させる

患者のマッチングは、医療の相互運用性を実現する上で大きな障害です。患者レコードの不一致や患者の履歴の取得ができないと、十分な情報に基づいた臨床上の意思決定に大きな支障が生じ、診断ミスや治療の遅れを招く可能性があります。さらに、医療従事者は、患者データの重複排除にお金をかけることがよくあります。データベースで患者レコードの数が急速に増加している場合は特にそうです。電子医療記録 (EHR) により、患者の安全とケアの手配は近年大幅に改善しましたが、多くの医療機関は、患者の正確なマッチングの課題に未だに頭を抱えています。

患者レコードの重複は、人為的な番号の挿入、削除、置換、または置き間違えなど、さまざまな理由で発生します。患者レコードをデジタル化する光学式文字認識 (OCR) ソフトウェアもエラーを引き起こす可能性があります。

この問題を解決するために、複数のタイプのレコード一致アルゴリズムが存在します。これらのアルゴリズムには、関連フィールド (SSN、名前、生年月日など) 、音声符号化システムをグループ化して比較するといった基本的な決定論的方法に加えて、機械学習 (ML) を使用したより高度なアルゴリズムも含まれます。

AWS Lake Formation は、いくつかの簡単な手順を踏むだけで安全なデータレイクを構築できる HIPAA 対象サービスです。Lake Formation には FindMatches も含まれていて、さまざまなデータセットにわたってレコードを一致させたり、重複レコードを特定して削除したりできます。

この記事では、FindMatches ML 変換を使用して、合成的に生成されたデータセット内で一致する患者レコードを識別する方法を説明します。FindMatches を使用するのに、コードを書く必要も ML の仕組みを知っている必要もありません。これは、フィールドが完全に一致しない場合でも、信頼できる一意の個人識別子が含まれていない場合に、データ内で一致を見つけるのに役立ちます。

患者データセット

患者データは、その機密性により、さまざまな国のさまざまな規制を受けています。そのため、マッチングアルゴリズムをトレーニングする患者データが不足していることが多く、モデル開発が複雑になります。このような課題を回避するためによく用いられているのは、合成データを使う方法です。この記事では、オープンソースの Freely Extensible Biomedical Record Linkage Program (FEBRL) に基づいて患者データを生成します。FEBRL は、隠れマルコフモデル (HMM) を使用して、患者レコードの一致を調べるために名前と住所のデータを用意します。また、重複につながる実際の患者データセットを模倣することもできますが、これには以下の不一致が生まれる可能性があります。

  • 空白のフィールド。
  • スペルミス、文字の転置、記入欄の取り違えなどの誤植。
  • ミドルネームの短縮形がある一方、ミドルネームを略さずに記述したレコードもある。
  • さまざまな形式の住所と詳細。
  • OCR 関連のエラー。
  • 音声エラー。
  • グローバルに一意の患者または個人の識別子なし。医療従事者はどこも、その人に割り当てられた患者識別子を持っているかもしれませんが、SSN のような人の識別子を持っていない可能性もあります。そのため、キーのないデータセットを持っています。

FEBRL は、設定可能なパラメータに基づいてこれらのタイプのデータセットを生成して、各タイプのエラーの確率を変更できるため、重複に至るさまざまなシナリオを組み込むことができます。合成データセットの生成については、この記事の範囲外です。この記事では、事前に生成されたデータセットについて説明します。FindMatches の実行に使用する合成データセットを生成する手順は、簡単に説明すると次のとおりです。

  1. FEBRL をダウンロードしてインストールします。
  2. パラメータを変更して、期待どおりのデータセットを作成します。詳細については、FEBRL のデータセット生成手順を参照してください。
  3. データセットをクレンジングします (これにより、各レコードで同じスキーマが確認され、一重引用符とファミリーロールが削除されます) 。

この記事では、AWS リージョン米国東部 (バージニア北部) のデータセットを使用しています。

FRBRL 患者データ構造

次のテーブルは、FEBRL 患者データの構造を示しています。データには 40,000 レコードが含まれます。

元のレコードと重複レコードは一緒にグループ化されます。patient_id 値は、rec-<record number>-org/dup-<duplicate record number> という特定の形式で生成され、それに FEBRL データジェネレーターツールが続きます。

次のテーブルは、FindMatches ML 変換を使用して達成しようとしている作業のプレビューです。データセットを一致させると、結果のテーブルには入力テーブルの構造とデータが反映され、[match_id] 列が追加されます。一致したレコードには、同じ match_id 値が表示されます。偽陽性と偽陰性の可能性は依然としてありますが、変換は依然として非常に有益です。

前提条件

この記事のサンプルの合成患者データセットは、米国東部 (バージニア北部) のものを使用しているため、この記事に記載されているすべての手順は同じ AWS リージョン (us-east-1) で実行する必要があります。けれども、データが別のリージョンにあっても簡単に変更できます。

ソリューションのアーキテクチャ

次の図は、ソリューションのアーキテクチャを示しています。

 

 

ソリューションの概要

一致プロセスは大まかに次のステップに分けられます。

  1. Amazon S3 バケットに生の患者データセットを csv 形式でアップロードします
  2. AWS Glue クローラを使用して、アップロードされた患者データセットをクロールします
  3. AWS Glue データカタログを使用して患者データをカタログ化し、FindMatches ML 変換を行います。
  4. ML 変換を使用するか手動でラベルセットを作成し、一致するレコードと一致しないレコードのラベル付けしたサンプルを提供して FindMatches を学習します。ラベルをアップロードして、予測の品質を推定します。さらにラベルセットを追加し、必要に応じてこの手順を繰り返して、必要な適合率 (Precision)、正解率 (Accuracy)、再現率 (Recall) を取得します。
  5. FindMatches 変換を使用する AWS Glue ETL ジョブを作成して実行します。
  6. FindMatches 変換の結果を Amazon S3 バケットに保存します
  7. FindMatches ML 変換結果の AWS Glue データカタログを作成します。
  8. Amazon Athena で変換結果を確認します。

データのカタログ化と FindMatches ML 変換の作成

FindMatches は AWS Glue データカタログで定義されたテーブルで動作します。AWS Glue クローラを使用して、患者データを検出してカタログ化します。この記事用に生成された FEBRL 患者データを使用することもできます。

以下に示す Cloudformation スタックは、-us-east-1 (米国東部 (バージニア北部)) の AWS リージョンにリソースを作成します

AWS Glue でカタログおよび FindMatches ML 変換を作成するには、次のスタックを起動します。


このスタックは、次のリソースを作成します。

  • ML 変換結果を格納する Amazon S3 バケット (起動の一部として設定可能) 。バケットの名前は、AWS CloudFormation スタックコンソールの Outputs で見つけることができます。この記事では S3BucketName という名前を使用します。
  • AWS Glue が S3 を含む他のサービスにアクセスできるようにする IAM ロール。
  • AWS Glue データベース (起動の一部として設定可能) 。
  • Public Original Synthetic Patients Dataset (起動の一部として設定可能) を表す AWS Glue テーブル。
  • AWS Glue テーブルとしてソースを使用し、Accuracyを 1 に、Precisionを 0.9 に設定した AWS Glue ML 変換。

詳細については、「AWS Lake Formation FindMatches を使用したデータセットの統合と重複排除」を参照してください。

ML 変換の調整

臨床医が患者に関する不正確な情報を正確であると信じる偽陽性一致の安全性リスクは、臨床医が患者に関する既存の情報にアクセスできない偽陰性一致の安全性リスクよりも大きい場合があります。(詳細については、NCBI ウェブサイト上の関連研究を参照してください)。 したがって、RecallPrecision のスライダーを Precision の方に動かすと、レコードが同じ患者に属しているかどうかを識別するのに高水準の信頼度が得られ、誤検出一致の安全性リスクを最小限に抑えることができます。

Accuracy を高く設定すると、より多くのレコードを比較するために実行時間 (およびそれに伴いコスト) が増大するものの、再現率が高まります。

この特定のデータセットに対して比較的優れた結果を達成するために、起動スタックはすでに変換を作成しました。その際、RecallPrecision スライダーを Precision に向けて 0.9 に設定し、Lower CostAccuracy スライダーを Accuracy に設定します。必要に応じて、変換を選択し、Tune メニューを使用して、これらの値を後で調整できます。

ラベル付けしたデータを使用して FindMatches に学習させる

起動スタックを正常に実行した後、ラベルセットを使用して一致するレコードと一致しないレコードを提供することにより、変換をトレーニングできます。

ラベル付けセットの作成

ラベル付けセットを自分で作成するか、AWS Glue にヒューリスティックに基づいてラベル付けセットを生成させることができます。

AWS Glue はソースデータからレコードを抽出し、一致する可能性のあるレコードを提案します。生成されたラベルセットファイルには、作業を行うための約 100 個のデータサンプルが含まれています。

この記事では、AWS Glue で生成されたラベル付けされたデータファイルを提供します。これは、完全に記入されたラベル列とともに使用できます。このファイルはすぐに使用可能な状態です。

この記事で提供されている 事前に生成されたラベル付けされたデータファイルを使用することにした場合、以下のファイル生成のラベル付けのステップをスキップしてください

トレーニングセットを作成するには、次の手順を実行します。

  1. AWS Glue コンソールで、ETL、ジョブ、および ML 変換の下に、提供されたスタックが作成した cfn-findmatches-ml-transform-demo という名前の ML 変換が作成されます。
  2. ML 変換 [cfn-findmatches-ml-transform-demo] を選択し、[アクション] をクリックして [変換の学習] を選択します
  3. ラベルを使用して変換を教えるには、[ラベルなし] を選択します。
  4. [ラベル付けファイルの生成] を選択します。
  5. 生成されたラベルファイルを保存する S3 パスを指定します。
  6. [次へ] を選択します。

次のテーブルは、空の [ラベル] 列を持つ生成済みのラベル付けされたデータファイルを示しています。

同じ値で実際に一致するレコードにマークを付けて、[ラベル] 列にデータを入力する必要があります。各ラベルセットには、正と負の一致例を含める必要があります。

この記事では、ラベル付けされたデータファイルを提供します。これは、完全に記入された [ラベル] 列とともに使用できます。このファイルはすぐに使用可能な状態です。

次のテーブルは、[ラベル] 列が完全に入力されたテーブルを示しています。

ラベル付けファイルは入力データと同じスキーマを有していますが、[labeling_set_id] と [ラベル] の 2 列が追加されています。

トレーニングデータセットは複数のラベル付けセットに分割されます。各ラベル付けセットには labeling_set_id 値が表示されます。このように識別されることでラベル付けプロセスが簡素化され、ファイル全体をスキャンする場合よりも、同一ラベル付けセット内におけるレコードの一致関係に集中することができます。前述のデータセットの場合、正規表現を使用してサフィックス -org-dup を削除することにより、patient_id からラベル値を抽出します。ただし、一般的には、属性値に基づいて一致するレコードに応じてこれらのラベルを割り当てます。

あるラベル付けセット内で複数のレコードに同じラベル値を指定すると、それらのレコードを一致と見なすよう FindMatches 変換に教えることになります。また、同一ラベル付けセット内で複数のレコードが異なるラベルを付けられている場合、FindMatches はそれらのレコードを一致と見なさないよう学習します。変換は同一ラベル付けセット内にあるレコード間のレコードの関係を評価します。複数のラベル付けセットをまたいでの評価はしません。

適度な一致品質を実現するには数百のレコードにラベルを付け、高い一致品質を実現するには数千のレコードにラベルを付ける必要があります。

ラベルをアップロードして一致品質を確認する

ラベル付けされたデータセット (.csv 形式である必要があります) を作成したら、FindMatches にその場所を学習させます。次の手順を実行します。

  1. AWS Glue コンソールで、先の手順で作成した変換を選択します。
  2. [アクション] を選択します。
  3. [変換の学習] をクリックします。
  4. [ラベルのアップロード] では、[ラベルあり] を選択します。
  5. [S3 からラベル付けファイルをアップロード] を選択します。
  6. [次へ] を選択します。
  7. このブログ記事で提供されているラベルセットを使用する場合は、こちらからラベルセットをダウンロードしてください
  8. 先に起動した上記の cloudformation テンプレートで作成したのと同じ S3 バケットに、trainingset という名前のフォルダを作成します。
  9. 同じ S3 バケットの trainingset フォルダに上記のラベルセットをアップロードします
  10. [既存のラベルを上書き] を選択します。使用しているラベルは 1 セットのみです。ラベルを繰り返し追加する場合は、[既存のラベルに追加] オプションを選択します。
  11. [アップロード] を選択します。ラベルがアップロードされたら、変換は使用準備完了です。必ずしも必要なわけではありませんが、一致レコードおよび不一致レコードのメトリクスを確認して、変換の一致品質をチェックしてください。
  12. [変換品質の推定] を選択します。この変換品質推定機能は、ラベルの 70% を使用して学習します。トレーニングが完了すると、品質推定機能は残りの 30% に対する一致レコードの特定を行い、変換の学習度合いをテストします。最後に、変換はアルゴリズムによって予測された一致および不一致と実際のラベルを比較して、品質メトリクスを生成します。このプロセスには数分かかる場合があります。

結果は、次のスクリーンショットのようになるはずです。

このテストでは品質の推定にデータのほんの小さなサブセットしか使用しないため、これらのメトリクスは概算として考えてください。メトリクスに満足したら、レコード一致ジョブの作成と実行に進みます。満足できなければ、一致品質向上のため、ラベル付けしたレコードを追加アップロードします。

AWS Glue ETL ジョブを作成して実行する

FindMatches 変換を作成し、変換がデータ内の一致レコードを特定できるほど学習したことを検証できたら、データセット全体で一致を特定する準備は完了です。レコード一致ジョブを作成して実行するには、次の手順を実行します。

  1. スタックを起動したときに AWS CloudFormation テンプレートが作成した S3 バケット内に transformresults フォルダを作成します。AWS Glue ジョブの MLTransform 結果はこのフォルダに保存します。
  2. AWS Glue コンソールの [ジョブ] で、[ジョブの追加] を選択します。
  3. [ジョブプロパティの設定] の [名前] に、ジョブの名前を入力します。
  4. [IAM ロール] では、ドロップダウンメニューからロールを選択します。AWS CloudFormation スタックが作成した、AWSGlueServiceRoleMLTransform という IAM ロールを選択します。詳細については、[AWS Glue の IAM ロールを作成する] を参照してください。
  5. Glue バージョンのタイプとして [Spark] の Spark 2.2、Python 2 (Glue バージョン 0.9) を選択します
  6. AWS Glue が生成した提案スクリプトとして実行されるジョブを選択します。
  7. [データソースの選択] では、変換データソースを選択します。この記事ではデータソース cfn_table_patient を使用します。
  8. [変換タイプの選択] で、[一致レコードの検索] を選択します。
  9. [ワーカータイプ] では、[G.2X] を選択します。
  10. [ワーカー数] には、10 と入力します。この数を増やすことで、データセットのサイズに基づいてワーカーを追加できます。
  11. 重複と特定されたレコードを確認する場合は、[重複レコードの削除] を選択しないでください。
  12. [次へ] を選択します。
  13. 作成した変換を選択します。
  14. [次へ] を選択します。
  15. [データターゲットの選択] では、[データターゲットでテーブルを作成] を選択します。
  16. [データストア] では、[Amazon S3] を選択します。
  17. [形式] では、[CSV] を選択します。
  18. [圧縮タイプ] では、[なし] を選択します。
  19. ]ターゲットパス] では、ジョブの出力のパスを選択します。ターゲットパスは、先に作成した transformresults という名前のフォルダとともに、AWS CloudFormation が作成した S3 バケットです。
  20. [ジョブを保存してスクリプトを編集] を選択します。これでスクリプトがそのまま使用できる状態でジョブに生成されました。または、スクリプトをさらにカスタマイズして独自の ETL ニーズに合わせることもできます。
  21. このデータセットの一致の特定を開始するには、下の画面に示す [ジョブの実行] を選択します。現時点では、ジョブパラメータをデフォルト設定のままにして、ジョブの開始後にこのページを閉じます。次のスクリーンショットは AWS Glue が ML Transform を使用して生成した提案 Python Spark スクリプトを表示しています。実行が完了すると、FindMatches の実行ステータスは [Succeeded] と表示されます。実行が完了するまでに数分かかる場合があります。

FindMatches は、ジョブの作成中に指定したターゲットパスにマルチパートの .csv ファイルとして出力データを保存します。結果の.csv ファイルは入力テーブルの構造とデータをミラーリングしますが、[match_id] 列があります。一致したレコードには、同じ match_id 値が表示されます。

変換結果のデータカタログを作成する

出力を表示するには、マルチパートの.csv ファイルを S3 バケットから直接ダウンロードして好みのエディターで確認するか、Athena を使用して S3 に保存されているデータに対して SQL のようなクエリを実行できます。Athena を使用してデータを表示するには、FindMatches ETL ジョブの出力の一部として作成したマルチパートの .csv ファイルでフォルダをクロールする必要があります。

AWS Glue に移動し、AWS Glue クローラを使用して、患者の一致のために既存のデータベースに新しいテーブルを作成し、ソースデータとともに FindMatches ETL ジョブから出力したレコードを保持します。これは、マルチパートの .csv ファイルを含む S3 バケットのフォルダになります。この記事のソースデータは、AWS CloudFormation スタックで作成したバケット内のフォルダ transformresults です。

クローラを作成するには、次の手順を実行します。

  1. AWS Glue コンソールの [データカタログ] で、[クローラ] を選択します
  2. [クローラの追加] をクリックして、変換結果をクロールする新しいクローラを作成します。
  3. クローラの名前を指定して、[次へ] をクリックします。
  4. クローラソースタイプ として [データストア] を選択し、[次へ] をクリックします。
  5. [データストアの追加] セクションの [データストアの選択] で、[S3] を選択します。
  6. [データのクロール先] では、[アカウントで指定されたパス] を選択します。
  7. [含めるパス] には、パスの名前を入力します。これは、以前に作成した transformresults という名前のフォルダとともに cloudformation が作成したものと同じ S3 バケットでなければなりません。フォルダにマルチパート csv ファイルが作成されていることを確認します。
  8. [次へ] を選択します。
  9. [IAM ロールの選択] セクションで、[IAM ロールの選択] をクリックします。
  10. [IAM ロール] には、クローラの名前を入力します。
  11. [次へ] を選択します。
  12. [頻度] では、[オンデマンドで実行] を選択します。
  13. [データベース] を cfn-database-patient に設定して、クローラの出力を設定します。
  14. テーブルに追加されたプレフィックスの値を table_results_ に設定します。これは、変換結果を含むテーブルを識別するのに役立ちます。
  15. [完了] をクリックします。
  16. 同じクローラを選択して、[クローラの実行] を選択します。クローラの実行が完了すると、クローラの設定中に選択した各データベース中にクローラ設定に対応する新しいテーブルが作成されたのを確認できます。
  17. AWS Glue コンソールの [データベース] で、[テーブル] を選択します。
  18. [アクション] を選択します。
  19. [表の詳細の編集] を選択します。
  20. [Serde シリアル化リブ] には、org.apache.hadoop.hive.serde2.OpenCSVSerde と入力します。
  21. [Serde パラメータ] の下に、キー escapeChar を追加して、値を \\ にします。
  22. キー quoteChar を追加して、値を " (二重引用符) にします。
  23. キー field.delim を設定して、値を , にします
  24. キー separatorChar を追加し、値を , とすると、保有するデータセットのタイプに基づいて Serde パラメータを設定できます。
  25. すべての列のデータ型を String に設定して、テーブルのスキーマを編集します。テーブルのスキーマを編集するには、テーブルをクリックして、[スキーマの編集] ボタンをクリックします。

必要に応じて、クローラによって推定されたデータ型を保持することもできます。この記事では、簡単にするためにすべて String データ型を設定していますが、[match_id] 列は bigint として設定しています。

Amazon Athena を使用して出力を確認する

Amazon Athena で出力を確認するには、次の手順を実行します。

  1. データカタログから、[テーブル] を選択します。
  2. クローラによって作成されたテーブル名を選択し、結果を確認します。
  3. [アクション] を選択します。
  4. [データの表示] を選択します。

    Athena コンソールが開きます。 初めて Amazon Athena を実行する場合は、使用開始をクリックする必要があるかもしれません。最初のクエリを実行する前に、Amazon S3 でクエリ結果の場所を設定する必要もあります。Amazon Athena コンソールで、[Amazon S3 でクエリ結果の場所を設定] をクリックし、クエリ結果の場所を設定します。cloudformation によって以前に作成された同じ Amazon S3 バケットに追加のフォルダを作成できます。S3 パスが / で終わっていることを確認してください。
  5. 適切なデータベースを選択します。この記事では、[cfn-database-patient] を選択します。データベースがドロップダウンに表示されない場合は、データソースを更新する必要があるかもしれません。
  6. FindMatches 出力を含む結果テーブルを選択します。FindMatches 出力には [match_id] 列の患者レコードが含まれています。この場合、table_results_transformresults になります。結果テーブルに別の名前を選択した場合、正しいテーブル名を反映するために以下のクエリを変更する必要があります。
  7. [クエリの実行] を選択して、以下のクエリを実行します。
    SELECT * FROM "cfn-database-patient"."table_results_transformresults" order by match_id;

次のスクリーンショットは、出力を示しています。

セキュリティに関する考慮事項

AWS Lake Formation は、アクセスに使用するサービスに関係なく、きめ細かなデータアクセスポリシーを設定できる 1 つの場所を提供することで、データの保護に役立ちます。

Lake Formation を使用してデータアクセスポリシーの制御を一元化するには、最初に S3 のバケットへの直接アクセスをシャットダウンして、Lake Formation がすべてのデータアクセスを管理できるようにします。Lake Formation を使用してデータ保護とアクセスポリシーを設定します。これにより、データレイクにアクセスするすべての AWS のサービスにこれらのポリシーが適用されます。ユーザーとロールを設定し、ロールがアクセスできるデータをテーブルおよび列レベルまで定義できます。

AWS Lake Formation は、単純な許可/取り消しメカニズムに基づいたアクセス許可モデルを提供します。Lake Formation のアクセス許可は IAM のアクセス許可と組み合わせて、データレイクに保存されているデータおよびそのデータを記述するメタデータへのアクセスを制御します。詳細については、「セキュリティと、Lake Formation のメタデータとデータへのアクセス制御」を参照してください。

Lake Formation は現在、S3 (SSE-S3、AES-265) のサーバー側の暗号化をサポートしています。Lake Formation は VPC のプライベートエンドポイントもサポートし、すべてのアクティビティを AWS CloudTrail に記録するため、ネットワークの分離と監査機能があります。

AWS Lake Formation サービスは、HIPAA 対象サービスです。

まとめ

この記事では、Lake Formation FindMatches ML 変換を使用して患者データベースで一致するレコードを検出する方法を示しました。2 つのデータセットのレコードが共通の識別子を共有していないか、重複を含んでいない場合でも一致を見つけることができます。フィールドが完全に一致しない、または属性がないか破損している場合に、この方法がデータセットの列間の一致を検出するのに役立ちます。

これで、Lake Formation で構築を開始し、お持ちのデータに対して FindMatches を試行する準備ができました。ご意見やご質問があれば、コメント欄にご記入ください。

 


著者について

Dhawalkumar Patel は、アマゾン ウェブ サービスのシニアソリューションアーキテクトです。 彼は、大企業から中規模の新興企業に至るまで、分散コンピューティングや人工知能に関連する問題で協力してきました。彼は現在、機械学習とサーバーレステクノロジーに注力しています。

 

 

 

Ujjwal Ratan は、アマゾン ウェブ サービスの グローバルヘルスケア & ライセンスチームの機械学習に関するプリンシパルスペシャリストソリューションアーキテクトです。 彼は医療用画像処理、非構造化臨床テキスト、ゲノミクス、精密医療、臨床試験、および医療の質の向上など、実社会の業界の問題への機械学習と深層学習の適用に取り組んでいます。また、加速されたトレーニングや推論のための AWS クラウド上での機械学習/深層学習の学習アルゴリズムのスケーリングに関する専門知識を持っています。自由な時間には音楽の鑑賞 (と演奏) そして家族との計画外のロードトリップを楽しんでいます。