• AI

乳がんの腫瘍が良性か悪性かを予測する

scikit-learnのサンプルデータセットを取り込み、確認のため5レコードを表示します。

# breast_cancer_wisconsin_data.csv を取り込む
import pandas as pd
bcw_data =  pd.read_csv('breast_cancer_wisconsin_data.csv')
# 先頭の5行のみ表示する(
bcw_data.head()
Image from Gyazo

このデータには以下に示す項目以外に30項目程度の項目があります。

  • id:連番
  • diagnosis:”B”か”M”の文字が格納されている(”B”:良性、”M”:悪性)
  • radius_mean:中心から外周までの平均距離(半径)
  • texture_mean:グレースケール(色の濃さ)の平均値
  • perimeter_mean:外周の平均の長さ

今回は radius_mean(半径)を説明変数、diagnosis(良性か悪性か)を目的変数として回帰を行います。

計測データ(X)と教師データ(y)に分ける

# X と y を作成する
import numpy as np

X = bcw_data.loc[:,"radius_mean"]
y = bcw_data.loc[:,"diagnosis"]

# DataFrame形式から ndarray 形式に変換

#X = np.array(X).reshape(-1,1)
#y = np.array(y).reshape(-1,1)

X = np.array(X).reshape(-1,1)
y = np.array(y)

# カテゴリの数値化
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(["B", "M"])                         # 良性:0, 悪性:1

y = le.transform(y.flatten())

# 訓練データ8割、テストデータ2割に分割する
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8, test_size = 0.2)

ロジスティック回帰LogisticRegression クラスを利用して、回帰モデルを作成します。

ロジスティック回帰 (logistic regression) は最もナイーブな機械学習法のひとつである。回帰と称されているが基本的には分類問題に利用される。回帰に使うこともできる.ロジスティック関数、多くの場合,標準ロジスティック関数 (シグモイド関数) の値を学習の過程で計算するが,この値の大小によって分類結果を出力する。つまり、シグモイド関数の出力が0.5より大きい場合を正、それ以外の場合を負、みたいな感じで分類する。中身は単純パーセプトロンと完全に同じもの。(参照:データ科学便覧)

# ロジスティック回帰の回帰モデルを作成する
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()

# 訓練データを回帰モデルに設定する(命令を追記すること)
model.fit(X_train, y_train)

テストデータを回帰モデルに当てはめて予測を実施します。

# 予測を実行する
y_pred  = model.predict(X_test)

予測の精度を混合行列で示してみます。

# 混合行列で集計結果を表示する
from sklearn import metrics
print(metrics.confusion_matrix(y_test, y_pred))
Image from Gyazo
# 正答率を表示する
print(metrics.classification_report(y_test, y_pred))
Image from Gyazo

計測データを91%の確率で判別する事ができました。

ロジスティク回帰のグラフを表示します。

# ロジスティック回帰のグラフを描くために必要な関数と処理。
def logit(x, lr):
    return x * lr.coef_ + lr.intercept_

def p(x, lr):
    return 1 / (1 + np.exp(-logit(x, lr)))

import math
X_test_min = math.floor(np.min(X_test))
X_test_max = math.ceil(np.max(X_test))

%matplotlib inline
import matplotlib.pyplot as plt

# テストデータを青色の散布図として表示する
plt.scatter(X_test, y_test, color = "blue")

# ロジスティック回帰の曲線グラフを赤色の線で表示する。ここの内容は変更しない!
X_plot = np.arange(X_test_min, X_test_max)
plt.plot(X_plot, p(X_plot, model).flatten(), color = "red")
Image from Gyazo

機械学習の結果、9割程度の精度で悪性か良性かの判定を行うことができました。 今回は学習用のテストデータを使った分類でしたが、実際の医療現場においても、医者の見落としを防止するための研究はかなり実用化されており、日々進化しています。 


兵庫県立大学では医学部と工学部を併設して医工学という分野で、未来の医療に役立つ研究をしています。 その一つとして「医療ビッグデータの人工知能解析による診断支援システム」があります。

兵庫県立大学 先端医工学研究センター(AMEC)

AIの研究をするには質の良いデータが無いと成果は出せないんですね。 やはり。。。

 

PAGE TOP