投稿者

インターシステムズジャパン
記事 Toshihiko Minamoto · 3月 10, 2023 9m read

IRIS IntegratedML を使った糖尿病予測 Web アプリ

糖尿病は、医学会でよく知られるいくつかのパラメーターから発見することが可能です。 この測定により、医学界とコンピューター化されたシステム(特に AI)を支援すべく、(米)国立糖尿病・消化器・腎疾病研究所(NIDDK)は、糖尿病の検出/予測における ML アルゴリズムをトレーニングするための非常に便利なデータセットを公開しました。 このデータセットは、ML の最大級のデータリポジトリとして最もよく知られている Kaggle に公開されています: https://www.kaggle.com/datasets/mathchi/diabetes-data-set

糖尿病データセットには、以下のメタデータ情報が含まれています(出典: https://www.kaggle.com/datasets/mathchi/diabetes-data-set):

  • Pregnancies: 妊娠回数
  • Glucose: 経口ブドウ糖負荷試験における 2 時間後の血漿グルコース濃度
  • BloodPressure: 拡張期血圧(mm Hg)
  • SkinThickness: 上腕三頭筋皮下脂肪厚(mm)
  • Insulin: 2 時間血清インスリン(mu U/ml)
  • BMI: ボディマス指数(体重 kg/(身長 m)^2)
  • DiabetesPedigreeFunction: 糖尿病血統要因(親族の糖尿病歴、およびこれらの親族と患者の遺伝的関係に関するいくつかのデータが提供されました。 この遺伝的影響の測定により、真性糖尿病の発症に伴う遺伝的リスクについての考えが得られました - 出典: https://machinelearningmastery.com/case-study-predicting-the-onset-of-diabetes-within-five-years-part-1-of-3/
  • Age: 年齢
  • Outcome: クラス変数(0 または 1)

インスタンス数: 768

属性数: 8 + class

各属性について:(すべて数値)

  1. 妊娠回数
  2. 経口ブドウ糖負荷試験における 2 時間後の血漿グルコース濃度
  3. 拡張期血圧(mm Hg)
  4. 上腕三頭筋皮下脂肪厚(mm)
  5. 2 時間血清インスリン(mu U/ml)
  6. ボディマス指数(体重 kg/(身長 m)^2)
  7. 糖尿病血統要因
  8. 年齢
  9. クラス変数(0 または 1)

属性値の欠落: あり

クラス分布:(クラス値 1 は「糖尿病の検査で陽性」として解釈)

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"?>
<Export generator="Cache" version="25">
    
  &lt;Document name="predict-diseases.ZPM"&gt;
    &lt;Module&gt;
      &lt;Name&gt;predict-diseases&lt;/Name&gt;
      &lt;Version&gt;1.0.0&lt;/Version&gt;
      &lt;Packaging&gt;module&lt;/Packaging&gt;
      &lt;SourcesRoot&gt;src/iris&lt;/SourcesRoot&gt;
      &lt;Resource Name="dc.predict.disease.PKG"/&gt;
      &lt;Dependencies&gt;
        &lt;ModuleReference&gt;
          &lt;Name&gt;swagger-ui&lt;/Name&gt;
          &lt;Version&gt;1.*.*&lt;/Version&gt;
        &lt;/ModuleReference&gt;
        &lt;ModuleReference&gt;
          &lt;Name&gt;dataset-health&lt;/Name&gt;
          &lt;Version&gt;*&lt;/Version&gt;
        &lt;/ModuleReference&gt;
      &lt;/Dependencies&gt;
       &lt;CSPApplication
        Url="/predict-diseases"
        DispatchClass="dc.predict.disease.PredictDiseaseRESTApp"
        MatchRoles=":{$dbrole}"
        PasswordAuthEnabled="1"
        UnauthenticatedEnabled="1"
        Recurse="1"
        UseCookies="2"
        CookiePath="/predict-diseases"
       />
       &lt;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"
      />
    &lt;/Module&gt;
   
  &lt;/Document&gt;

</Export>

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

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

  1. リポジトリを任意のローカルディレクトリに Git pull します。

$ git clone https://github.com/yurimarx/predict-diseases.git

  1. このディレクトリで Docker ターミナルを開き、以下を実行します。
$ docker-compose build
  1. IRIS コンテナを実行します。

$ docker-compose up -d 

  1. AI モデルをトレーニングするための Execute Query into Management Portal(http://localhost:52773/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen?$NAMESPACE=USER)に移動します。
  2. トレーニングに使用するビューを作成します。

CREATE VIEW DiabetesTrain AS SELECT Outcome, age, bloodpressure, bmi, diabetespedigree, glucose, insulin, pregnancies, skinthickness FROM dc_data_health.Diabetes

  1. ビューを使用して AI モデルを作成します。

CREATE MODEL DiabetesModel PREDICTING (Outcome) FROM DiabetesTrain

  1. モデルをトレーニングします。

TRAIN MODEL DiabetesModel

  1. http://localhost:52773/disease-predictor/index.html に移動し、Disease Predictor フロントエンドを使用して、以下のように疾患を予測します。 Disease-Predictor

背後の処理

糖尿病を予測するためのバックエンドのクラスメソッド

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

 
糖尿病を予測するためのバックエンドのクラスメソッド
/// Predict Diabetes

ClassMethod PredictDiabetes() As %Status
          
{

    Try {

          
      Set data = {}.%FromJSON(%request.Content)
     
      Set qry = "SELECT PREDICT(DiabetesModel) As PredictedDiabetes, "
                  _"age, bloodpressure, bmi, diabetespedigree, glucose, insulin, "
                  _"pregnancies, skinthickness "
                  _"FROM (SELECT "_data.age_" AS age, "
                  _data.bloodpressure_" As bloodpressure, "
                  _data.bmi_" AS bmi, "
                  _data.diabetespedigree_" AS diabetespedigree, "
                  _data.glucose_" As glucose, "
                  _data.insulin_" AS insulin, "
                  _data.pregnancies_" As pregnancies, "
                  _data.skinthickness_" AS skinthickness)"
      Set tStatement = ##class(%SQL.Statement).%New()
      Set qStatus = tStatement.%Prepare(qry)
      If qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
      Set rset = tStatement.%Execute()
      Do rset.%Next()
 
      Set Response = {}
      Set Response.PredictedDiabetes = rset.PredictedDiabetes
      Set Response.age = rset.age
      Set Response.bloodpressure = rset.bloodpressure
      Set Response.bmi = rset.bmi
      Set Response.diabetespedigree = rset.diabetespedigree
      Set Response.glucose = rset.glucose
      Set Response.insulin = rset.insulin
      Set Response.pregnancies = rset.pregnancies
      Set Response.skinthickness = rset.skinthickness
 
      Set %response.Status = 200
      Set %response.Headers("Access-Control-Allow-Origin")="*"
     
      Write Response.%ToJSON()
     
      Return 1
     
    } Catch err {
      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 フォルダをご覧ください。

元の記事へ さんが書いた @Yuri Marx