{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] }, { "data": { "text/plain": [ "'2.2.4'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "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": [], "source": [ "from 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 keras import models\n", "from 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": [ "[2.0956787838794217, 2.220593797098292, 2.859968412040484, 2.40535704039111]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_scores" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3953995083523267" ] }, "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 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_mean_absolute_error']\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": [ "102/102 [==============================] - 0s 376us/step\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.675026828167485" ] }, "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": "Python 3", "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.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }