이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

와인 분류

이 예제에서는 패턴 인식 신경망이 와인의 화학 성분 특성을 기준으로 와인을 와이너리별로 분류하는 방법을 보여줍니다.

문제: 와인 분류하기

이 예제에서는 13개 와이너리의 와인을 13개의 특성을 기준으로 분류하는 신경망을 만들어 봅니다.

  • 알코올

  • 말산

  • 회분

  • 회분의 염기도

  • 마그네슘

  • 총 페놀

  • 플라보노이드

  • 비플라보노이드 페놀

  • 프로안토시아니딘

  • 색의 강도

  • 빛깔

  • 희석한 와인의 OD280/OD315

  • 프롤린

이 예제는 입력값이 각기 다른 클래스와 연관되어 있을 때 패턴을 인식하는 문제입니다. 여기서는 알려진 와인을 올바르게 분류할 뿐 아니라 일반화를 수행하여 솔루션 설계 시 사용하지 않은 와인도 올바르게 분류하는 신경망을 만들어 봅니다.

신경망을 사용해야 하는 이유

신경망은 패턴 인식 문제를 해결하는 데 매우 유용합니다. 신경망은 충분한 수의 요소(뉴런)를 가지고 있으면 어떤 데이터든 임의의 정확도로 분류할 수 있습니다. 특히 변수가 여러 개인 복잡한 의사 결정 경계 문제에 적합합니다. 따라서 신경망은 와인 분류 문제를 해결하기에 적합합니다.

13개의 이웃 특성이 신경망의 입력값으로 사용됩니다. 각 입력값에 대한 목표값은 요소를 3개 가진 클래스 벡터이며 연관된 와이너리(#1, #2 또는 #3)에 해당하는 위치의 값이 1입니다.

이웃 특성을 사용하여 올바른 목표값 클래스를 생성하는 훈련을 수행하도록 신경망을 설계해 보겠습니다.

데이터 준비하기

분류 문제를 위한 데이터를 입력 행렬 X와 목표 행렬 T의 두 개 행렬로 구성하여 신경망에 사용할 데이터를 준비합니다.

입력 행렬의 각 i번째 열은 와이너리가 이미 알려진 와인에 대한 13개의 요소를 갖습니다.

이에 대응하는 목표 행렬의 각 열은 3개의 요소를 갖습니다. 연관된 와이너리에 해당하는 위치의 값이 1이고 나머지 요소의 값은 0입니다.

이러한 데이터셋을 다음과 같이 불러옵니다.

[x,t] = wine_dataset;

입력값 X와 목표값 T의 크기를 확인할 수 있습니다.

X와 T 모두 178개의 열을 가지고 있습니다. 이는 178개의 샘플 특성(입력값)과 이와 연관된 와이너리 클래스 벡터(목표값)를 나타냅니다.

입력 행렬 X는 13개의 특성에 대응하는 13개의 행을 갖습니다. 이 예제에서 와이너리가 3개이므로 목표 행렬 T는 3개의 행을 갖습니다.

size(x)
ans = 1×2

    13   178

size(t)
ans = 1×2

     3   178

신경망을 사용한 패턴 인식

다음 단계는 와인 분류를 학습하는 신경망을 만드는 것입니다.

신경망은 임의의 초기 가중치로 시작하므로 이 예제의 결과는 매 실행마다 약간씩 달라집니다.

2계층(즉, 은닉 계층 1개) 피드포워드 신경망은 은닉 계층에 뉴런이 충분히 주어진다면 어떠한 입력-출력 관계도 학습할 수 있습니다. 출력 계층이 아닌 계층은 은닉 계층이라고 부릅니다.

이 예제에서는 뉴런 10개로 구성된 하나의 은닉 계층을 사용해 보겠습니다. 일반적으로 문제가 어려울수록 더 많은 뉴런과, 그리고 경우에 따라 더 많은 계층이 필요합니다. 문제가 단순할수록 필요한 뉴런의 개수도 적어집니다.

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

net = patternnet(10);
view(net)

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

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

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

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

훈련하는 동안 네트워크의 성능이 얼마나 향상되는지 보려면 "Performance" 버튼을 클릭하거나 PLOTPERFORM을 호출하십시오.

성능은 평균 제곱 오차로 측정되어 로그 스케일로 표시됩니다. 네트워크가 훈련됨에 따라 오차가 빠르게 감소했습니다.

훈련 세트, 검증 세트, 테스트 세트 각각에 대해 성능이 표시됩니다.

plotperform(tr)

네트워크 테스트하기

이제 훈련된 신경망의 평균 제곱 오차를 테스트 샘플에 대해 측정할 수 있습니다. 이렇게 하면 실세계의 데이터에 적용했을 때 네트워크가 얼마나 잘 동작할지 가늠할 수 있습니다.

네트워크 출력값은 0과 1 사이의 범위에 있을 것이므로 vec2ind 함수를 사용하여 각 출력 벡터에서 가장 큰 요소의 위치를 클래스 인덱스로 가져올 수 있습니다.

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

testY = net(testX);
testIndices = vec2ind(testY)
testIndices = 1×27

     1     1     1     1     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     3     3     3     3     3     3     3     3

신경망이 데이터를 얼마나 잘 피팅했는지 알 수 있는 또 다른 척도는 정오 플롯입니다. 여기서는 모든 샘플에 대해 정오분류표가 플로팅되었습니다.

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

네트워크가 올바르게 분류하도록 학습했으면 빨간색 정사각형의 비율은 매우 작아서 오분류가 적었음을 나타낼 것입니다.

그렇지 않으면 훈련을 추가로 실시하거나 더 많은 은닉 뉴런을 사용하여 네트워크를 훈련시키는 것이 좋습니다.

plotconfusion(testT,testY)

올바른 분류와 잘못된 분류의 비율은 다음과 같습니다.

[c,cm] = confusion(testT,testY)
c = 0
cm = 3×3

    11     0     0
     0     8     0
     0     0     8

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

신경망이 데이터를 얼마나 잘 피팅했는지 알 수 있는 세 번째 척도는 ROC(수신자 조작 특성) 플롯입니다. ROC 플롯은 출력값의 임계값이 0에서 1까지 변함에 따라 거짓양성률과 참양성률의 관계가 어떻게 되는지 보여줍니다.

선이 왼쪽 위에 가까울수록 높은 참양성률을 얻기 위해 허용해야 하는 거짓양성의 개수가 줄어듭니다. 가장 좋은 분류기는 이 선이 왼쪽 아래 코너에서 왼쪽 위 코너로, 오른쪽 위 코너로 또는 여기에 가깝게 나타납니다.

plotroc(testT,testY)

이 예제에서는 와인의 특성에 따라 3개의 와이너리로 와인을 분류하는 신경망을 설계하는 방법을 살펴보았습니다.

신경망과 그 응용 분야에 대해 더 알아보려면 다른 예제와 문서를 살펴보십시오.