{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.6.0'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tensorflow import keras\n", "keras.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 주택 가격 예측: 회귀 문제\n", "\n", "이 노트북은 [케라스 창시자에게 배우는 딥러닝](https://tensorflow.blog/케라스-창시자에게-배우는-딥러닝/) 책의 3장 6절의 코드 예제입니다. 책에는 더 많은 내용과 그림이 있습니다. 이 노트북에는 소스 코드에 관련된 설명만 포함합니다. 이 노트북의 설명은 케라스 버전 2.2.2에 맞추어져 있습니다. 케라스 최신 버전이 릴리스되면 노트북을 다시 테스트하기 때문에 설명과 코드의 결과가 조금 다를 수 있습니다.\n", "\n", "----\n", "\n", "앞의 두 예제는 분류 문제입니다. 입력 데이터 포인트의 개별적인 레이블 하나를 예측하는 것이 목적입니다. 또 다른 종류의 머신 러닝 문제는 개별적인 레이블 대신에 연속적인 값을 예측하는 회귀(regression)입니다. 예를 들어 기상 데이터가 주어졌을 때 내일 기온을 예측하거나 소프트웨어 명세가 주어졌을 때 소프트웨어 프로젝트가 완료될 시간을 예측하는 것입니다.\n", "\n", "회귀와 로지스틱 회귀 알고리즘을 혼돈하지 마세요. 로지스틱 회귀는 회귀 알고리즘이 아니라 분류 알고리즘입니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 보스턴 주택 가격 데이터셋\n", "\n", "1970년 중반 보스턴 외곽 지역의 범죄율, 지방세율 등의 데이터가 주어졌을 때 주택 가격의 중간 값을 예측해 보겠습니다.\n", "\n", "여기서 사용할 데이터셋은 이전 두 개의 예제와 다릅니다. 데이터 포인트가 506개로 비교적 개수가 적고 404개는 훈련 샘플로 102개는 테스트 샘플로 나누어져 있습니다. 입력 데이터에 있는 각 특성(예를 들어 범죄율)은 스케일이 서로 다릅니다. 어떤 값은 0과 1 사이의 비율을 나타내고 어떤 것은 1과 12 사이의 값을 가지거나 1과 100 사이의 값을 가집니다.\n", "\n", "데이터를 살펴보겠습니다:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/boston_housing.npz\n", "57344/57026 [==============================] - 0s 2us/step\n", "65536/57026 [==================================] - 0s 2us/step\n" ] } ], "source": [ "from tensorflow.keras.datasets import boston_housing\n", "\n", "(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(404, 13)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_data.shape" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(102, 13)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_data.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "여기서 볼 수 있듯이 404개의 훈련 샘플과 102개의 테스트 샘플이 있고 모두 13개의 수치 특성을 가지고 있습니다. 13개의 특성은 다음과 같습니다:\n", "\n", "1. Per capita crime rate.\n", "2. Proportion of residential land zoned for lots over 25,000 square feet.\n", "3. Proportion of non-retail business acres per town.\n", "4. Charles River dummy variable (= 1 if tract bounds river; 0 otherwise).\n", "5. Nitric oxides concentration (parts per 10 million).\n", "6. Average number of rooms per dwelling.\n", "7. Proportion of owner-occupied units built prior to 1940.\n", "8. Weighted distances to five Boston employment centres.\n", "9. Index of accessibility to radial highways.\n", "10. Full-value property-tax rate per $10,000.\n", "11. Pupil-teacher ratio by town.\n", "12. 1000 * (Bk - 0.63) ** 2 where Bk is the proportion of Black people by town.\n", "13. % lower status of the population.\n", "\n", "타깃은 주택의 중간 가격으로 천달러 단위입니다:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([15.2, 42.3, 50. , 21.1, 17.7, 18.5, 11.3, 15.6, 15.6, 14.4, 12.1,\n", " 17.9, 23.1, 19.9, 15.7, 8.8, 50. , 22.5, 24.1, 27.5, 10.9, 30.8,\n", " 32.9, 24. , 18.5, 13.3, 22.9, 34.7, 16.6, 17.5, 22.3, 16.1, 14.9,\n", " 23.1, 34.9, 25. , 13.9, 13.1, 20.4, 20. , 15.2, 24.7, 22.2, 16.7,\n", " 12.7, 15.6, 18.4, 21. , 30.1, 15.1, 18.7, 9.6, 31.5, 24.8, 19.1,\n", " 22. , 14.5, 11. , 32. , 29.4, 20.3, 24.4, 14.6, 19.5, 14.1, 14.3,\n", " 15.6, 10.5, 6.3, 19.3, 19.3, 13.4, 36.4, 17.8, 13.5, 16.5, 8.3,\n", " 14.3, 16. , 13.4, 28.6, 43.5, 20.2, 22. , 23. , 20.7, 12.5, 48.5,\n", " 14.6, 13.4, 23.7, 50. , 21.7, 39.8, 38.7, 22.2, 34.9, 22.5, 31.1,\n", " 28.7, 46. , 41.7, 21. , 26.6, 15. , 24.4, 13.3, 21.2, 11.7, 21.7,\n", " 19.4, 50. , 22.8, 19.7, 24.7, 36.2, 14.2, 18.9, 18.3, 20.6, 24.6,\n", " 18.2, 8.7, 44. , 10.4, 13.2, 21.2, 37. , 30.7, 22.9, 20. , 19.3,\n", " 31.7, 32. , 23.1, 18.8, 10.9, 50. , 19.6, 5. , 14.4, 19.8, 13.8,\n", " 19.6, 23.9, 24.5, 25. , 19.9, 17.2, 24.6, 13.5, 26.6, 21.4, 11.9,\n", " 22.6, 19.6, 8.5, 23.7, 23.1, 22.4, 20.5, 23.6, 18.4, 35.2, 23.1,\n", " 27.9, 20.6, 23.7, 28. , 13.6, 27.1, 23.6, 20.6, 18.2, 21.7, 17.1,\n", " 8.4, 25.3, 13.8, 22.2, 18.4, 20.7, 31.6, 30.5, 20.3, 8.8, 19.2,\n", " 19.4, 23.1, 23. , 14.8, 48.8, 22.6, 33.4, 21.1, 13.6, 32.2, 13.1,\n", " 23.4, 18.9, 23.9, 11.8, 23.3, 22.8, 19.6, 16.7, 13.4, 22.2, 20.4,\n", " 21.8, 26.4, 14.9, 24.1, 23.8, 12.3, 29.1, 21. , 19.5, 23.3, 23.8,\n", " 17.8, 11.5, 21.7, 19.9, 25. , 33.4, 28.5, 21.4, 24.3, 27.5, 33.1,\n", " 16.2, 23.3, 48.3, 22.9, 22.8, 13.1, 12.7, 22.6, 15. , 15.3, 10.5,\n", " 24. , 18.5, 21.7, 19.5, 33.2, 23.2, 5. , 19.1, 12.7, 22.3, 10.2,\n", " 13.9, 16.3, 17. , 20.1, 29.9, 17.2, 37.3, 45.4, 17.8, 23.2, 29. ,\n", " 22. , 18. , 17.4, 34.6, 20.1, 25. , 15.6, 24.8, 28.2, 21.2, 21.4,\n", " 23.8, 31. , 26.2, 17.4, 37.9, 17.5, 20. , 8.3, 23.9, 8.4, 13.8,\n", " 7.2, 11.7, 17.1, 21.6, 50. , 16.1, 20.4, 20.6, 21.4, 20.6, 36.5,\n", " 8.5, 24.8, 10.8, 21.9, 17.3, 18.9, 36.2, 14.9, 18.2, 33.3, 21.8,\n", " 19.7, 31.6, 24.8, 19.4, 22.8, 7.5, 44.8, 16.8, 18.7, 50. , 50. ,\n", " 19.5, 20.1, 50. , 17.2, 20.8, 19.3, 41.3, 20.4, 20.5, 13.8, 16.5,\n", " 23.9, 20.6, 31.5, 23.3, 16.8, 14. , 33.8, 36.1, 12.8, 18.3, 18.7,\n", " 19.1, 29. , 30.1, 50. , 50. , 22. , 11.9, 37.6, 50. , 22.7, 20.8,\n", " 23.5, 27.9, 50. , 19.3, 23.9, 22.6, 15.2, 21.7, 19.2, 43.8, 20.3,\n", " 33.2, 19.9, 22.5, 32.7, 22. , 17.1, 19. , 15. , 16.1, 25.1, 23.7,\n", " 28.7, 37.2, 22.6, 16.4, 25. , 29.8, 22.1, 17.4, 18.1, 30.3, 17.5,\n", " 24.7, 12.6, 26.5, 28.7, 13.3, 10.4, 24.4, 23. , 20. , 17.8, 7. ,\n", " 11.8, 24.4, 13.8, 19.4, 25.2, 19.4, 19.4, 29.1])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_targets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 가격은 일반적으로 10,000달러에서 50,000달러 사이입니다. 저렴하게 느껴질텐데 1970년대 중반이라는 걸 기억하세요. 아직 인플레이션에 영향을 받지 않은 가격입니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 데이터 준비\n", "\n", "상이한 스케일을 가진 값을 신경망에 주입하면 문제가 됩니다. 네트워크가 이런 다양한 데이터에 자동으로 맞추려고 할 수 있지만 이는 확실히 학습을 더 어렵게 만듭니다. 이런 데이터를 다룰 때 대표적인 방법은 특성별로 정규화를 하는 것입니다. 입력 데이터에 있는 각 특성(입력 데이터 행렬의 열)에 대해서 특성의 평균을 빼고 표준 편차로 나눕니다. 특성의 중앙이 0 근처에 맞춰지고 표준 편차가 1이 됩니다. 넘파이를 사용하면 간단하게 할 수 있습니다:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "mean = train_data.mean(axis=0)\n", "train_data -= mean\n", "std = train_data.std(axis=0)\n", "train_data /= std\n", "\n", "test_data -= mean\n", "test_data /= std" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "테스트 데이터를 정규화할 때 사용한 값이 훈련 데이터에서 계산한 값임을 주목하세요. 머신 러닝 작업 과정에서 절대로 테스트 데이터에서 계산한 어떤 값도 사용해서는 안 됩니다. 데이터 정규화처럼 간단한 작업조차도 그렇습니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 모델 구성\n", "\n", "샘플의 개수가 적기 때문에 64개의 유닛을 가진 두 개의 은닉층으로 작은 네트워크를 구성하여 사용하겠습니다. 일반적으로 훈련 데이터의 개수가 적을수록 과대적합이 더 쉽게 일어나므로 작은 모델을 사용하는 것이 과대적합을 피하는 한 방법입니다." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras import models\n", "from tensorflow.keras import layers\n", "\n", "def build_model():\n", " # 동일한 모델을 여러 번 생성할 것이므로 함수를 만들어 사용합니다\n", " model = models.Sequential()\n", " model.add(layers.Dense(64, activation='relu',\n", " input_shape=(train_data.shape[1],)))\n", " model.add(layers.Dense(64, activation='relu'))\n", " model.add(layers.Dense(1))\n", " model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])\n", " return model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 네트워크의 마지막 층은 하나의 유닛을 가지고 있고 활성화 함수가 없습니다(선형 층이라고 합니다). 이것이 전형적인 스칼라 회귀(하나의 연속적인 값을 예측하는 회귀)를 위한 구성입니다. 활성화 함수를 적용하면 출력 값의 범위를 제한하게 됩니다. 예를 들어 마지막 층에 `sigmoid` 활성화 함수를 적용하면 네트워크가 0과 1 사이의 값을 예측하도록 학습될 것입니다. 여기서는 마지막 층이 순수한 선형이므로 네트워크가 어떤 범위의 값이라도 예측하도록 자유롭게 학습됩니다.\n", "\n", "이 모델은 `mse` 손실 함수를 사용하여 컴파일합니다. 이 함수는 평균 제곱 오차(mean squared error)의 약자로 예측과 타깃 사이 거리의 제곱입니다. 회귀 문제에서 널리 사용되는 손실 함수입니다.\n", "\n", "훈련하는 동안 모니터링을 위해 새로운 지표인 평균 절대 오차를 측정합니다. 이는 예측과 타깃 사이 거리의 절댓값입니다. 예를 들어 이 예제에서 MAE가 0.5이면 예측이 평균적으로 $500 정도 차이가 난다는 뜻입니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## K-겹 검증을 사용한 훈련 검증\n", "\n", "(훈련에 사용할 에포크의 수 같은) 매개변수들을 조정하면서 모델을 평가하기 위해 이전 예제에서 했던 것처럼 데이터를 훈련 세트와 검증 세트로 나눕니다. 데이터 포인트가 많지 않기 때문에 검증 세트도 매우 작아집니다(약 100개의 샘플). 결국 검증 세트와 훈련 세트로 어떤 데이터 포인트가 선택됐는지에 따라 검증 점수가 크게 달라집니다. 검증 세트의 분할에 대한 검증 점수의 분산이 높습니다. 이렇게 되면 신뢰있는 모델 평가를 신뢰있게 할 수 없습니다.\n", "\n", "이런 상황에서 가장 좋은 방법은 K-겹 교차 검증을 사용하는 것입니다. 데이터를 K개의 분할(즉, 폴드)로 나누고(일반적으로 K = 4 또는 5), K개의 모델을 각각 만들어 K - 1개의 분할에서 훈련하고 나머지 분할에서 평가하는 방법입니다. 모델의 검증 점수는 K 개의 검증 점수의 평균이 됩니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "코드로 보면 이해하기 쉽습니다:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "처리중인 폴드 # 0\n", "처리중인 폴드 # 1\n", "처리중인 폴드 # 2\n", "처리중인 폴드 # 3\n" ] } ], "source": [ "import numpy as np\n", "\n", "k = 4\n", "num_val_samples = len(train_data) // k\n", "num_epochs = 100\n", "all_scores = []\n", "for i in range(k):\n", " print('처리중인 폴드 #', i)\n", " # 검증 데이터 준비: k번째 분할\n", " val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]\n", " val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]\n", "\n", " # 훈련 데이터 준비: 다른 분할 전체\n", " partial_train_data = np.concatenate(\n", " [train_data[:i * num_val_samples],\n", " train_data[(i + 1) * num_val_samples:]],\n", " axis=0)\n", " partial_train_targets = np.concatenate(\n", " [train_targets[:i * num_val_samples],\n", " train_targets[(i + 1) * num_val_samples:]],\n", " axis=0)\n", "\n", " # 케라스 모델 구성(컴파일 포함)\n", " model = build_model()\n", " # 모델 훈련(verbose=0 이므로 훈련 과정이 출력되지 않습니다)\n", " model.fit(partial_train_data, partial_train_targets,\n", " epochs=num_epochs, batch_size=1, verbose=0)\n", " # 검증 세트로 모델 평가\n", " val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)\n", " all_scores.append(val_mae)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1.9657632112503052, 2.4418540000915527, 2.568808078765869, 2.333911657333374]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_scores" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3275842368602753" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(all_scores)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "검증 세트가 다르므로 확실히 검증 점수가 2.0에서 2.8까지 변화가 큽니다. 평균값(2.4)이 각각의 점수보다 훨씬 신뢰할 만한 점수입니다. 이것이 K-겹 교차 검증의 핵심입니다. 이 예에서는 평균적으로 3,000달러 정도 차이가 납니다. 주택 가격의 범위가 10,000달러에서 50,000달러 사이인 것을 감안하면 비교적 큰 값입니다.\n", "\n", "신경망을 조금 더 오래 500 에포크 동안 훈련해 보죠. 각 에포크마다 모델이 얼마나 개선되는지 기록하기 위해 훈련 루프를 조금 수정해서 에포크의 검증 점수를 로그에 저장하겠습니다:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras import backend as K\n", "\n", "# 메모리 해제\n", "K.clear_session()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "처리중인 폴드 # 0\n", "처리중인 폴드 # 1\n", "처리중인 폴드 # 2\n", "처리중인 폴드 # 3\n" ] } ], "source": [ "num_epochs = 500\n", "all_mae_histories = []\n", "for i in range(k):\n", " print('처리중인 폴드 #', i)\n", " # 검증 데이터 준비: k번째 분할\n", " val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples]\n", " val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples]\n", "\n", " # 훈련 데이터 준비: 다른 분할 전체\n", " partial_train_data = np.concatenate(\n", " [train_data[:i * num_val_samples],\n", " train_data[(i + 1) * num_val_samples:]],\n", " axis=0)\n", " partial_train_targets = np.concatenate(\n", " [train_targets[:i * num_val_samples],\n", " train_targets[(i + 1) * num_val_samples:]],\n", " axis=0)\n", "\n", " # 케라스 모델 구성(컴파일 포함)\n", " model = build_model()\n", " # 모델 훈련(verbose=0 이므로 훈련 과정이 출력되지 않습니다)\n", " history = model.fit(partial_train_data, partial_train_targets,\n", " validation_data=(val_data, val_targets),\n", " epochs=num_epochs, batch_size=1, verbose=0)\n", " mae_history = history.history['val_mae']\n", " all_mae_histories.append(mae_history)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "그다음 모든 폴드에 대해 에포크의 MAE 점수의 평균을 계산합니다:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "average_mae_history = [\n", " np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "그래프로 그려 보겠습니다:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(range(1, len(average_mae_history) + 1), average_mae_history)\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Validation MAE')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 그래프는 범위가 크고 변동이 심하기 때문에 보기가 좀 어렵습니다. 다음처럼 해 보죠:\n", "\n", "* 곡선의 다른 부분과 스케일이 많이 다른 첫 10개 데이터 포인트를 제외시킵니다.\n", "* 부드러운 곡선을 얻기 위해 각 포인트를 이전 포인트의 지수 이동 평균으로 대체합니다." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def smooth_curve(points, factor=0.9):\n", " smoothed_points = []\n", " for point in points:\n", " if smoothed_points:\n", " previous = smoothed_points[-1]\n", " smoothed_points.append(previous * factor + point * (1 - factor))\n", " else:\n", " smoothed_points.append(point)\n", " return smoothed_points\n", "\n", "smooth_mae_history = smooth_curve(average_mae_history[10:])\n", "\n", "plt.plot(range(1, len(smooth_mae_history) + 1), smooth_mae_history)\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Validation MAE')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "이 그래프를 보면 검증 MAE가 80번째 에포크 이후에 줄어드는 것이 멈추었습니다. 이 지점 이후로는 과대적합이 시작됩니다.\n", "\n", "모델의 다른 매개변수에 대한 튜닝이 끝나면(에포크 수뿐만 아니라 은닉층의 크기도 조절할 수 있습니다) 모든 훈련 데이터를 사용하고 최상의 매개변수로 최종 실전에 투입될 모델을 훈련시킵니다. 그다음 테스트 데이터로 성능을 확인합니다:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4/4 [==============================] - 0s 2ms/step - loss: 21.4324 - mae: 2.9905\n" ] } ], "source": [ "# 새롭게 컴파인된 모델을 얻습니다\n", "model = build_model()\n", "# 전체 데이터로 훈련시킵니다\n", "model.fit(train_data, train_targets,\n", " epochs=80, batch_size=16, verbose=0)\n", "test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.9905059337615967" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_mae_score" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "아직 2,675달러 정도 차이가 나네요." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 정리\n", "\n", "다음은 이 예제에서 배운 것들입니다.\n", "\n", "* 회귀는 분류에서 사용했던 것과는 다른 손실 함수를 사용합니다. 평균 제곱 오차(MSE)는 회귀에서 자주 사용되는 손실 함수입니다.\n", "* 비슷하게 회귀에서 사용되는 평가 지표는 분류와 다릅니다. 당연히 정확도 개념은 회귀에 적용되지 않습니다. 일반적인 회귀 지표는 평균 절대 오차(MAE)입니다.\n", "* 입력 데이터의 특성이 서로 다른 범위를 가지면 전처리 단계에서 각 특성을 개별적으로 스케일 조정해야 합니다.\n", "* 가용한 데이터가 적다면 K-겹 검증을 사용하는 것이 신뢰할 수 있는 모델 신뢰있게 평가 방법입니다.\n", "* 가용한 훈련 데이터가 적다면 과대적합을 피하기 위해 은닉층의 수를 줄인 모델이 좋습니다(일반적으로 하나 또는 두 개).\n", "\n", "세 개의 예제 시리즈를 마칩니다. 이제 벡터 데이터 입력을 받는 일반적인 문제를 다룰 수 있습니다:\n", "\n", "* 이진 분류\n", "* 단일 레이블 다중 분류\n", "* 스칼라 회귀\n", "\n", "다음 장에서 이 예제들에서 보았던 데이터 전처리, 모델 평가, 과대접과 같은 개념에 대해 조금 더 이론적인 설명을 보완하겠습니다." ] } ], "metadata": { "kernelspec": { "display_name": "TensorFlow 2.3 on Python 3.6 (CUDA 10.1)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 2 }