Main Content

암 검출

이 예제에서는 단백질 프로파일에 대한 질량 분석 데이터를 사용하여 암을 검출하도록 신경망을 훈련시키는 방법을 보여줍니다.

소개

혈청의 단백질 패턴을 진단하면 질병이 있는 환자에게서 채취한 샘플과 질병이 없는 환자에게서 채취한 샘플을 구분할 수 있습니다. 프로파일 패턴은 SELDI(Surface-Enhanced Laser Desorption and Ionization) 단백질 질량 분석 기술을 사용하여 생성됩니다. 이 기술을 활용하면 암 병리학의 임상 진단 테스트를 개선할 수 있습니다.

문제: 암 검출

목표는 질량 분석 데이터로부터 암 환자와 대조군을 구분하는 분류기를 만드는 것입니다.

이 예제에서는 분류기를 사용하여 암 환자와 대조군을 구분하는 데 사용할 수 있는 측정값("특징")의 축소된 세트를 선택하는 방법론을 따릅니다. 이러한 특징은 특정 질량/전하 값에서의 이온 강도 수준입니다.

데이터 형식 지정하기

이 예제에서는 FDA-NCI Clinical Proteomics Program Databank의 데이터를 사용합니다(파일 ovarian_dataset.mat에서 제공). 이 데이터 세트에 대한 자세한 설명은 [1]과 [2]를 참조하십시오.

Batch Processing of Spectra Using Sequential and Parallel Computing (Bioinformatics Toolbox) 항목의 단계에 따라 데이터 파일 OvarianCancerQAQCdataset.mat를 만듭니다. 새로 만든 파일은 변수 Y, MZ, grp를 포함합니다.

Y의 각 열은 환자로부터 측정한 값을 나타냅니다. Y에는 환자 216명에 대응하는 216개의 열이 있습니다. 그중에서 121명이 난소암 환자이고 95명이 정상 환자입니다.

Y의 각 행은 MZ에 지정된 질량-전하 값에서의 이온 강도 수준을 나타냅니다. MZ에는 15000개의 질량-전하 값이 있고, Y의 각 행은 각 질량-전하 값에서의 환자의 이온 강도 수준을 나타냅니다.

변수 grp에는 샘플 중 어느 것이 암 환자이고 어느 것이 정상 환자인지 나타내는 인덱스 정보가 들어 있습니다.

주요 특징들에 순위 지정하기

이 작업에서는 특징의 개수가 관측값의 개수보다 훨씬 많더라도 한 개의 특징만으로 올바른 분류를 찾는 전형적인 분류 문제를 수행합니다. 따라서 목표는 여러 개의 특징에 적절하게 가중치를 적용하는 방법을 학습하면서 동시에 과적합되지 않은 일반화된 매핑을 생성하는 분류기를 찾는 것입니다.

유의미한 특징을 찾는 간단한 방법은 각 M/Z 값이 독립적이라고 가정하고 이원 t-검정을 계산하는 것입니다. rankfeatures는 가장 유의미한 M/Z 값의 인덱스, 예를 들어, 검정 통계량의 절댓값을 기준으로 순위가 지정된 100개의 인덱스를 반환합니다.

OvarianCancerQAQCdataset.mat를 불러오고, rankfeatures (Bioinformatics Toolbox)를 사용하여 상위 100개의 측정값을 입력값 x로 선택합니다.

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명의 환자 중 하나를 나타냅니다.

x의 각 행은 각 환자에 대한 100개의 특정 질량-전하 값에서의 이온 강도 수준을 나타냅니다.

변수 t는 각각 216개의 값으로 구성된 2개의 행을 갖습니다. [1;0]은 암 환자를 나타내고 [0;1]은 정상 환자를 나타냅니다.

피드포워드 신경망을 사용한 분류

몇 개의 유의미한 특징을 확인했으니 이제 이 정보를 사용하여 암 샘플과 정상 샘플을 분류할 수 있습니다.

신경망은 임의의 초기 가중치로 초기화되므로 신경망을 훈련시킨 후의 결과는 예제를 실행할 때마다 약간씩 달라집니다. 이러한 임의성을 방지하기 위해 난수 시드값을 설정하여 매번 같은 결과를 생성하도록 하십시오. 그러나 자신만의 고유한 애플리케이션인 경우에는 난수 시드값을 설정할 필요가 없습니다.

setdemorandstream(672880951)

은닉 계층이 1개이고 이 은닉 계층의 뉴런이 5개인 피드포워드 신경망을 만들어서 훈련시킵니다. 입력값 샘플과 목표값 샘플은 자동으로 훈련 세트, 검증 세트, 테스트 세트로 나뉩니다. 훈련 세트는 신경망을 가르치는 데 사용됩니다. 훈련은 신경망이 검증 세트에 대해 계속해서 향상되는 한 지속됩니다. 테스트 세트는 신경망의 정확도를 가늠하는 독립적인 척도를 제공합니다.

신경망이 아직 입력 및 목표 데이터에 맞춰 구성되지 않았으므로 입력값과 출력값의 크기는 0입니다. 이 구성 작업은 신경망을 훈련시킬 때 수행됩니다.

net = patternnet(5);
view(net)

이제 신경망을 훈련시킬 준비가 되었습니다. 샘플은 자동으로 훈련 세트, 검증 세트, 테스트 세트로 나뉩니다. 훈련 세트는 신경망을 가르치는 데 사용됩니다. 훈련은 신경망이 검증 세트에 대해 계속해서 향상되는 한 지속됩니다. 테스트 세트는 신경망의 정확도를 가늠하는 독립적인 척도를 제공합니다.

Neural Network Training 툴은 훈련 중인 신경망과 훈련에 사용되는 알고리즘을 표시합니다. 또한 훈련 중의 상태를 표시하며 훈련을 중지시킨 기준을 녹색으로 강조 표시합니다.

하단의 버튼을 클릭하면 유용한 플롯이 열립니다. 플롯은 훈련하는 도중과 훈련을 마친 후에 열 수 있습니다. 알고리즘 이름과 플롯 버튼 옆에 있는 링크를 클릭하면 해당 항목에 대한 문서가 열립니다.

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

훈련하는 동안 신경망의 성능이 얼마나 향상되는지 보려면 훈련 툴의 "Performance" 버튼을 클릭하거나 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

신경망이 데이터를 얼마나 잘 피팅했는지 알 수 있는 한 척도는 정오 플롯입니다.

혼동행렬은 올바른 분류와 잘못된 분류의 비율을 보여줍니다. 올바른 분류는 행렬 대각선 위에 녹색 정사각형으로 표시됩니다. 빨간색 정사각형은 잘못된 분류를 나타냅니다.

신경망이 정확하면 빨간색 정사각형의 비율은 매우 작아서 오분류가 적었음을 나타낼 것입니다.

신경망이 정확하지 않으면 훈련을 더 오래 실시하거나 더 많은 은닉 뉴런을 사용하여 신경망을 훈련시킬 수 있습니다.

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%

신경망이 데이터를 얼마나 잘 피팅했는지 알 수 있는 또 다른 척도는 ROC(수신자 조작 특성) 플롯입니다. ROC 플롯은 출력값의 임계값이 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.