Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

癌の検出

この例では、タンパク質プロファイルに関する質量分析データを使用して癌を検出するようにニューラル ネットワークに学習させる方法を説明します。

はじめに

血清プロテオミクス パターン診断を使用すると、疾患のある患者と疾患のない患者の標本を区別することができます。プロファイル パターンは、SELDI (表面増強レーザー脱着/イオン化) タンパク質質量分析を使用して生成されます。この技術には、悪性腫瘍病理学における臨床診断テストを改善できる可能性があります。

問題: 癌の検出

目標は、質量分析データから癌患者と対照患者を区別できる分類器を作成することです。

この例では、分類器による癌患者と対照患者の区別に使用可能な絞り込んだ測定値、つまり "特徴" を選択する方法を使用します。これらの特徴量は、特定の質量/充填量値でのイオン強度レベルです。

データの書式設定

この例で使用されるデータは、ファイル ovarian_dataset.mat に含まれています。「FDA-NCI 臨床プロテオミクス プログラム データバンク」から提供されています。このデータ セットの詳細については、[1] および [2] を参照してください。

Batch Processing of Spectra Using Sequential and Parallel Computing (Bioinformatics Toolbox)の手順に従って、データ ファイル OvarianCancerQAQCdataset.mat を作成します。新しいファイルには、変数 YMZ、および grp が含まれています。

Y の各列は、患者から得られた測定値を表します。Y には 216 人の患者を表す 216 の列があり、そのうち 121 人は卵巣癌患者で 95 人は正常な患者です。

Y の各行は、MZ に示す特定の質量/充填量値でのイオン強度レベルを表します。MZ には 15000 個の質量/充填量値があり、Y の各行は特定の質量/充填量値での患者のイオン強度レベルを表します。

変数 grp は、これらのどの標本が癌患者を表し、どの標本が正常な患者を表すかを示すインデックス情報を保持します。

主な特徴のランク付け

このタスクは、特徴の数が観測値の数を大幅に上回っているにもかかわらず、1 つの特徴で正しく分類できる典型的な分類問題です。そのため、目標は、複数の特徴の重み付けを行うと同時に、過適合にならない汎化されたマッピングを生成する方法を適切に学習する分類器を見つけることです。

重要な特徴を見つける簡単な方法は、M/Z の各値が独立であると仮定し、2 群 t 検定の計算を行うことです。rankfeatures は、最も重要な M/Z 値のインデックスを返します。たとえば、検定統計量の絶対値によってランク付けされた 100 個のインデックスを返します。

OvarianCancerQAQCdataset.mat を読み込んで、rankfeatures (Bioinformatics Toolbox)を使用して特徴をランク付けし、入力 x として上位 100 の測定値を選択します。

ind = rankfeatures(Y,grp,'Criterion','ttest','NumberOfIndices',100); 
x = Y(ind,:);

2 つのクラスのターゲット t を以下のように定義します。

t = double(strcmp('Cancer',grp)); 
t = [t; 1-t];

スクリプトの前処理手順と上記の例は、前処理および特徴選択の想定される代表的な手順を示すためのものです。異なる手順またはパラメーターを使用すると、異なる結果が得られたり、結果が改善されたりする場合があります。

[x,t] = ovarian_dataset;
whos x t
  Name        Size              Bytes  Class     Attributes

  t           2x216              3456  double              
  x         100x216            172800  double              

x 内の各列は、216 人の異なる患者の 1 人を表します。

x の各行は、各患者の 100 個の特定の質量/充填量値でのイオン強度レベルを表します。

変数 t には 2 行から成る 216 個の値があり、それぞれの値は癌患者を示す [1;0]、または正常な患者を示す [0;1] のいずれかになっています。

フィードフォワード ニューラル ネットワークを使用した分類

いくつかの重要な特徴を特定したら、この情報を使用して癌の標本と正常な標本を分類できます。

ニューラル ネットワークはランダムな初期重みで初期化されるため、ネットワークの学習後に得られる結果は例を実行するたびに多少異なります。このようなランダム性を回避するには、毎回同じ結果を生成するように乱数シードを設定します。ただし、乱数シードの設定はユーザー独自のアプリケーションには不要です。

setdemorandstream(672880951)

5 つの隠れ層ニューロンがある 1 つの隠れ層のフィードフォワード ニューラル ネットワークを作成し、学習を行います。入力標本およびターゲット標本が自動的に学習セット、検証セット、およびテスト セットに分割されます。学習セットは、ネットワークに教えるために使用されます。検証セットに対してネットワークの改善が続いている限り、学習が続行されます。テスト セットを使用することで、ネットワークの精度を独立して測定できます。

ネットワークはまだ入力データとターゲット データに一致するように構成されていないため、入力と出力のサイズは 0 です。ネットワークに学習させるときに、この構成が行われます。

net = patternnet(5);
view(net)

これでネットワークの学習の準備が整いました。標本が学習セット、検証セット、およびテスト セットに自動的に分割されます。学習セットは、ネットワークに教えるために使用されます。検証セットに対してネットワークの改善が続いている限り、学習が続行されます。テスト セットを使用することで、ネットワークの精度を独立して測定できます。

Neural Network Training Tool を使用すると、学習するネットワークと、学習に使用されているアルゴリズムが表示されます。さらに、学習中には学習の状態が表示され、学習を停止した条件が緑で強調表示されます。

下部にあるボタンを使用すると、便利なプロットを開くことができます。これらのプロットは、学習中および学習後に開くことができます。アルゴリズム名およびプロット ボタンの隣のリンクを使用すると、これらに関するドキュメンテーションを開くことができます。

[net,tr] = train(net,x,t);

学習中にネットワーク性能がどのように改善されているかを確認するには、学習ツールの [パフォーマンス] ボタンをクリックするか、関数 plotperform を使用します。

性能は、平均二乗誤差で測定され、対数スケールで表示されます。これは、ネットワークの学習が進むと急激に低下します。

性能は、学習セット、検証セット、およびテスト セットのそれぞれについて表示されます。

plotperform(tr)

メイン データセットから分割したテスト標本を使用して、学習済みニューラル ネットワークをテストできるようになりました。テスト データは学習にまったく使用されていないため、ネットワークをテストするための "標本外" のデータセットとなります。これにより、実際のデータでテストした場合にネットワークがどの程度の性能かを推定できます。

ネットワークの出力は 0 ~ 1 の範囲にあります。癌患者を示す 1 または正常な患者を示す 0 が得られるように出力のしきい値を設定します。

testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

testY = net(testX);
testClasses = testY > 0.5
testClasses = 2×32 logical array

   1   1   1   1   1   1   1   1   1   1   1   1   1   0   0   1   1   0   0   1   1   0   0   0   0   0   0   0   0   0   1   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   1   1   0   0   1   1   1   1   1   1   1   1   1   0   1

ニューラル ネットワークがどの程度データに当てはまるかを測定する方法の 1 つは、混同プロットです。

混同行列は、正しい分類と正しくない分類の比率を示します。正しい分類は、行列の対角部分の緑の正方形に表示されます。赤い正方形は、正しくない分類を表します。

ネットワークが正確な場合、赤い正方形の比率は小さくなり、誤分類がほとんどないことを示します。

ネットワークが正確でない場合は、より長時間の学習を行うか、隠れニューロンを増やしたネットワークの学習を試すことができます。

plotconfusion(testT,testY)

正しい分類と正しくない分類の全体的な比率を次に示します。

[c,cm] = confusion(testT,testY);

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
Percentage Correct Classification   : 84.375000%
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
Percentage Incorrect Classification : 15.625000%

ニューラル ネットワークがどの程度データに当てはまるかを測定するもう 1 つの方法は、受信者動作特性プロットです。このプロットは、出力のしきい値が 0 ~ 1 の範囲で変化する場合に偽陽性率と真陽性率にどのような関連があるかを示します。

線が左上にあればあるほど、高い真陽性率を得るために受け入れる必要がある偽陽性の数が減少します。最適な分類器とは、線が左下隅から左上隅、右上隅、またはその近くに向かって伸びている分類器です。

クラス 1 は癌患者、クラス 2 は正常な患者を示します。

plotroc(testT,testY)

この例では、ニューラル ネットワークを癌の検出用分類器として使用する方法を説明しました。分類器の性能を向上させるために、主成分分析などの手法を使用して、ニューラル ネットワークの学習に使用されるデータの次元を減らすこともできます。

参考文献

[1] T.P. Conrads, et al., "High-resolution serum proteomic features for ovarian detection", Endocrine-Related Cancer, 11, 2004, pp. 163-178.

[2] E.F. Petricoin, et al., "Use of proteomic patterns in serum to identify ovarian cancer", Lancet, 359(9306), 2002, pp. 572-577.