2017年9月28日木曜日

ネット記事コーパス


 抄録コーパスと同じく、学習に用いるデータを一様にするため、収集したネット記事からランダムに学習データを抽出した。その抽出した学習データプロフィールを下表に示す。


#疾患文書数総語数総異なり語数
11Net:keigan5001785467
12Net:naimaku5001793496
13Net:kinsyu5002806647
14Net:ransou5001917487
15Net:taigan5001645418

総語数の平均は3,438語(標準偏差2,721)、異なり語数の平均は503語(標準偏差77)であった。

2017年9月27日水曜日

ネット記事の疾患予測サーバの性能

ネット記事データで学習したベイズ分類器の分類実験を行った。 学習データは各カテゴリ50件,総数で250件の抄録である。



正確度(Accuracy)は88.2%であった。これはKHcoderのときよりも正確度が低くなっている。
理由としては、「taigan」の精度が46.2%と低いためであると考えられる。なお、この結果はストップワードを使用している。



また、ストップワードをかけずに分類実験を行った結果を下記に示す。



正確度は90.6%となった。

疾患予測WebAPI

疾患予測サーバが提供するWebAPIはHL7 FHIRのRiskAssessmentリソースを用いてリクエスト及びレスポンスを送る。

リクエスト

クライアントが疾患予測サーバに分類対象となるテキストを送る。以下は,リクエストを送るjavascriptプログラムの一部分。
 // ここで HL7 FHIR の RiskAssessment リソースで予測システム(api-predict)へリクエストを送る
 var riskAssessment = {
  "resourceType": "RiskAssessment",
  "status": "final",
  "basis": [
   {
    "reference": text
   }
  ],
  "comment": "Naive Bayes Classifier Ver.1.0"
 };
 
 
 $.ajax({
  url: 'http://192.168.11.251/~nlp_ai/api-predict.php',
  type: 'POST',
  headers: {
   'Content-Type': 'application/json;charset=utf-8'
  },
  async: false,
  data: JSON.stringify(riskAssessment),
  processData: true,
  dataType: 'json'
 })
 .done(function(data, textStatus, jqXHR) {
  ・・・以下,疾患予測サーバからのレスポンスを処理する・・・

以下は,上記プログラムでサーバー側に送られたJSON形式のリクエストメッセージ。
{
 "resourceType":"RiskAssessment",
 "status":"final",
 "basis":[
  {
   "reference":"ここに疾患分類対象のテキストを設定する。・・・"
  }
 ],
 "comment":"Naive Bayes Classifier Ver.1.0"
}

本来,RiskAssessment.basis.referenceにはリスク評価に用いる情報(FamilyHistory, Observations, Procedures, Conditions, etc.)への参照(Reference)を記述することになっているが,ここでは,直接分類対象のテキストを設定した。

レスポンス

これに対するレスポンスは,複数のRiskAssessmentリソースをBundleリソースで束ねたものとした。
以下は,疾患予測サーバーが返すレスポンスメッセージ。
{
 "status":"final",
 "resourceType":"RiskAssessment",
 "basis[0][reference]":"不妊症。",
 "comment":"Naive Bayes Classifier Ver.1.0",
 "bundle":{
  "resourceType":"Bundle",
  "type":"message",
  "entry":[
   {
    "resourceType":"RiskAssessment",
    "status":"final",
    "prediction":[
     {
      "outcome":{"text":"naimaku"},
      "probability":1.4142274696827
     }
    ]
   },{
    "resourceType":"RiskAssessment",
    "status":"final",
    "prediction":[
     {
      "outcome":{"text":"kinsyu"},
      "probability":1.398112511866
     }
    ]
   },{
    "resourceType":"RiskAssessment",
    "status":"final",
    "prediction":[
     {
      "outcome":{"text":"taigan"},
      "probability":0.48504086418881
     }
    ]
   },{
    "resourceType":"RiskAssessment",
    "status":"final",
    "prediction":[
     {
      "outcome":{"text":"ransou"},
      "probability":-0.20820912181313
     }
    ]
   },{
    "resourceType":"RiskAssessment",
    "status":"final",
    "prediction":[
     {
      "outcome":{"text":"keigan"},
      "probability":-0.21748840888999
     }
    ]
   }
  ]
 }
}
Bundle.entry配列に疾患ごとのRiskAssessmentリソースで分類結果が返ってくる。疾患名は,RiskAssessment.prediction[0].outcome.textに,スコアはRiskAssessment.prediction[0].probabilityに設定されている。
下記は,上記のレスポンスを画面編集するクライアント側のプログラムの一部である。
.done(function(data, textStatus, jqXHR) {
 var html = '<table class="table table-hover table-striped">';
 html += '<caption>予測結果(あくまでも予測です。気になる場合は病院に受診してください。)</caption>';
 html += '<tr>';
 html += '<th>#</th>';
 html += '<th>疾患</th>';
 html += '<th>判定スコア</th>';
 html += '</tr>';
 var i = 1;
 $.each(data.bundle.entry, function(index, riskAssessment){
  html += '<tr>';
  html += '<td>' + (i++) + '</td>';
  html += '<td>';
  html += DISEASE_NAME[riskAssessment.prediction[0].outcome.text];
  html += '</td>';
  html += '<td>';
  html += riskAssessment.prediction[0].probability;
  html += '</td>';
  html += '</tr>';
 });
 html += '</table>';
 $("#predict-result-list").html(html);
})

2017年9月20日水曜日

考察

分類実験の結果を見ると,総語数の少ない子宮内膜症の適合率が他のカテゴリに比べて小さく,逆に再現率は大きい。なぜそうなるかを考察する。

疾患予測サーバの性能

医中誌抄録データで学習したベイズ分類器の分類実験を行った。
学習データは各カテゴリ500件,総数で2,500件の抄録である。KHcoderで抽出した複合語をMeCabのユーザ辞書に登録した。
まず,形態素解析で名詞のみ抽出した場合の混同行列を下表に示す。

疾患 keigan kinsyu naimaku ransou taigan 総計 再現率
keigan 147 14 13 8 18 200 73.5%
kinsyu 3 151 26 7 13 200 75.5%
naimaku 1 7 183 2 7 200 91.5%
ransou 9 4 13 162 12 200 81.0%
taigan 20 12 11 14 143 200 71.5%
総計 180 188 246 193 193 1000  
適合率 81.7% 80.3% 74.4% 83.9% 74.1%   78.6%

なお,ストップワードは設定していない。また,単語の出現頻度は1語以上とした。検証に用いたデータは,学習データとは異なる,ランダムに抽出した各カテゴリ200件のデータである。
正確度(Accuracy)は78.6%であった。

次にストップワードに「がん,癌,筋腫,子宮,子宮筋腫,子宮体がん,子宮体癌,子宮内膜症,子宮頸がん,子宮頸癌,腫瘍,内膜症,卵巣,卵巣腫瘍,」を設定した場合の結果を下表に示す。

疾患 keigan kinsyu naimaku ransou taigan 総計 再現率
keigan 133 16 16 9 26 200 66.5%
kinsyu 4 121 41 16 18 200 60.5%
naimaku 2 8 180 4 6 200 90.0%
ransou 9 5 17 155 14 200 77.5%
taigan 30 13 13 25 119 200 59.5%
総計 178 163 267 209 183 1000  
適合率 74.7% 74.2% 67.4% 74.2% 65.0%   70.8%

正確度は70.8%となり,8ポイント下がった。

全品詞を使った場合

次に,形態素解析で得られた全品詞を用いた場合の結果を下表に示す。
 
疾患 keigan kinsyu naimaku ransou taigan 総計 再現率
keigan 139 16 15 11 19 200 69.5%
kinsyu 3 148 27 9 13 200 74.0%
naimaku 2 9 182 1 6 200 91.0%
ransou 8 3 16 160 13 200 80.0%
taigan 23 13 11 14 139 200 69.5%
総計 175 189 251 195 190 1000  
適合率 79.4% 78.3% 72.5% 82.1% 73.2%   76.8%

正確度は名詞のみの場合に比べて2ポイントほど下がった。
次にストップワードを設定すると次のようになった。
 
疾患 keigan kinsyu naimaku ransou taigan 総計 再現率
keigan 126 19 17 11 27 200 63.0%
kinsyu 3 116 45 18 18 200 58.0%
naimaku 2 10 177 5 6 200 88.5%
ransou 9 2 20 156 13 200 78.0%
taigan 32 15 13 23 117 200 58.5%
総計 172 162 272 213 181 1000  
適合率 73.3% 71.6% 65.1% 73.2% 64.6%   69.2%

正確度が69.2%となった。

抄録コーパス

ベイズ学習器の性能は学習に用いたコーパスに大きく依存する。特に,カテゴリごとの単語数は一様である必要がある。偏りがあると特定のカテゴリ(単語数の少ないカテゴリ)に分類されてしまう傾向がある。
そこで,学習に用いるデータを一様にするため,収集した抄録からランダムに学習データを抽出することにした。こうして抽出した学習データプロフィールを下表に示す。

# 疾患 文書数   総語数 総異なり語数 (A) log(総語数) (B) log(総語数+総異なり語数) (A) -(B)
3 Shikkan:naimaku 500 0 34291 7392 10.44263821 10.63784865 -0.195210443
5 Shikkan:taigan 500 0 37736 8730 10.53836982 10.74647614 -0.208106316
4 Shikkan:ransou 500 0 35970 8326 10.49044054 10.69864966 -0.208209122
2 Shikkan:kinsyu 500 0 37964 8935 10.54439362 10.75575163 -0.211358011
1 Shikkan:keigan 500 0 35608 8651 10.48032561 10.69781402 -0.217488409

総語数の平均は36,314語(標準偏差1,537),異なり語数の平均は8,407語(標準偏差608)であった。

MeCabの辞書

形態素解析(MeCab)による過分割を押さえたり,専門用語を抽出できるようにするために,MeCabのユーザ辞書を作成する。

■HOST上のMeCab環境

  • 実行ファイル /usr/local/bin/mecab
  • システム辞書ディレクトリ /usr/local/lib/mecab/dic/ipadic
  • 辞書作成プログラム /usr/local/libexec/mecab/mecab-dict-index
  • ユーザ辞書ディレクトリ /usr/local/lib/mecab/dic/userdic/
  • MeCab設定ファイル /usr/local/etc/mecabrc 

辞書ファイルの作成

  • 辞書ファイルはKHcoderの複合語抽出機能を用いる。
    • ただし,複合語にカンマが含まれるものは除去する。
  • 抽出した複合語を所定のCSVファイルに編集してサーバへアップロードする。
    • 追加した辞書は47,674語(全抄録から複合語を作成した)
    • アップロード先:%HOME/usr/dic/abstract_utf-8n.csv
  • 辞書コンパイル
    • /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u /usr/local/lib/mecab/dic/userdic/abstract.dic -f utf-8 -t utf-8 /home/nlp_ai/usr/dic/abstract_utf-8n.csv
      
  • ユーザ辞書をMeCabに登録する
    • /usr/local/etc/mecabrcに下記を追加
      userdic = /usr/local/lib/mecab/dic/userdic/abstract.dic
      


2017年9月19日火曜日

疾患予測サーバ

疾患予測サーバが完成したのでメモ。
まず,プロトタイプシステムのURLは下記の通り。

http://192.168.11.251/~nlp_ai/disease-predict.html

ただし,VPN接続しないとアクセスできない。

コアになるプログラムは以下の通り。いずれも,semi2014pacs(192.168.11.251)のアカウントnlp_aiのホームディレクトリ内にある。

  • 疾患予測ベイジアンフィルタクラス
    • ~nlp_ai/training_code/class/BayesLearining_Shikkan.php
  • コーパス管理プログラム
    • ~nlp_ai/training_code/class/Corpus_Shikkan.php
  • 形態素解析プログラム
    • ~nlp_ai/training_code/class/Morpheme.php
  • ベイズ学習プログラム
    • ~nlp_ai/training_cide/shikkan_bunrui.php
  • ベイズ学習検証プログラム(混同行列作成)
    • ~nlp_ai/training_code/confusion-matrix.php
  • 疾患予測Webサービス (サーバ)
    • ~nlp_ai/public_html/api-predict.php
  • 疾患予測プロトタイプWebシステム(クライアント)
    • ~nlp_ai/public_html/disease-predict.html
  • 疾患予測プロトタイプWebシステム(Javascript)
    • ~nlp_ai/public_html/script/api-predict.js
データベース
  • http://192.168.11.251/phpmyadmin/
  • データベース名:nlp_ai
  • テーブル名:m_filter, t_word_count
    • 全品詞:_alltypesという接尾語がついているテーブル
    • 名詞のみ:_nounという接尾語がついているテーブル
形態素解析後の単語について,全品詞を使うか特定の品詞(たとえば名詞)のみを使うかは,class/Morpheme.phpで設定する。
58行名の
$types = array('名詞');
に品詞リストを設定すればよい。この行をコメントアウトすれば全品詞が対象になる。
データベースを作り直すには, まず m_filter と t_word_count を空にしてからコマンドラインで shikkan_bunrui.php を流す。



2017年8月9日水曜日

論文の構成

1.はじめに
・背景(現状・問題点など)
 女性疾患の受診率が低い(軽く見ている)。
 放置しておくと重篤な疾患に発展する恐れがある。
 受診しやすい環境整備が必要。
・研究の目的
 受診に役立つアプリを開発することで,受診を促進し、現状の改善を目指す。
 診療支援システムを開発するのが目的ではない。
 あくまでも女性健康管理および受診促進が目的で,疾患予測機能はスマホアプリに蓄積したライフログを有効活用する手段の一つ。
 予測結果は利用者が参考程度に活用する。
・研究の範囲
  受診時に役立てるために問診票に記入する項目を入力できるようにする
 ライフログから疾患を予測する疾患予測機能を試行的に実装
 今回はスマホアプリを開発するところまでとし,実証実験までにはいたっていない
・先行研究
 女性健康アプリに関する先行研究の紹介
  「月経前症候群の管理におけるスマートフォンアプリを用いた症状記録システムの開発と臨床使用」
 Bayes分類に関する先行研究
  「インターネット経由で集めた症例を利用した機械学習による診断システム」
  「結核接触者におけるナイーブベイズ分類による発症予測の試み」
2.方法
・入力項目の選定
 実際の医療機関が公開している問診票
 既存の女性健康アプリの入力項目の分析
・疾患分類
 Bayes学習
  医中誌から収集した抄録を学習データとして利用した場合の分析方法
  インターネットから集めた記事を学習データとして利用した場合の分析方法
・スマホアプリの構築方法
  MonacaによるHTML5ハイブリッドアプリ
  疾患予測サーバ
   Webサービスとして実装
    WebAPI
    相互運用性を考慮したインターフェース(HL7 FHIRの利用)
・疾患予測機能の評価方法
 検証データを作成して分類性能を評価
3.結果
・選定した入力項目
・作成したスマホアプリ
・疾患予測の結果
 抄録コーパス,インターネット記事コーパス各々の分類成績(学習曲線,混同マトリックス)
 検証データを用いた分類性能
4.考察
・疾患予測に対する評価
 抄録コーパスとインターネット記事コーパスで学習したときの分類性能の違い
 疾患を分類する上でどの用語が効いているか 
・先行研究との比較
 他の普及しているアプリとの比較
 Bayes分類性能の先行研究との比較
・限界
 テキストマイニングだけで疾患予測は難しい
  他の項目(検査結果,バイタル,生理周期,・・・)
 実証実験に至っていない
・今後の課題
 データの標準化による他のシステムとの相互運用性(HL7 FHIRの利用)
5.結論
・研究の目的の達成度
 当初の目的は達成した
 本研究は疾患予測を実装した初の女性健康アプリ
 問診データを取り入れた2番目のスマホアプリ
6.参考文献
 「月経前症候群の管理におけるスマートフォンアプリを用いた症状記録システムの開発と臨床使用」
 「インターネット経由で集めた症例を利用した機械学習による診断システム」
 「結核接触者におけるナイーブベイズ分類による発症予測の試み」

2017年8月2日水曜日

特徴語の抽出

ネット上で収集した各疾患50件ずつの学習データより、特徴語を抽出した。

方法:収集データ、ストップワードについてはこちらを参照。

このデータを用い、KHcoderのツール→外部変数と見出し→リストより、特徴語から抽出を行う。今回は最初に品詞の指定をせず、得られたデータから重要そうな名詞、タグに品詞を指定し、個別に抽出した。

結果を下記に示す。

品詞指定なし

名詞のみ

タグのみ

今後、これらの中から疾患予測機能に用いる項目を作っていく。

機械学習処理について

現在、機械学習処理で行っていること


 サンプルプログラム「けんてーごっこコーパス」を使って、各単語の出現する確率から、単語のスコアを計算している。

例)ベイジアンフィルタ : 単語スコアの確認
使用コーパス       : けんてーごっこ コーパス
***********************************************************
●カテゴリ : game
単語 イャンクック = 1.000000
単語 オセロット = 1.000000
単語 グラビモス = 1.000000
単語 モンハン = 1.000000
単語 ndG = 1.000000
単語 MHP = 1.000000
単語 SFC = 1.000000
単語 スタン = 1.000000
単語 チョコボ = 1.000000
単語 ラージャン = 1.000000
単語 詠唱 = 1.000000
単語 素早 = 1.000000
単語 ラオシャンロン = 1.000000
単語 KEY = 1.000000


「けんてーごっこコーパス」とは、検定クイズサイト「けんてーごっこ」のデータを基に作成されているコーパスである。テキストマイニングや機械学習処理の実験に使いやすい形になっており、

  • music(音楽)
  • game(ゲーム)
  • anime_manga(アニメ・マンガ)
  • idol(アイドル)
の4つのカテゴリに分類される。

各疾患10件~50件までの正確度について

ネット上で収集した学習データを用い、各疾患10件~50件までの正確度の推移を調べた。

方法:収集データ、使用したソフト等についてはこちらを参照。

条件:疾患名をそのまま特徴語とさせないため、ストップワードを設けた。
~ストップワード一覧~
子宮筋腫
子宮頸がん
子宮頸癌
子宮体癌
子宮体がん
子宮内膜症
卵巣腫瘍
子宮



卵巣
腫瘍
筋腫

がん
~~~~~~~~~~~
品詞の限定は今回しておらず、全品詞を指定した。

結果を下に記す。



各疾患10件

各疾患20件

各疾患30件

各疾患40件

各疾患50件


各件数ごとの推移

件数を増やしていくごとに結果が良くなっていることがわかる。
今後は各疾患のすべてのデータを用い、検証したい。
また、品詞の指定をすることでどう結果が変わるかも検証したい。



2017年7月26日水曜日

診療支援システムについて

日経デジタルヘルスのページの検索エンジンにて「診療支援システム」と検索したページのURLを記す。
何か研究についてのヒントが得られるかも。

検索:日経デジタルヘルス
ホワイトジャック

2017年7月17日月曜日

Word2Vecを試してみた

Word2Vecは単語をベクトルとして表現する手法です。GensimのWord2Vecを使ってネットで集めた記事(各疾患50件)からモデルを作成して類似単語を検索してみた。抜き出した品詞は名詞と形容詞のみ。ベクトルの次元は100。Windowは3。学習にsoftmax関数を使用(hs=1), 最小出現回数は1(min_count=1), 学習アルゴリズムはskip-gram (sg=1)。

以下がその結果。

[ 子宮頸がん cervical_cancer の場合]
出血 = 月経,性行為,期間,もの,性交,際,おり,異常,長い,卵巣
症状 = 初期,子宮,浸潤,婦人科,的,痛み,子宮頸がん,感染,浮腫,病気
特徴 = 子宮,ピンク,初期,症状,的,浸潤,病気,中,浮腫,ため
 
[ 子宮内膜症 endometriosis の場合]
出血 = 女性,ため,人,%,子宮,こと,生理,必要,場合,チョコレート
症状 = 多い,ため,症,強い,血,排便,人,膜,とき,ナプキン
特徴 = ひどい,たび,痛い,の,癒着,子宮内膜症,的,痛み,中,生理痛 
 
[ 子宮筋腫 uterine_fibroid の場合]
出血 = こと,生理痛,ひどい,ため,血,大きい,一番,成長,流,異常
症状 = 膀胱,血液,腹痛,悪い,化,腎臓,自分,トラブル,異常,血管
特徴 = 場合,成長,やすい,様々,その他,方,子宮,筋腫,痛み,日常生活 
 
[ 子宮体癌 endometrial_cancer の場合]
出血 = 不正出血,不正性器出血,閉経,多い,月経,水っぽい,検査,子宮頸がん,がん,必要
症状 = 子宮体がん,がん,進行,不正出血,子宮頸がん,初期,不正性器出血,少量,こと,検診
特徴 = 閉経,出血,不正出血,多い,不順,水っぽい,月経,不正性器出血,要注意,もの 
 
[ 卵巣腫瘍 ovarian_tumor の場合]
出血 = こと,もの,状態,腫瘍,茎,卵巣腫瘍,ホルモン,場合,異常,痛み
症状 = おなか,痛,さ,腰痛,腫瘍,尿,きつい,偶然,どちら,もの
特徴 = 腫瘍,こぶし,の,片側,もの,さ,腰痛,大きい,卵巣腫瘍,おなか

ネット記事を集めたコーパスで学習曲線を作ってみた

Googleで疾患名を入力して検索した結果を集めて作ったコーパスを利用してベイズ学習をやった結果を下表に示す。分類はscikit-learnのMultipleNBを使って行い、性能は10-fold交差検証テストで評価した。

表1 ネット記事の分類実験の結果

これをグラフにして学習曲線を描いたのが下図である。


図1 ネット記事によるコーパスの学習曲線

1疾患当たりの学習データ件数が50のとき、Accuracyは最大の0.9を示した。このグラフから、データをさらに増やすと性能がさらに向上する可能性がみられる。

モデル係数の調査

ベイズモデルのモデル係数が最も大きい20の特徴量と最も小さい20の特徴量を 図2~6に示す。

図2 子宮頸がんのモデル係数
図3 子宮体癌のモデル係数
図4 子宮内膜症のモデル係数
図5 子宮筋腫のモデル係数
図6 卵巣腫瘍のモデル係数
いずれの疾患も最小の25の特徴量はおそらくアンダーフローしている。分類の貢献している特徴量を見ると「おり」「もの」があるが、これは「おりもの」が過分割されているものであろう。ユーザ辞書を作って過分割を抑える必要がある。

2017年7月13日木曜日

分類器の性能はどうやって測るの?

KH Coderのベイズ分類器は交差検証テストの結果として,性能を正確度(Accuracy)で出力している。機械学習の性能を評価する場合はほかにも様々な指標がある。これについては「モデルの精度評価」に詳しいので参照のこと。
さて,分類器というものは,正確度が高ければ高いほど良いというわけではない。正確度が高くても使いものにならない場合だってある。たとえば病気の有無をあてる分類問題で,有病率が低い場合は,いくら正確度が高くても再現率(Recall)が低い場合がある。一般に分類器は2つの指標(再現率と精度)で評価すべきである。
ただし,今回のように疾患ごとのデータ数を揃えている場合は正確度を使って性能を評価しても問題ない。

ストップワード

ストップワードに疾患名を設定していなかったため,ベイズ分類の成績が本来よりも良くなっていたようで,ストップワードを加えると正確度(Accuracy)が下がってしまった。まあ,これは当然の結果。さて,気を取り直してストップワードを設定して疾患ごとのデータサイズを100~500に変えながら分類を行ったところ,データサイズが500件のとき0.62になったということ。ストップワードを入れなかったときに比べ約0.8の減少。なお,この分類テストでは品詞を絞らず,すべての形態素を素性に使っている。また,KH Coderが自動的に作成する複合語を設定して過分割を抑制している。だが,しかし,この効果がプラスに出ているかどうかはためしてみないとわからない。そう,何事もやってみないとわからない。多分こうだろうと安易に考えて安心してはいけない。
さて,同じ実験をKH Coderではなくscikit-learnというライブラリのBayes分類器を用いてやってみた。1疾患当たりのデータサイズを100~600に増やしながら,交差検証テストだけでなく,訓練データ並びに別途作った検証用データについても分類性能(正確度)を測定してみた。なお,検証用データの件数は,訓練用が300件までは訓練用データ件数と同じで,400件の時は300件,500件の時は200件,そして600件の時は100件とした。これは,利用できるデータサイズが700件以下だったためである(子宮体癌)。結果を下表に示す。

表1 scikit-leanを使ったBayes分類の結果

なお,表中のalphaは分類器のパラメタ(Laplace smoothing)で,ゼロ頻度を避けるためのものである(θ=(x + alpha)/(N + alpha*d) for more detail see Wikipedia "Additive smoothing")。下図はこの結果をグラフにしたものである。

図1 学習曲線

この結果から,1疾患当たりのデータサイズが500件および600件のとき,正確度は0.72となり,今回調べた範囲ではもっとも高くなった。また,表1から,データサイズが増加するにつれて,訓練スコアは徐々に減少し,それとは反対に検証データによる分類正確度は増加している。これは,過学習が抑制されていることを表しているのだろう。

今回の結果はKH Coderの結果と異なっている。 考えられる原因は
  1. 分類の特徴量(素性)として名詞しか使っていない
  2. 複合語を使った過分割抑制を行っていない
の2点である。この他にも形態素解析器が使っている辞書やアルゴリズムも影響しているかもしれない(KH CoderはChasen,scikit-learnはMeCab)。


2017年7月12日水曜日

ストップワードと複合語リスト

KH Coderでベイズ学習を行うとき、ストップワードと複合語リストを指定できる。
複合語リストとは、形態素解析の過分割を抑制するために指定する単語リストで、ここに指定した単語は、それ以上形態素解析処理によって分割されることなく、そのままの単語として抽出される。
ストップワードは、抽出された語をベイズ学習の特徴量(素性)から除外したい場合に指定する語リストである。
今回の中間発表では以下のように設定した。

ストップワード

子宮筋腫
子宮頸がん
子宮頸癌
子宮体癌
子宮体がん
卵巣腫瘍
子宮



卵巣
腫瘍
筋腫

がん

複合語リスト

子宮筋腫
子宮内膜症
腫瘤
子宮頸部
子宮体癌
子宮頸癌
子宮内膜
卵巣癌
卵巣腫瘍
腫瘍細胞
組織学
腺癌
摘術
摘出術
子宮内膜癌
子宮体部
単純子宮
化学療法
子宮腺筋症
類内膜腺癌
子宮内膜組織
以下省略(全部で17455語)

いよいよ来週は中間発表です

作成したスライドについてまとめてみました。

スライドの修正

  1. 代表的なものだけでも別掲で拡大表示するなどして,P9をもっと見やすいように工夫してください。
  2. P15では,抄録の場合は50件ではなく200件の場合の結果を示してください。
  3. また,表(混同行列(Confusion Matrix))が薄くて見えにくいので,パワーポイントの表を使って書いてください。
  4. P12:異なる疾患名の検索で同じ抄録がヒットした場合,医学中央雑誌の「文献番号」で重複している抄録を除去したことを口頭でいいので言及してください。
  5. P20:現在,特徴量として使用している形態素の品詞を記入してください(「現在は,名詞,・・・・を使用」の・・・のところ)。
  6. なぜネット記事のほうが抄録を学習するよりも正確度が高くなったのか,原因を調査してください(コピ&ペで同じ文書が学習データになっちないか?)
  7. それを受けて,スマホアプリから入力する症状の候補を検討してください。

Q&A対策資料の作成

発表用のスライドとは別に,Q&A対策のスライドを作っておくと便利です。口頭ではなかなか伝わらないこともスライドを示しながら説明するとやりやすいです。
  1. 無作為に選んだ10病院の問診票をパワーポイントに貼り付ける
  2. 既存の女性健康アプリの一覧を作成する
  3. 収集した学習データのプロフィール(各疾患ごとの文書数,文字数)をまとめる
  4. KH Coderのベイズ学習の手順をまとめる
  5. ベイズ学習で選んだ品詞、除去した語(ストップワード)を一覧にする
  6. 交差検証テスト結果の混同行列にPrecisionとRecallを加える
  7. Kappa統計量についてまとめる

2017年7月5日水曜日

研究の目的について考えてみる

今回の研究の目的について整理する。
子宮内膜症に関する現状については日本子宮内膜症啓発会議の現況に詳しく書かれている(エンドメトリオーシス学会)。それによれば、有経女性の約9%(約230万人)が子宮内膜症にかかっている(2011年度)。ところが実際に受療しているのは63万人と全患者数の27%に過ぎない。その背景には「月経痛は我慢するのが当たり前」「痛いときは市販の鎮痛剤を使えばよい」「婦人科に行きたくない」といった子宮内膜症の重大性に対する無知がある。しかし、放置しておくと、QOLの低下だけでなく不妊の原因や卵巣がんへの進展も明らかになってきている。
このような背景から、少しでも通院を促進するためにスマホアプリを開発した。

開発するスマホアプリにおいて通院を促進する機能

  • 症状を入力して疾患を予測する機能
  • 最寄りの医療機関を案内する機能(地図・評判)
  • 問診票の内容(飲んでいる薬、予防接種の記録、既往歴など)をスマホに登録して医療機関への受診を促進する機能
  • もっと自分の身体について関心を持ち,自分の身体に気を配るために,月経の周期や体調の異変など,自分の情報を管理する機能






2017年7月3日月曜日

インターネットから集めた疾患情報による学習結果

方法:インターネットの検索エンジンを用い、子宮筋腫、卵巣腫瘍、子宮内膜症、子宮体がん、子宮頸がんの計5疾患の検索を行い、得られた結果から症状の記述のみ抽出してコーパスを作成した。
その際、例えば「子宮筋腫の症状は?」といった見出しを見つけ、手作業で該当箇所をコピー&ペーストした。明確な見出しがない場合は、「~~~といった症状がみられる」といった箇所を目視で確認して該当箇所をコピー&ペーストした。
記述の信頼性を確保するため、出典が医療機関かそうでないかで区分した。
なおこの作業は3名で基準を統一して行った(うち2名は医療情報技師または診療情報管理取得者)。
収集したコーパスから各疾患50件ずつ抽出して、KHcoderを用いてベイズ学習をした。その際、出典が医療機関とその他のいずれかに偏らないようにランダムに抽出した。なお,ベイズ学習では使用する特徴量(素性:feature)を名詞,・・・に絞ってある。また,形態素解析によって得られた疾患名そのものは除外してある。


結果:収集したデータの詳細を表1に示す。また,収集したデータから各疾患ごとにランダムに抽出したデータのプロフィールを表2に示す。

表1 収集コーパスデータ詳細(全件数)
表2 収集コーパスデータ詳細(ランダム抽出50件)
表3にベイズ学習の結果を下記に記す。なお,検証は10-分割交差検証法(10-fold Cross Validation)によって行った。

表3 ベイズ学習の結果



考察:ベイズ学習の結果、90%という高い正解率(accuracy)を得た。また,一致度の指標であるKappa統計量も0.875と極めて高い値を示した。一般に、Kappa統計量が0.8を超えた場合は完全に一致しているとみてよいので,今回収集したデータによるベイズ分類はほぼ完ぺきに疾患を判定しているように思われる。しかしながら,以前,抄録をコーパスにしてベイズ分類した際は高々0.7の正解率しか得られなかったことを考えると,データの質としては劣ると考えられるインターネットのデータで何故ここまで高い正解率が得られるのか詳細に検討する必要がある。
考えられる理由としては,コーパス中に疾患名そのものが含まれており,それが高い分類精度をもたらしている可能性である。しかし,これに関してはストップワードに疾患名を加えているのでその可能性を除外できる。しかしながら,何らかの原因で過学習されている可能性が考えられるので,疾患分類にどの語が大きな影響を与えているのかを詳細に調べる必要がある。
また,今回は収集したコーパスから各疾患ごとにランダムに50件ずつデータを抽出してベイズ学習を行ったが,今後は使用するコーパスの件数によって正解率がどのような影響を受けるかについて,学習曲線を描いて検討を行う。また,学習データの質による影響を見るために,分類精度の出典区分依存性を調べる必要もある。さらに,語の出現数や予測に使われないであろう語句のフィルタを行うことによってどの程度分類精度が改善するか見ていきたい。

2017年6月28日水曜日

Onsen-UIによる画面設計のTips(レイアウト)

Monacaを使って画面を作成する際に,チェックボックスを2列にしたい場合があります。たとえば,次のような画面です。

この場合,次のようなHTMLを書きます。
    <ons-list>
        <ons-list-header>症状を選択してください</ons-list-header>
        <ons-list-item>
            <ons-row>
                <ons-col>
                  <label>
                    <ons-input style="width:35px;" type="checkbox" input-id="check-1"></ons-input>
                  </label>
                  <label for="check-1">
                    不妊症
                  </label>
                </ons-col>
                <ons-col>
                  <label>
                    <ons-input style="width:35px;" type="checkbox" input-id="check-1"></ons-input>
                  </label>
                  <label for="check-2">
                    月経困難症
                  </label>
                </ons-col>
            </ons-row>
        </ons-list-item>

ポイントは,ons-rowで行をレイアウトし,その中にons-colで列をレイアウトすることです。また,チェックボックスとラベルの間に余白を入れるためにons-inputタグにwidth属性で幅を35pxに設定しています。どうも,labelタグにはwidth属性が効かない(?)みたいです。
画面レイアウトを作る際には,どの位置にどのくらいのサイズのオブジェクトを配置するかが重要になってきますが,その際,こういったことは覚えておくとよいでしょう。

診療支援にAI,2020年度に実用化,厚労省が報告書

2017年6月27日,保険医療分野におけるAI活用推進懇談会が診療支援におけるAIの実用化についてまとめた報告書が厚労省から発表されました。これによれば,
  • 遺伝子を調べて効果的にがん治療などを進めるゲノム医療
  • 皮膚科や眼科で得られる画像を集約した診断支援
  • 問診や検査のデータを蓄積した治療支援
  • ターゲットとなる分子を予測した薬の開発支援
の4分野が比較的早期に実用化できる領域として掲げられています。
報告書の中には
保健医療データの収集に当たっては、AIの開発企業・研究者等だけでなく、AIの活用によって、保健医療の現場にもメリットが還元されるような環境を国が主導して整備することが望ましい。また、診療報酬等の枠組みも活用しつつ、保健医療の現場に過大な負担を負わせることなく、持続的に保健医療データが収集されるような仕組みを構築する必要がある。
といった記述がみられ, 診療報酬によるAI加算も見据えているようです。

2017年6月14日水曜日

先行研究

キーワード:ナイーブベイズで医中誌を検索した結果、5つの文献が見つかった。

1. 2014275893
結核接触者におけるナイーブベイズ分類による発症予測の試み
Author:吉川 秀夫(国立保健医療科学院 健康危機管理研究部)
Source:保健医療科学(1347-6459)63巻2号 Page176-178(2014.04)
論文種類:会議録
シソーラス用語:Bayesの定理; *結核; コホート研究; ロジスティックモデル; *接触歴; 検査予測値; 後向き研究
チェックタグ:ヒト

2. 2011287737
ベイジアンネットワークを利用した肺野孤立性結節の鑑別診断支援の検討
Author:川岸 将実(キャノン 総合R&amp;D本部医用イメージング推進プロジェクト), 飯塚 義夫, 山本 裕之, 八上 全弘, 久保 武, 藤本 晃司, 富樫 かおり
Source:MEDICAL IMAGING TECHNOLOGY(0288-450X)28巻Suppl. Page1-7(2010.07)
論文種類:原著論文
シソーラス用語:Bayesの定理; 鑑別診断; *コンピュータ診断; *X線CT; *孤立性肺結節(X線診断); 理論モデル; 検査予測値
医中誌フリーキーワード:*胸部CT
チェックタグ:ヒト
Abstract:我々は、医師が胸部CT画像上の肺結節像を読影して付与したテンプレート方式の画像所見を入力として、その診断名を推論し提示する鑑別診断支援システムの構築に取り組んでいる。RSNA2009では、ナイーブベイズ分類器を用いた推論モデルを構築・評価し、その臨床的な有効性を報告した。本論文では、推論モデルの精緻化の目的で行った以下の改良について報告する。(1)統計的に診断と関連が強い所見のみを選出して推論に用いる。(2)診断名毎のナイーブベイズを複数用意し、それらの出力を組み合わせて総合的に診断名を推論する。これらの改良により、100症例222結節の臨床データを対象としたL法による性能評価で、改良前に比べて正答率が10.2%(p<.01)向上し、医師の正答率を上回る性能を達成した。(著者抄録)

3. 2011049778
ベイジアンネットワークを利用した肺野孤立性結節の鑑別診断支援の検討
Author:川岸 将実(キャノン 総合R&amp;D本部医用イメージング推進プロジェクト), 飯塚 義夫, 山本 裕之, 八上 全弘, 久保 武, 藤本 晃司, 富樫 かおり
Source:MEDICAL IMAGING TECHNOLOGY(0288-450X)28巻4号 Page237-243(2010.09)
論文種類:原著論文
シソーラス用語:Bayesの定理; 鑑別診断; *コンピュータ診断; *X線CT; 肺(X線診断); 確率論; 観察者による差; 検査予測値; ニューラルネットワーク(コンピュータ); 尤度関数; *肺結節(X線診断)
医中誌フリーキーワード:*胸部CT
Abstract:我々は、医師が胸部CT画像上の肺結節像を読影して付与したテンプレート方式の画像所見を入力として、その診断名を推論し提示する鑑別診断支援システムの構築に取り組んでいる。これまでに我々は、ナイーブベイズ分類器を用いた推論モデルを構築・評価し、その臨床的な有効性を報告した。本論文では、推論モデルの精緻化の目的で行った以下の改良について報告する。(1)統計的に診断と関連が強い所見のみを選出して推論に用いる。(2)診断名ごとのナイーブベイズを複数用意し、それらの出力を組み合わせて総合的に診断名を推論する。これらの改良により、100症例222結節の臨床データを対象としたLeave-one-out法による性能評価で、改良前に比べて正答率が10.4%(p<.01)向上し、医師の正答率を上回る性能を達成した。(著者抄録)
DOI:10.11409/mit.28.237

4. 2010128071
聴覚事象関連電位への神経デコーディングの適用 統計的識別手法の比較と脳波分析方法としての評価
Author:井上 康之(豊橋技術科学大学), 小川 昭利, 荒井 宏太, 松本 秀彦, 松嵜 直幸, 小山 幸子, 豊巻 敦人, 大森 隆司, 諸冨 隆, 竹市 博臣, 北崎 充晃
Source:基礎心理学研究(0287-7651)28巻1号 Page44-58(2009.09)
論文種類:原著論文
シソーラス用語:識別(心理学); *聴覚刺激; *脳波記録法; 脳マッピング; 検査予測値; *事象関連電位; 主成分分析
チェックタグ:ヒト; 男; 女
Abstract:統計的識別方法・機械学習を利用して脳内の情報表現を明らかにするパラダイムとして提案されている神経コーディングを、脳波(事象関連電位=ERP)の時系列パターンに適用し、成人25名(平均年齢22.04歳)を被験者に、異なる持続時間の純音刺激、あるいは連続純音の途中に無音区間がある音刺激を聴取している時の脳波を計測し、"ナイーブベイズ法""主成分分析とナイーブベイズ法を組み合わせる方法""サポートベクターマシン"の3種類の統計的識別手法を用いて、ERPデータからその持続時間長、あるいは無音区間長を識別することを試みた。その結果、主成分分析とナイーブベイズ法を組み合わせた識別器、およびサポートベクターマシン識別器の優位性が示唆された。
DOI:10.14947/psychono.KJ00005878667

5. 2008260061
インターネット経由で集めた症例を利用した機械学習による診断システム
Author:高田 英明(東京医科歯科大学 医歯学総合研究科), 野川 裕記, 田中 博
Source:ITヘルスケア(1881-4808)3巻1号 Page62-65(2008.05)
論文種類:原著論文
シソーラス用語:*人工知能; 呼吸器系診断; *コンピュータ診断; 消化器系診断; データ収集; 医師免許; *インターネット
チェックタグ:ヒト
Abstract:機械学習による自動診断システム作成には大規模なデータソースが必要である。しかし、そのための大規模なデータソースを入手することは研究者にとって容易ではない。一方、インターネット上には、多数のユーザーの発信する情報があふれている。そこで、われわれは、これらのインターネット上の一般ユーザーから入手した健康に関するデータが、自動診断システムを作成するための機械学習に利用可能なのではないかと考えた。本研究の目的は、この仮説を検証することである。われわれは、インターネット上に簡単な健康情報提供サイトを設置し、そのサイト上で、何らかの疾患のため医療機関を受診したユーザーの情報を収集した。そして、そのデータをもとに機械学習を行った。機械学習の方法はナイーブベイズアルゴリズムを採用した。機械学習の結果の評価のため、学習後のシステムに、日本の医師国家試験の過去の臨床実地問題を与え、その得点を見ることとした。そして、機械学習が、医師に要求される最低限の判断ができるかを評価することとした。その結果、学習後のシステムは臨床実地問題で平均70%前後の正解率であった。医師国家試験の合格ラインは65%程度であるため、インターネット上のユーザーから集めた健康情報による機械学習は、実用的な自動診断システムの作成に有用であるとの結論を得た。(著者抄録)

2017年6月7日水曜日

スマホアプリ開発の便利ツール

Onsen UI ドキュメント

FullCalendar

Google Maps API

Ajax

Icons



2017年5月31日水曜日

問診票の項目

10病院の問診票を集めて項目を整理した結果


10病院の項目を整理した結果10病院中10病院が質問していた項目が8項目、9病院が質問していた項目が8項目ありました。

10病院中10病院が質問していた8項目は以下の通りでした。
・来院の目的
・生理について
・最近の月経
・閉経
・生理痛の有無
・ある人は回数
・薬や注射のアレルギー
・飲んでいる薬

これらをアプリに組み込んでいきたいと思います。

ナイーブベイズ分類に対する考察

ナイーブベイズ分類器による抄録(医中誌で検索した論文・症例報告集)の分類問題で、正解率が7割を超えるには、素性として利用する形態素の出現頻度が200語を超える場合との結果が出ましたが、これは分類器がコーパスに過学習しているものと思われます。ですからコーパスを変えると、正解率がぐっと下がってしまうかもしれません。出現頻度が200を超える形態素って一体どんな形態素なんでしょう?見てみたいものです。それから、コンフュージョンマトリックスも見たいです。出せますか?
さて、今、論文の抄録を学習して疾患分類問題をやっていますが、実際は論文ではなく、アプリから入力した症状を用いて疾患を予測するというシナリオになっています。ですから、現コーパスを使って僅か数パーセントの正解率を上げるためにいろいろやってみるのははっきり言って時間の無駄です。それよりもネットから集めた、より一般の人でもわかるような文章(実際、アプリユーザはそれを入力するのですから)のコーパスを作って、それを学習することが重要です。
それからもう一つ、機械学習の手法をベイズから他のものに変えるのも一つの手です。一般的な分類器として、SVM(サポート・ベクタ・マシン)、KNN(k近傍法)、Random Forestなどがあります。中でもRandom Forestは過学習に陥りにくいということです。

2017年5月30日火曜日

ナイーブベイズ分類の結果2

5/30 ナイーブベイズ分類の結果2


 次に、最大値である68.6%を超えるにはどうしたらいいのかを考えました。色々と試行錯誤した結果、最頻出単語数を変更することで割合が上下することに気が付きました。表1では、最頻出単語数を100~400単語まで変更したものを表しています。(※前回の結果は最頻出単語数:1となっています)

表1
表1より、最も高い割合を示したものは200単語となりました。200単語より多くても少なくても割合は下がってしまうという結果が読み取れます。

 次に、最頻出単語数を200単語に設定して200件の時と500件の時の分類を行いました。表2はその結果です。

表2

 前回の結果と比べてみると、200件の最大値は68.6%→72.6%、500件の最大値は67.4%→70.8%と上昇したことが分かります。
 しかし、割合は70%を超えることができましたが、もともと最頻出単語数が200以上ある単語が少ないという問題があります。そのため、この結果では正確な分類ができていない可能性が高くなっています。正確な分類を行うためにも、もう一度分類方法を見直す必要があると考えています。