Main Content

체지방 추정

이 예제에서는 함수 피팅 신경망이 신체 계측치를 기반으로 체지방률을 추정하는 방식을 보여줍니다.

문제: 체지방률 추정하기

이 예제에서는 13개의 신체적 특성으로 설명되는 사람의 체지방률을 추정하는 신경망을 만들어 봅니다.

  • 연령(단위: 세)

  • 체중(단위: lbs)

  • 신장(단위: 인치)

  • 목 둘레(단위: cm)

  • 가슴 둘레(단위: cm)

  • 배 둘레(단위: cm)

  • 골반 둘레(단위: cm)

  • 허벅지 둘레(단위: cm)

  • 무릎 둘레(단위: cm)

  • 발목 둘레(단위: cm)

  • 이두박근(팽창) 둘레(단위: cm)

  • 팔뚝 둘레(단위: cm)

  • 손목 둘레(단위: cm)

이 예제는 입력값을 연관된 목표 출력값에 맞추는 피팅 문제입니다. 알려진 입력값이 주어졌을 때 알려진 목표값을 추정할 뿐 아니라 일반화를 수행하여 솔루션 설계 시 사용하지 않은 입력값에 대한 출력값도 정확하게 추정하는 신경망을 만들어 보겠습니다.

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

신경망은 함수 피팅 문제에서 매우 잘 동작합니다. 신경망은 충분한 수의 요소(뉴런)를 가지고 있으면 어떤 데이터든 임의의 정확도로 피팅할 수 있습니다. 그리고 비선형 문제를 해결하는 데 특히 적합합니다. 체지방 축적과 같은 실세계의 현상은 비선형적 특성을 가지므로 신경망은 이러한 문제를 해결하기에 적합합니다.

13개의 신체 특성이 신경망의 입력값으로 사용되고 체지방률이 목표값이 됩니다.

체지방률을 이미 알고 있는 신체 계측치를 사용하여 목표값을 생성하는 훈련을 수행하도록 신경망을 설계해 보겠습니다.

데이터 준비하기

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

입력 행렬의 각 i번째 열은 체지방률을 알고 있는 신체를 나타내는 13개의 요소를 갖습니다.

이에 대응하는 목표 행렬의 각 열은 체지방률을 나타내는 1개의 요소를 갖습니다.

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

[X,T] = bodyfat_dataset;

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

X와 T 모두 252개의 열을 가지고 있습니다. 이는 252개의 신체 계측치(입력값)와 이와 연관된 체지방률(목표값)을 나타냅니다.

입력 행렬 X는 13개의 특성에 대응하는 13개의 행을 갖습니다. 각 예로부터 원하는 출력값은 체지방률 하나이므로 목표 행렬 T는 1개의 행을 갖습니다.

size(X)
ans = 1×2

    13   252

size(T)
ans = 1×2

     1   252

신경망을 사용하여 함수 피팅하기

다음 단계는 체지방률 추정을 학습하는 신경망을 만드는 것입니다.

신경망은 임의의 초기 가중치로 시작하므로 이 예제의 결과는 매 실행마다 약간씩 달라집니다. 이러한 임의성을 방지하기 위해 난수 시드값이 설정됩니다. 그러나 자신만의 고유한 응용 프로그램인 경우에는 난수 시드값을 설정할 필요가 없습니다.

setdemorandstream(491218382)

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

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

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

net = fitnet(15);
view(net)

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

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

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

[net,tr] = train(net,X,T);

{"String":"Figure Neural Network Training (24-Jul-2022 21:29:31) contains an object of type uigridlayout.","Tex":[],"LaTex":[]}

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

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

훈련 세트, 검증 세트, 테스트 세트 각각에 대해 성능이 표시됩니다. 검증 세트에 대해 가장 좋은 성능을 보이는 신경망이 최종 신경망이 됩니다.

figure
plotperform(tr)

{"String":"Figure Performance (plotperform) contains an axes object. The axes object with title Best Validation Performance is 34.4082 at epoch 3 contains 6 objects of type line. These objects represent Train, Validation, Test, Best.","Tex":"Best Validation Performance is 34.4082 at epoch 3","LaTex":[]}

신경망 테스트하기

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

testX = X(:,tr.testInd);
testT = T(:,tr.testInd);

testY = net(testX);

perf = mse(net,testT,testY)
perf = 36.9404

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

회귀 플롯은 실제 신경망 출력값을 이와 연관된 목표값에 대해 플로팅하여 보여줍니다. 신경망이 데이터를 잘 피팅하도록 학습했으면 이 출력값-목표값 관계의 선형 피팅은 플롯의 왼쪽 아래 코너와 오른쪽 위 코너를 가로지르는 선에 가까워집니다.

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

Y = net(X);

figure
plotregression(T,Y)

{"String":"Figure Regression (plotregression) contains an axes object. The axes object with title : R=0.82683 contains 3 objects of type line. These objects represent Y = T, Fit, Data.","Tex":": R=0.82683","LaTex":[]}

신경망이 데이터를 얼마나 잘 피팅했는지 알 수 있는 세 번째 척도는 오차 히스토그램입니다. 오차 히스토그램은 오차 크기의 분포를 보여줍니다. 일반적으로 대부분의 오차는 0에 가깝고 극히 일부의 오차만 이 값에서 멀리 떨어져 있습니다.

e = T - Y;

figure
ploterrhist(e)

{"String":"Figure Error Histogram (ploterrhist) contains an axes object. The axes object with title Error Histogram with 20 Bins contains 23 objects of type bar, line, text. This object represents Zero Error.","Tex":"Error Histogram with 20 Bins","LaTex":[]}

이 예제에서는 신체적 특성으로부터 체지방률을 추정하는 신경망을 설계하는 방법을 살펴보았습니다.

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