投稿者

インターシステムズジャパン
記事 Toshihiko Minamoto · 12月 16, 2022 6m read

IRIS IntegratedML を使用した母体リスクを予測する Web アプリ

母体リスクは、医学界でよく知られているいくつかのパラメーターから測定できます。 この測定により、医学界とコンピューター化されたシステム(特に AI)を支援すべく、科学者である Yasir Hussein Shakir は、母体リスクの検出/予測における ML アルゴリズムをトレーニングするための非常に便利なデータセットを公開しました。 このデータセットは、ML の最大級のデータリポジトリとして最もよく知られている Kaggle に公開されています。

https://www.kaggle.com/code/yasserhessein/classification-maternal-health-5-algorithms-ml

データセットについて

妊娠中と出産後の母体のヘルスケアに関する情報の不足により、妊娠中の女性の多くは、妊娠に関わる問題で死亡しています。 これは、農村地域や新興国の下位中流家庭の間でより一般的に起きている問題です。 妊娠中は、状態を絶えず観察することで、胎児の適切な成長と安全な出産を保証する必要があります(出典: https://www.kaggle.com/code/yasserhessein/classification-maternal-health-5-algorithms-ml)。

データは、IoT ベースのリスク監視システムを通じて、様々な病院、地域の診療所、妊産婦ヘルスケアから収集されています。

  • Age: 女性が妊娠したときの年齢
  • SystolicBP: 最高血圧(mmHg)。妊娠中に重要な属性の 1 つ。
  • DiastolicBP: 最低血圧(mmHg)。妊娠中に重要な属性の 1 つ。
  • BS: モル濃度(mmol/L)による血糖値。
  • HeartRate: 1 分あたりの通常の安静時心拍数。
  • Risk Level: 前の属性を考慮した妊娠中の予測リスク強度レベル。

Kaggle から母体リスクデータを取得する

Kaggle の母体リスクデータは、Health-Dataset アプリケーション(https://openexchange.intersystems.com/package/Health-Dataset)を使って IRIS テーブルに読み込めます。 これを行うには、module.xml プロジェクトから依存関係(Health Dataset 用の ModuleReference)を設定します。

 
Health Dataset アプリケーションリファレンスを含む Module.xml
<?xml version="1.0" encoding="UTF-8"?>
<Exportgenerator="Cache"version="25">
  <Documentname="predict-diseases.ZPM">
    <Module>
      <Name>predict-diseases</Name>
      <Version>1.0.0</Version>
      <Packaging>module</Packaging>
      <SourcesRoot<src/iris</SourcesRoot>
      <ResourceName="dc.predict.disease.PKG"/>
      <Dependencies>
        <ModuleReference>
          <Name>swagger-ui</Name>
          <Version>1.*.*</Version>
        </ModuleReference>
        <ModuleReference>
          <Name>dataset-health</Name>
          <Version>*</Version>
        </ModuleReference>
      </Dependencies>
       <CSPApplication
        Url="/predict-diseases"
        DispatchClass="dc.predict.disease.PredictDiseaseRESTApp"
        MatchRoles=":{$dbrole}"
        PasswordAuthEnabled="1"
        UnauthenticatedEnabled="1"
        Recurse="1"
        UseCookies="2"
        CookiePath="/predict-diseases"
       />
       <CSPApplication
        CookiePath="/disease-predictor/"
        DefaultTimeout="900"
        SourcePath="/src/csp"
        DeployPath="${cspdir}/csp/${namespace}/"
        MatchRoles=":{$dbrole}"
        PasswordAuthEnabled="0"
        Recurse="1"
        ServeFiles="1"
        ServeFilesTimeout="3600"
        UnauthenticatedEnabled="1"
        Url="/disease-predictor"
        UseSessionCookie="2"
      />
    </Module>
   
  </Document>
</Export>

母体リスクを予測するための Web フロントエンドとバックエンドのアプリケーション

Open Exchange アプリのリンク(https://openexchange.intersystems.com/package/Disease-Predictor)に移動し、以下の手順に従います。

  • リポジトリを任意のローカルディレクトリに Clone/git pull します。
$ git clone https://github.com/yurimarx/predict-diseases.git
  • このディレクトリで Docker ターミナルを開き、以下を実行します。
$ docker-compose build
  • IRIS コンテナを実行します。
$ docker-compose up -d 
CREATE VIEW MaternalRiskTrain AS SELECT BS, BodyTemp, DiastolicBP, HeartRate, RiskLevel, SystolicBP, age FROM dc_data_health.MaternalHealthRisk
  • ビューを使用して AI モデルを作成します。
CREATE MODEL MaternalRiskModel PREDICTING (RiskLevel) FROM MaternalRiskTrain 
  • モデルをトレーニングします。
TRAIN MODEL MaternalRiskModel

背後の処理

母体リスク疾患を予測するためのバックエンドのクラスメソッド

InterSystems IRIS では、前に作成されたモデルを使って、SELECT の実行により予測することができます。

 
母体リスク疾患を予測するためのバックエンドのクラスメソッド
///母体リスクの予測
ClassMethodPredictMaternalRisk()As%Status
{
    Try{
      Setdata={}.%FromJSON(%request.Content)
      Set%response.Status=200
      Set%response.Headers("Access-Control-Allow-Origin")="*"
     
      Setqry="SELECT PREDICT(MaternalRiskModel) As PredictedMaternalRisk, "
                  _"age, BS, BodyTemp, DiastolicBP, HeartRate, SystolicBP "
                  _"FROM (SELECT "_data.BS_" AS BS, "
                  _data.BodyTemp_" As BodyTemp, "
                  _data.DiastolicBP_" AS DiastolicBP, "
                  _data.HeartRate_" AS HeartRate, "
                  _data.SystolicBP_" As SystolicBP, "
                  _data.Age_" AS age)"
      SettStatement=##class(%SQL.Statement).%New()
      SetqStatus=tStatement.%Prepare(qry)
      IfqStatus'=1{WRITE"%Prepare failed:"DO$System.Status.DisplayError(qStatus)QUIT}
      Setrset=tStatement.%Execute()
      Dorset.%Next()
 
      SetResponse={}
      SetResponse.PredictedMaternalRisk=rset.PredictedMaternalRisk
      SetResponse.Age=rset.Age
      SetResponse.SystolicBP=rset.SystolicBP
      SetResponse.DiastolicBP=rset.DiastolicBP
      SetResponse.BS=rset.BS
      SetResponse.BodyTemp=rset.BodyTemp
      SetResponse.HeartRate=rset.HeartRate
 
      WriteResponse.%ToJSON()
      Return1
     
    }Catcherr{
      write!,"Error name: ",?20,err.Name,
          !,"Error code: ",?20,err.Code,
          !,"Error location: ",?20,err.Location,
          !,"Additional data: ",?20,err.Data,!
      Return
    }
}

これで、どの Web アプリケーションもこの予測を使用して、結果を表示できるようになりました。 predict-diseases アプリケーションのソースコードは、frontend フォルダをご覧ください。