スキップしてメイン コンテンツに移動

【番外編】AI(機械学習)やってみた。【第7回】乳がん診断AI その2

乳がん診断AI第二弾です。前回に引き続き、ランダムフォレスト・多数決などのアルゴリズムを使って精度を確認していきます。前回、ニューラルネットワークが叩き出した診断精度95%を大きく超える結果になりました!

乳がんAI第一弾はこちら

乳がん診断AIを作ってみる

機械学習③:各モデルで交差検証

やることの概要

前回、決定木とニューラルネットワークの2つのアルゴリズムについて最適なハイパーパラメータを求めました。ハイパーパラメータとは、ニューラルネットワークの階層数など、人間が決めなければならないパラメータです。決定木の階層数は6階層、ニューラルネットワークの活性化関数はIdentity・ソルバーはLbfgs・パーセプトロン数と階層は500個を3階層というのが前回求めたハイパーパラメータでした。

まずは、決定木・ニューラルネットワーク・ロジスティック回帰・ランダムフォレストの機械学習アルゴリズムに対して、機械学習の訓練データと検証データを入れ替えながら学習することで精度を高める交差検証を試してみます。各アルゴリズムの概要や交差検証については、ソムリAIで解説していますので興味のある方は見てみてください(下にリンクを貼っています)。

交差検証(訓練精度)

早速交差検証をやってみます。前回からの続きでやっているため、実際にプログラムを動かしてみたい方は前回の冒頭に書いたデータ読込から順にコードを実行してください(データ読込や、説明変数・目的変数に分割してある状態から始めます)。

ソムリAIの時と同様、決定木・ロジスティック回帰・ニューラルネットワーク・ランダムフォレストのモデルを定義して、交差検証用の関数に放り込みます。データの分割数は3分割~10分割として交差検証を行い、最適な分割数を求めようと思います。

決定木とニューラルネットワークについては、前回探索したハイパーパラメータを設定しています。ロジスティック回帰については適当に設定したパラメータで結果的に精度が出たのでそれを使っています。ランダムフォレストはフォレスト(森)に使う決定木の本数が多いほど精度が出るのでとりあえず100本にしています。
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
 
#モデル1:決定木
clf1 = DecisionTreeClassifier(max_depth=6,random_state=0)
#モデル2:ロジスティック回帰
clf2 = LogisticRegression(solver='lbfgs', C=0.1, random_state=0)
pipe2 = Pipeline([['sc', StandardScaler()],['clf', clf2]])
#モデル3:ニューラルネットワーク
clf3 = MLPClassifier(activation='identity', solver='lbfgs', random_state=0, hidden_layer_sizes=(500,500,500,500))
pipe3 = Pipeline([['sc', StandardScaler()],['clf', clf3]])
#モデル4:ランダムフォレスト
clf4 = RandomForestClassifier(n_estimators=100, min_samples_leaf=3, random_state=0)
 
#各モデルの名称をリストに格納
clf_labels = ['Decision Tree', 'Logistic Regression', 'Neural Network', 'Random Forest']
 
#各モデルに対して交差検証を行い結果を表示
for clf, label in zip([clf1, pipe2, pipe3, clf4], clf_labels):
    print("[%s]" % (label))
    for i in range(3,11):
        scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=i)
        print("分割数%i 訓練精度と標準偏差: %0.4f (+/- %0.2f)"
              % (i, scores.mean(), scores.std()))
実行結果が見づらかったのでエクセルで加工したものを掲載します。
モデルによってでこぼこしていますが、6分割の交差検証の平均スコアが一番良さそうです。決定木で92%・ロジスティック回帰で97%・ニューラルネットワークで96%・ランダムフォレストで95%とかなりいい感じです。ただ、精度の低い決定木を除外すると最適な分割数も変わるような気もするので後で試してみようと思います。

交差検証(検証精度)

訓練データに対してそれなりの精度が出たので、検証データに対して作ったモデルを適用してみます。訓練データでモデルを作って、訓練で使っていない検証データにモデルを適用することでモデルの汎化性能(モデルにとって未知のデータに対してもパフォーマンスが出るのか)を測るのです。
from sklearn import metrics
#分割数6で学習し直し
#(ループを回して分割数を探索したので、現在のモデルは分割数10のモデルになっているため)
for clf, label in zip([clf1, pipe2, pipe3, clf4], clf_labels):
    scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=6)

#各モデルの検証精度を測定
for clf, label in zip(all_clf, clf_labels):
    clf.fit(X_train,Y_train)
    Y_pred = metrics.accuracy_score(Y_test, clf.predict(X_test))
 
    print("検証精度: %0.4f [%s]" % (Y_pred, label))
決定木95%・ロジスティック回帰97%・ニューラルネットワーク95%・ランダムフォレスト96%とかなり高い精度が出ました。

途中経過

色々やってきたので一旦、途中経過をまとめてみます。決定木とニューラルネットワークについては交差検証でパフォーマンスが向上しませんでした。。元の精度が高いからかもしれません。空欄の「多数決」と「決定木を除外した交差検証」はこのあとやっていきます。

機械学習④:多数決

ソムリAIでも使った多数決を適用してみます。ざっくり言うと、「複数の機械学習モデルのいいとこどりをして精度を高める」というものです。多数決で使うMajorityVoteClassifierというアルゴリズムは、『Python 機械学習プログラミング』という本で紹介されています。著作権の関係でアルゴリズムのコードは掲載しないので、中身を知りたい方はこちらをどうぞ。


多数決でいいとこどりをする(訓練精度)

先ほどの交差検証に多数決のモデルを定義して実行してみます。交差検証の分割数(8行目のcv)は、先ほどの結果を踏まえて6分割にしています。
#MajorityVoteClassifierを使って多数決してみる

#モデルの定義
mv_clf = MajorityVoteClassifier(classifiers=[clf1, pipe2, pipe3, clf4])
#多数決モデルをループさせるリストに追加
clf_labels += ['Majority Voting']
all_clf = [clf1, pipe2, pipe3, clf4, mv_clf]
#各モデルに対して交差検証を行い訓練精度を表示
for clf, label in zip(all_clf, clf_labels):
    scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=6)
    print("訓練精度と標準偏差: %0.4f (+/- %0.2f) [%s]"
          % (scores.mean(), scores.std(), label))
一番下の多数決の訓練精度は97%。各モデルの平均よりは高そうですが、最もパフォーマンスの良かったロジスティック回帰を下回っています。もしかしたらモデルの中でパフォーマンスがあまりよくない決定木に足を引っ張られているのかもしれません。

多数決でいいとこどりをする(検証精度)

検証精度の測定は、先ほどの交差検証と同じなのでコードは割愛します。
多数決の検証精度(一番下)は98%(!)。多数決に使った決定木からランダムフォレストのパフォーマンスを上回っており、みごとに多数決の成果が出ました。

途中経過

多数決の結果を一覧に追加しました。精度の高さでは多数決がトップなのです。

機械学習⑤:交差検証・多数決(決定木除外)

先ほどの交差検証の訓練精度ではロジスティック回帰・ニューラルネットワーク・ランダムフォレストは95%を超えていたものの、決定木は92%程度の精度でした。足を引っ張っている決定木を除外すると交差検証と多数決のパフォーマンスが変わるかもしれないので、決定木を除外してもう一度やってみます。

決定木を除外した交差検証

決定木関連のコードを削除しただけで、やっていることは先ほどと同じです。
#決定木を除外した交差検証

#モデル2:ロジスティック回帰
clf2 = LogisticRegression(solver='lbfgs', C=0.1, random_state=0)
pipe2 = Pipeline([['sc', StandardScaler()],['clf', clf2]])
#モデル3:ニューラルネットワーク
clf3 = MLPClassifier(activation='identity', solver='lbfgs', random_state=0, hidden_layer_sizes=(500,500,500,500))
pipe3 = Pipeline([['sc', StandardScaler()],['clf', clf3]])
#モデル4:ランダムフォレスト
clf4 = RandomForestClassifier(n_estimators=100, min_samples_leaf=3, random_state=0)
 
#各モデルの名称をリストに格納
clf_labels = ['Logistic Regression', 'Neural Network', 'Random Forest']
 
#各モデルに対して交差検証を行い結果を表示
for clf, label in zip([pipe2, pipe3, clf4], clf_labels):
    print("[%s]" % (label))
    for i in range(3,11):
        scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=i)
        print("分割数%i 訓練精度と標準偏差: %0.4f (+/- %0.2f)"
              % (i, scores.mean(), scores.std()))
最適値が変わりました。決定木込みでは6分割でしたが、決定木を除外すると5分割がベストです。精度も先ほどの95%から97%に上がりました。

決定木を除外した多数決

先ほどの交差検証の結果で得られた5分割で多数決を行います。訓練・検証一気にやっちゃいます。先ずは訓練から。
#MajorityVoteClassifierを使って多数決してみる
#決定木除外・交差検証5分割
 
#モデルの定義
mv_clf = MajorityVoteClassifier(classifiers=[pipe2, pipe3, clf4])
#多数決モデルをループさせるリストに追加
#各モデルの名称をリストに格納
clf_labels = ['Logistic Regression', 'Neural Network', 'Random Forest','Majority Voting']
all_clf = [pipe2, pipe3, clf4, mv_clf]
#各モデルに対して交差検証を行い訓練精度を表示
for clf, label in zip(all_clf, clf_labels):
    scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=5)
    print("訓練精度と標準偏差: %0.4f (+/- %0.2f) [%s]"
          % (scores.mean(), scores.std(), label))
続いて検証。
from sklearn import metrics
#各モデルの検証精度を測定
for clf, label in zip(all_clf, clf_labels):
    clf.fit(X_train,Y_train)
    Y_pred = metrics.accuracy_score(Y_test, clf.predict(X_test))
 
    print("検証精度: %0.4f [%s]" % (Y_pred, label))
多数決の訓練精度が98%、検証精度が99%(!)。やばいですね、メッチャ精度高いです。

まとめ

今回の乳がんAIのパフォーマンスの総括は以下の通りです。
バージョンを経るごとに着実に精度が上がっており、最終的には決定木を除外した多数決がベストな機械学習モデルで、98.83%の精度が出ました。

今回の乳がんAIで学んだことを簡単にまとめます。
  • データの1明細に含まれる項目数(要素数)が多い方が機械学習の精度が高まるのかもしれない(ソムリAIの1明細あたりの項目数は10程度だったが、乳がんAIは30)。
  • データの総数は機械学習の精度にあまり影響しないのかもしれない(ソムリAIは1600明細あったが、乳がんAIは570明細たらず)。
  • ロジスティック回帰やランダムフォレストなど複数のアルゴリズムで精度の高いモデルが作れた場合、それを多数決に放り込むといいとこどりしてもっと精度の高いモデルが作れる
  • 決定木は精度が上がりにくいが、AIの中身が見える化できる点がメリット(決定木はどの項目に注目してどう判断しているかが見えるが、それ以外のモデルはブラックボックス)。

関連情報

AI(機械学習)やってみた

AI(機械学習)関連書籍


ビッグデータ解析やってみた

ベストビュー(過去1カ月)

『九龍城探訪 魔窟で暮らす人々 - City of Darkness』 ☆4

魔窟とも言われた香港の九龍城の住人へのインタビューや、在りし日の写真集。香港の本土返還に伴い取り壊されてしまっているけど、その怪しさに妙に惹かれるのです。

【番外編】ボストン旅行記(UMASS Lowell卒業式編)【Day 4:卒業式】

UMASS Lowellの卒業式@Boston。4 日目は卒業式本番です。とても賑やかでアメリカンな式典でした。ただしあいにくの雨、僕曇り男なのに。。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day2:晩餐会】

UMASS Lowellの卒業式@Boston。 2日目は午前中はボストン観光、夕方から Hooding ceremonyという卒業生(大学院生)向けの晩餐会です。卒業式で被るHoodをもらいました。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day0:渡米前にやっておくこと】

UMASS Lowellの卒業式@Bostonについて、計画の立て方やら行く前にやっておくことやらをまとめておきます。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day1:ボストンへ】

UMASS Lowellの卒業式@Boston。 1日目は移動だけで終わりました。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day3:終日観光】

UMASS Lowellの卒業式@Boston。3 日目は終日フリーなので、ゆっくりボストンを観光しました。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day5:帰国】

UMASS Lowellの卒業式@Boston。5 日目にして帰国なのです。

【番外編】AI(機械学習)やってみた。【第3回】ソムリAI ~ニューラルネットワーク編~

AI(機械学習)やってみた、第3弾です。「ニューラルネットワーク(Neural Network)」を使ったソムリAIを作ってみようと思います。”ニューラルネットワーク”、見るからにAIっぽい名前ですよね。

【番外編】AI(機械学習)やってみた。【第2回】ソムリAI ~ロジスティック回帰編~

AI(機械学習)やってみた、第2弾です。前回は決定木(Decision Tree)を使ったソムリAI(ワインソムリエAI)を作りました。今回は「ロジスティック回帰(Logistic Regression)」というモデルを使ったソムリAIを作ってみようと思います。

『深層学習 (機械学習プロフェッショナルシリーズ)』岡谷 貴之 ☆4

ディープラーニングの理論を分かりやすく解説した本。複数の入力を受け取って1つの出力を返すパーセプトロンに始まり、現在のディープラーニングのブレイクスルーのきっかけになった制限ボルツマンマシンまで概念と理論を学ぶことができます。機械学習の理論をごまかさずに数式で説明しきることがコンセプトですが、数学が苦手でもおおよその概念は把握できるのです。サンプルコードが無料ダウンロードできるので、動かしながら学べるのもよいです。

ベストビュー(全期間)

Malaysia Quarantine Premium Package 【番外編】Malaysia赴任記 隔離ホテル情報

Once entering Malaysia, we need to be quarantined for 14days. At the beginning of COVID-19 spread, the hotel for quarantine have been determined randomly. In these days, we can choose "premium quarantine stay package" in advance . This article is summary of premium packages which I asked each hotel. Note: Information in this article might be old. It's better to confirm the latest plan to the hotel. Note: Only Hotel Istana can be booked via its homepage so far. As the other hotels don't show their premium package plans on their homepage, you need to contact them through their reservation E-mail address or "Contact us". マレーシア入国とともに14日間ホテルで隔離されます。当初は滞在ホテルがランダムに割り振られていたようですが、より快適なプレミアムプランが追加されました。各ホテルにどんなプランがあるのか聞いてみたので、聞いた内容をまとめます。 ※情報が古い可能性があるので、念のため最新情報を各ホテルに確認したほうがよいかもしれません。

【番外編】AI(機械学習)やってみた。【第1回】ソムリAI ~決定木編~

最近ブームのAI(機械学習)に手を出しました。まずは、決定木(Decision Tree)というモデルを使って「ソムリAI(ワインソムリエAI)」を作ってみようと思います。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day0:渡米前にやっておくこと】

UMASS Lowellの卒業式@Bostonについて、計画の立て方やら行く前にやっておくことやらをまとめておきます。

【番外編】AI(機械学習)やってみた。【第6回】乳がん診断AI その1

ソムリAI(ワインソムリエAI)で使った手法で乳がん診断AIを作ってみます。まずは決定木とニューラルネットワークの2つのモデルを試してみます。かなり高性能なモデルができました。名医誕生かもしれません 笑

【番外編】AI(機械学習)やってみた。【第3回】ソムリAI ~ニューラルネットワーク編~

AI(機械学習)やってみた、第3弾です。「ニューラルネットワーク(Neural Network)」を使ったソムリAIを作ってみようと思います。”ニューラルネットワーク”、見るからにAIっぽい名前ですよね。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day5:帰国】

UMASS Lowellの卒業式@Boston。5 日目にして帰国なのです。

【番外編】AI(機械学習)やってみた。【第2回】ソムリAI ~ロジスティック回帰編~

AI(機械学習)やってみた、第2弾です。前回は決定木(Decision Tree)を使ったソムリAI(ワインソムリエAI)を作りました。今回は「ロジスティック回帰(Logistic Regression)」というモデルを使ったソムリAIを作ってみようと思います。

【番外編】ボストン旅行記(UMASS Lowell卒業式編)【Day 4:卒業式】

UMASS Lowellの卒業式@Boston。4 日目は卒業式本番です。とても賑やかでアメリカンな式典でした。ただしあいにくの雨、僕曇り男なのに。。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day2:晩餐会】

UMASS Lowellの卒業式@Boston。 2日目は午前中はボストン観光、夕方から Hooding ceremonyという卒業生(大学院生)向けの晩餐会です。卒業式で被るHoodをもらいました。

『深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト』 ☆5

一般社団法人日本ディープラーニング協会が実施している「Deep Learning for GENERAL (通称G検定 ) 」 の公式テキスト 。 ディープラーニングについて1冊で網羅的によくまとめられているので 、 ディープラーニングの入門書としてもおすすめです 。 ついでに勢いで資格も取ってしまいました 。 AI人材への第一歩なのです 笑