機械学習、Python、GridDBによる脳腫瘍の検出

脳腫瘍は、患者さんに深刻な被害をもたらすため、臨床研究者にとって最も困難な疾患の一つです。脳は人体の中心的な器官であり、この器官にわずかな障害が発生しても、人体の正しい機能に影響を与える可能性があります。脳腫瘍は、記憶障害や視力低下など、患者さんに不可逆的な機能障害をもたらす可能性があります。このような理由から、長い間、医学の研究は脳と脳腫瘍を含む脳の病気の研究に重点を置いてきました。

コンピュータ研究は、医学的分析記録を脳腫瘍と正常な臨床状態とに分類する機械学習アルゴリズムを提供し、医学研究に貢献しています。本稿では、機械学習技術を用いた脳腫瘍検出アルゴリズムの実装を紹介します。そのために、まず、環境、データセット、必要なライブラリについて説明します。その後、データセットをロードし、探索的なデータ解析を行います。そして、機械学習モデルについて説明し、その結果を得るための評価を行います。

この記事で紹介しているPython jupyterの完全なファイルはこちら

環境の設定

この記事で紹介するユースケースを完成させるには、環境を準備する必要があります。このセクションでは、提案するソリューションの実行環境とコンテキストを紹介します。

  • Windows 10: この記事で使用しているOSです。
  • Anaconda Navigator (Jupyter notebook): この記事で説明されているPythonコードは、Jupyter notebookで実行しています。

後のセクションで、今回使用するデータセットを保存するためのGridDBの使用方法を説明します。今回はメインプログラミング言語としてPythonを使用するため、PythonでGridDBを使用するための環境を準備する必要があります。そのために、以下のものが必要になります。

  • GridDB Pythonクライアント: GridDB Pythonクライアントは、Pythonを使用してGridDBと通信することができます。

    GridDB Pythonクライアントは、以下を利用して開発されています。

    — GridDB Cクライアント

    — SWIG (Simplified Wrapper and Interface Generator)

データの紹介

本稿で用いるデータセットには、患者の医療解析の結果得られた脳腫瘍の検出に関連する様々な測定単位に対応する7465個の列が含まれています。データセットは、各々が患者に対応する35のエントリで構成されています。データセットの最後の列はy列で、各患者について、脳腫瘍の医学的診断の解釈(正常または腫瘍)を示しています。このデータセットは一般に公開されており、Kaggleからダウンロードすることができます。この記事で提案する解決策を実現するために、データセットをダウンロードしてください。

必要なライブラリのインポート

まず、データセットを扱う必要があります。後の節で詳しく説明しますが、この記事ではデータセットを読み込む方法として、GridDBを使う方法と、CSVファイルを読み込んでデータセットの探索的分析を行うPandasの2つの選択肢を用意しています。どちらの場合も、必要なライブラリのインポートが必要です。Sklearnライブラリのおかげで、データセットが機械学習モデルに適合するように準備され、後に同じライブラリによって評価されます。Jupyter Notebookの以下のセルは、このプロジェクトで使用する必要なライブラリをインポートしています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix,accuracy_score

データセットの読み込み

本節では、データセットを読み込む方法として、GridDB を利用する方法と、CSV ファイルを利用する方法の 2 つを紹介します。前項で説明したように、今回使用するデータセットは比較的大規模であり、より高い可用性のために高性能なデータベースが必要かもしれません。

GridDBは、IoTやビッグデータ向けに最適化された、拡張性の高いインメモリ型NoSQL時系列データベースです。これらの理由から、データセットの保存にGridDBを使用することは、様々な面で私たちのソリューションに利益をもたらすことが出来ます。今回は、すでにGridDBでデータベースを設計し、データセットを専用コンテナに格納しました。データを取得するためには、コンテナに問い合わせる必要があります。この操作は、以下のコードで行います。

import griddb_python as griddb

factory = griddb.StoreFactory.get_instance()

gridstore = factory.get_store(
    host="239.0.0.1",
    port=31999,
    cluster_name="defaultCluster",
    username="admin",
    password="admin"
)

col = gridstore.get_container("brain_tumor")

query = col.query("select *")
rs = query.fetch(False)
rows = rs.fetch_rows()

Pythonを用いたGridDBへのデータの読み書きについては、GridDBのブログをご覧になってください。

また、ダウンロードしたCSVファイルを利用することも可能です。Pandasライブラリのおかげで、データファイルを読み込むことが出来ます。

dataset = pd.read_csv("data.csv")

次節では、データセット変数で得られたデータを用いて、探索的なデータ分析を行います。

探索的データ解析

Pandasライブラリは、探索的なデータ分析を行うための一連の関数を提供しています。これらの関数の中には、 head(), columns, info(), dtypes が含まれます。

dataset.head()

前の行は、5つの項目を持つデータセットの抽出物を出力しています。これでデータセットの全体像を把握することが出来ます。

探索的データ解析を続け、データセットのコラムを取得します。

dataset.columns

この行は、次のような結果を出力します。

Index(['Unnamed: 0', 'X53416', 'M83670', 'X90908', 'M97496', 'X90908.1',    'U37019', 'R48602', 'T96548', 'X64559',    ...    'H87456', 'R64130', 'H11125.1', 'U22055', 'L22524', 'M13699.1',    'X54489', 'T55008', 'M10065.2', 'y'],   dtype='object', length=7466)

見ての通り、データセットの最後の列は、以前のセクションで説明した y 列です。 また、列の数が7466であり、1つ1つがID列に相当することが分かります。

では、データセットに対してinfo()関数を実行します。

dataset.info()

このコードのセルは、次のような結果を出力します。

<class 'pandas.core.frame.DataFrame'>RangeIndex: 36 entries, 0 to 35Columns: 7466 entries, Unnamed: 0 to ydtypes: int64(7465), object(1)memory usage: 2.1+ MB

この出力は、データセットのサイズ、データ型、列と行の数に関する一般的な情報を提供します。

本記事のGithubリポジトリでは、データセットに対して他の関数を実行し、探索的なデータ分析を完成させています。詳しくはリポジトリをご確認ください。

機械学習モデル

ここでは、データセットのエントリーを分類するために、この記事で使用した機械学習モデルの実装について説明します。この段階に入る前に、データセットの分割など、いくつかの操作を行う必要があります。

まず、変数 Xy に値を代入します。この例では、 X 変数にデータセットのスライスを代入します。関数 iloc は、データセットの 2 次元構造化行列表現である dataframe を返します。同様に、変数 y には、1次元の配列である系列が格納されます。この場合、 y 変数には、データセットの最後の列が格納されます。先ほどのセクションを思い出すと、yカラムには、脳腫瘍の医学的解析の実際の解釈、つまり腫瘍か正常かが格納されています。この操作は、以下のようなコードで実現されます。

X=dataset.iloc[:,:-1].values
y=dataset.iloc[:,-1].values

次に、カテゴリ変数 y をエンコードする必要があります。これは、y カラムの “Normal” と “tumor” の値を、それぞれ 0 と 1 に変換するものです。このエンコーディングは、 LabelEncoder のおかげで実現できます。

from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
y=le.fit_transform(y)

この時点で、データセットをトレーニングデータとテストデータに分割する準備が整いました。学習データはモデルの学習に使用されます。モデルはこのデータを使って、後でインスタンスを正しく分類します。これを実現するのが、以下のコード群です。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=.2,random_state=0)

これらのオペレーションを実行したら、分類モデルを作成する準備ができました。これは StandardScaler のおかげで、次のようなコードで実行されます。

from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
X_train=sc.fit_transform(X_train)
X_test=sc.transform(X_test)

その後、分類アルゴリズムを選択します。この例では、ロジスティック回帰を選択します。この他にも、k-nearest neighborやランダムフォレスト分類器などのアルゴリズムがあります。これらのアルゴリズムの例とそれに対応する結果は、Githubリポジトリに掲載されています。

from sklearn.linear_model import LogisticRegression
classifier=LogisticRegression()
classifier.fit(X_train,y_train)

モデル評価

この段階で、私たちはモデルを評価し、テストデータを使って予測結果を得る準備が出来ました。これは、以下のコードによって実現されます。

y_pred_LogisticRegression=classifier.predict(X_test)
accuracy_score(y_test,y_pred_LogisticRegression)

予測結果の出力は100%であり、このアルゴリズムはすべてのインスタンスを脳腫瘍、または正常な臨床状態として正しく予測、分類できたことを意味します。

結論

機械学習の研究は、医療や臨床のソリューションのためのサポートシステムを提供することが出来ます。今回は、機械学習、Python、GridDBを用いた脳腫瘍検出モデルを提供しました。そのために、同じコンテキストでの実行を再現するための環境設定から始めました。その後、脳腫瘍のデータセットを導入しました。必要なPythonのライブラリをインポートしました。データセットの読み込みは、GridDBを使うか、CSVファイルを使うかの2つの方法を紹介しました。そして、探索的なデータ解析を行いました。データセットを加工し、ロジスティック回帰を使用して設計された機械学習モデルに適したものにしました。そして、このモデルを評価し、予測結果を得ることが出来ました。

この記事で紹介しているPython jupyterの完全なファイルはこちら

参考文献

https://www.kaggle.com/code/hisoka2020/brain-tumor-classification-accuracy-100/data

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

Leave a Reply

Your email address will not be published. Required fields are marked *