Loading [MathJax]/extensions/tex2jax.js
スキップしてメイン コンテンツに移動

【番外編】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カ月)

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

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

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

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

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

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

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

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

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

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

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

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

『動物たちのすごいワザを物理で解く』☆4

生物×物理という着眼点の面白い本。なぜヤモリは天井にへばりつけるのかや、百発百中のテッポウウオの視界、温かい生き物の血を吸う蚊の驚きの排熱メカニズムなど、生き物の不思議を物理の視点で解説してくれます。子どもにドヤ顔で話せるようになると思います。

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

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

【番外編】AI(機械学習)やってみた。【第4回】ソムリAIの改良(正規化)

ソムリAI(ワインの評価を機械学習で当てる「ソムリエ+AI」)はもういいかなと思っていたのですが、機械学習の教科書的な本を読んでいるといくつか改良ポイントが見えてきたので、実際に適用してみようと思います。 まずは データの正規化 という手法を試してみました。結論から言うと、 あまり効果はなかった のです。。 ソムリAIの振り返り ワインの成分とランクのデータに対して、決定木・ロジスティック回帰・ニューラルネットワークの3通りのモデルを使って機械学習 を行い、モデルの精度を検証してきました。それぞれのソムリAIの性能はこんな感じでした。 どのモデルも概ね60%程度の精度 でした。 改良その1:正規化 正規化とは まずは 正規化 という手法を試してみます。標準化とも呼ばれます。正規化を行うことで 尺度の異なるデータを比べやすくする とともに、 はずれ値の影響を小さくする ことができます。正規化には 各データを平均0・標準偏差1に成形する手法 と、各データを 0から1の範囲に成形する手法 の2つがあります。 前者は標準偏差が出てくることからも分かるように、 データが正規分布に従うことを前提にした正規化手法 です。 元のデータが釣鐘型の分布になっている場合に有効 です。後者は単純に データの範囲を0から1の範囲に狭める手法 であり、 元のデータが一様分布の場合 (規則性が無くランダムなように見える場合) に有効 です。 どちらの手法でもデータの範囲を一定のレンジに狭めており、そうすることで異なる尺度のデータを比べやすくしつつ、はずれ値の影響を下げるのです。 正規化してみる 元データの分布を確認 前回同様のワインのデータを使って正規化してみます。まずはワインのデータを読み込んで表示してみます。ついでに機械学習で使うワインの成分と、ワインの評価にデータを分割しておきます。 【オリジナルのワインデータ】 UCI(University of California, Irvine:カリフォルニア大学アーバイン校) http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv #入力データセットを読み込み i...

【番外編】AI(機械学習)やってみた。【第5回】ソムリAIの改良(アンサンブル学習)

ソムリAI(ワインの評価を機械学習で当てる「ソムリエ+AI」)の改良として前回は正規化を試しました(大した効果なし)。今回は「アンサンブル学習」と「交差検証」というものを試してみようと思います。 アンサンブル学習とは ざっくりいうと、 複数の機械学習モデルのいいとこどりをしてより精度の高いモデルを作る ということです。「アンサンブル」っていう表現がおしゃれですよね。複数のモデルを組み合わせることで 過学習を防ぐ効果 もあるそうです。 交差検証とは 今までのソムリAIでは、データを訓練用と検証用に分けて訓練データでモデルを作成し、検証データ(モデルにとっては未知のデータ)でモデルの精度を測定していました。 訓練データでの精度に比べて検証データでの精度が高い場合は訓練データに個別最適化された過学習なモデルということになります。一方で、訓練データと検証データでの精度があまり変わらない場合は汎化性能の高いよいモデルということになります。 交差検証(Cross Validation)は、 訓練データをさらにn個に分けて訓練することで過学習を防ぎつつモデルの精度を上げる手法 です。例えば、3個に分ける場合こんなイメージです。複数のモデルを使ってよりよいものを作るので、アンサンブル学習の1手法ともいえます。 実際にやってみる 毎度おなじみですが、まずワインデータを読み込んで、訓練データ・検証データに分割します(データの正規化は後でやります)。 #入力データセットを読み込み import pandas as pd #データハンドリング用ライブラリ呼び出し data = pd.read_csv('winequality-red.csv', encoding='SHIFT-JIS') #機械学習で求める解である「評価」以外の項目をdata_Xに、「評価」をdata_Yに格納 data_X = data.copy() del data_X['評価'] data_Y = data['評価'] data.head() #読み込んだデータの先頭5行を出力 #入力データセットの70%を訓練データ・30%を検証データに分割 from sklearn.model_selection ...

ベストビュー(全期間)

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(機械学習)やってみた。【第3回】ソムリAI ~ニューラルネットワーク編~

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

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

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

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

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

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

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

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

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

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

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

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

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