IRIS IntegratedML を使った腎臓病予測 Web アプリ
腎臓病は、医学会でよく知られるいくつかのパラメーターから発見することが可能です。 この測定により、医学界とコンピューター化されたシステム(特に AI)を支援すべく、科学者である Akshay Singh は、腎臓病の検出/予測における ML アルゴリズムをトレーニングするための非常に便利なデータセットを公開しました。 このデータセットは、ML の最大級のデータリポジトリとして最もよく知られている Kaggle に公開されています。https://www.kaggle.com/datasets/akshayksingh/kidney-disease-dataset
データセットについて
腎臓病データセットには、以下のメタデータ情報が含まれています(出典: https://www.kaggle.com/datasets/akshayksingh/kidney-disease-dataset)
- 赤血球、足浮腫、血糖値などの 25 種類の特徴量を含む 400 行のデータセット。
- 患者が慢性腎臓病を患っているかどうかを分類することが目的
- 分類は、'classification' と名付けられた属性が 'ckd'(慢性腎臓病)であるか 'notckd' であるかに基づいて行われます。
- データセットの作成者は、テキストと数値のマッピングやその他の変更点を含むデータセットのクリーニングを実施しました。 クリーニングの後、データセット作成者は EDA(探索的データ解析)を行い、データセットをトレーニングとテストに分割し、それらにモデルを適用しました。 分類結果は、最初はあまり満足のいくものではないことがわかっています。 そこで、Nan 値のある行をドロップする代わりに、ラムダ関数を使用して、それらの行を各カラムのモードに置き換えて、 もう一度データセットをトレーニングセットとテストセットに分割し、モデルに適用しました。 今度は、結果が改善され、ランダムフォレストと意思決定ツリーが、1.0 と 0 の誤分類の精度で最も良く実行することがわかりました。 分類のパフォーマンスは、混合行列、分類レポート、および制度の出力によって測定されています。
データセットの情報(出典: https://archive.ics.uci.edu/ml/datasets/chronic_kidney_disease )
データセットの収集には以下の表現を使用しています。
age - 年齢 bp - 血圧 sg - 比重 al - アルブミン値 su - 糖分 rbc - 赤血球 pc - 膿細胞 pcc - 膿細胞の塊 ba - 細菌 bgr - ランダム血糖値 bu - 血液尿素 sc - 血清クレアチニン sod - ナトリウム pot - カリウム hemo - ヘモグロビン pcv - ヘマトクリット値 wc - 白血球数 rc - 赤血球数 htn - 高血圧 dm - 糖尿病 cad - 冠動脈疾患 appet - 食欲 pe - 足浮腫 ane - 貧血症 class - クラス
属性の情報(出典: https://archive.ics.uci.edu/ml/datasets/chronic_kidney_disease)
24 + class = 25(数値 11 個、名義尺度 14 個)を使用します。
- 年齢(数値) 年数
- 血圧(数値) bp(mm/Hg)
- 比重(名義尺度) sg - (1.005,1.010,1.015,1.020,1.025)
- アルブミン値(名義尺度) al - (0,1,2,3,4,5)
- 糖分(名義尺度) su - (0,1,2,3,4,5)
- 赤血球(名義尺度) rbc - (normal,abnormal)
- 膿細胞(名義尺度) pc - (normal,abnormal)
- 膿細胞集塊(名義尺度) pcc - (present,notpresent)
- 最近(名義尺度) ba - (present,notpresent)
- ランダム血糖値(数値) bgr(mgs/dl)
- 血液尿素(数値) bu(mgs/dl)
- 血清クレアチニン(数値) sc(mgs/dl)
- ナトリウム(数値) sod(mEq/L)
- カリウム(数値) pot(mEq/L)
- ヘモグロビン(数値) hemo(gms)
- ヘマトクリット値(数値)
- 白血球数(数値) wc(cells/cumm)
- 赤血球数(数値) rc(100万/cmm)
- 高血圧(名義尺度) htn - (yes,no)
- 糖尿病(名義尺度) dm - (yes,no)
- 冠動脈疾患(名義尺度) cad - (yes,no)
- 食欲(名義尺度) appet - (good,poor)
- 足浮腫(名義尺度) pe - (yes,no)
- 貧血症(名義尺度) ane - (yes,no)
- 区分(名義尺度) class - (ckd,notckd)
Kaggle から腎臓データを取得する
Kaggle の腎臓データは、Health-Dataset アプリケーション(https://openexchange.intersystems.com/package/Health-Dataset)を使って IRIS テーブルに読み込めます。 これを行うには、module.xml プロジェクトから依存関係(Health Dataset 用の ModuleReference)を設定します。
腎臓病を予測するための 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 -dAI モデルをトレーニングするため管理ポータルのクエリ実行(http://localhost:52773/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen?$NAMESPACE=USER)に移動します。
トレーニングに使用するビューを作成します。
CREATE VIEW KidneyDiseaseTrain AS SELECT age, al, ane, appet, ba, bgr, bp, bu, cad, classification, dm, hemo, htn, pc, pcc, pcv, pe, pot, rbc, rc, sc, sg, sod, su, wc FROM dc_data_health.KidneyDisease- ビューを使用して AI モデルを作成します。
CREATE MODEL KidneyDiseaseModel PREDICTING (classification) FROM KidneyDiseaseTrain- モデルをトレーニングします。
TRAIN MODEL KidneyDiseaseModel- http://localhost:52773/disease-predictor/index.html に移動し、Disease Predictor フロントエンドを使用して、以下のように疾患を予測します。

背後の処理
腎臓病を予測するためのバックエンドのクラスメソッド
InterSystems IRIS では、前に作成されたモデルを使って、SELECT の実行により予測することができます。
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">bgr</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">bgr</span><span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">bp</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">bp</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">bu</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">bu</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">cad</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">cad</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">dm</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">dm</span><span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">hemo</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">hemo</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">htn</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">htn</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pc</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pcc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pcc</span><span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pcv</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pcv</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pe</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pe</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pot</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">pot</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">rbc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">rbc</span><span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">rc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">rc</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">sc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">sc</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">sg</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">sg</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">sod</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">sod</span><span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">su</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">su</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Set</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">wc</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">=</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">rset</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">wc</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Write</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">Response</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">%ToJSON</span><span style="color: #ffffff;">(</span><span style="color: #ffffff;">)</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Return</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">1</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">}</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Catch</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">err</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">{</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">write</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">!</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"Error name: "</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">?</span><span style="color: #d4b57c;">20</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">err</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">Name</span><span style="color: #ffffff;">,</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">!</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"Error code: "</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">?</span><span style="color: #d4b57c;">20</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">err</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">Code</span><span style="color: #ffffff;">,</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">!</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"Error location: "</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">?</span><span style="color: #d4b57c;">20</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">err</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">Location</span><span style="color: #ffffff;">,</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">!</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;">"Additional data: "</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">?</span><span style="color: #d4b57c;">20</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ade2ff;">err</span><span style="color: #ffffff;">.</span><span style="color: #dcdcaa;">Data</span><span style="color: #ffffff;">,</span><span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">!</span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">Return</span><span style="color: #d4d4d4;"> </span><span style="color: #d4b57c;"></span>
</div>
<div>
<span style="color: #d4d4d4;"> </span><span style="color: #ffffff;">}</span>
</div>
<div>
<span style="color: #ffffff;">}</span>
</div>
</div>
</div>
</div>
これで、どの Web アプリケーションもこの予測を使用して、結果を表示できるようになりました。 predict-diseases アプリケーションのソースコードは、frontend フォルダをご覧ください。