{
  "id": 200336,
  "title": "모델의 over-fitting을 방지하기 validation data 나누기",
  "url": "/competitions/2020mltermproject3dclassification/discussion/200336",
  "author_name": "Tae-Joo Kim",
  "post_date": "2020-11-30T03:19:54.867000",
  "votes": 0,
  "comment_count": 0,
  "views": 0,
  "content": "<p>해당 discussion은 텀프토젝트 진행에 필수 요소가 아닌 부수적인 부분입니다.</p>\n<hr>\n<p><img src=\"https://t1.daumcdn.net/cfile/tistory/9951E5445AAE1BE025\" alt=\"dataset\"><br>\n그림 1. dataset split</p>\n<p>Machine learning에서는 모델이 한 데이터에 epoch이 커지면서 over-fitting이 되는 것을 방지하기위해 dataset을 위의 그림과 같이 학습을 위한 train set, 학습이 끝난 모델을 검증하기 위한 validation set, 최종적으로 모델의 성능을 평가하기 위한 test set으로 나누어 사용합니다.</p>\n<p><img src=\"https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePPfN%2FbtqAviZBxQ1%2FU90kaNfkp0TUnEWcUDkyE1%2Fimg.png\" alt=\"과적합,과소적합 예시 사진\"><br>\n그림 2. 학습의 진행과 decision boundary의 형태 변화. 각 점은 training dataset에 포함된 data를 의미하며, 점의 색은 class를 의미함. <a href=\"https://untitledtblog.tistory.com/158\" target=\"_blank\">출처</a></p>\n<p>대부분 (train:validation):test = (6:2):2인 비율로 많이 나누어 사용되며, 예측해야할 타켓 정보를 가진 train set으로부터 분리하여 사용합니다.</p>\n<p>validation set과 test set 둘 다, 학습에 직접적으로 사용되지는 않지만, 모델을 검증하는 용도로 하는 것이라는 공통점이 존재합니다. 그럼 이 둘의 차이는 무엇일까요? over-fitting 방지를 위해 학습에 간접적으로 관여를 하는 부분에 차이가 존재합니다.  <br>\n validation set은 train set을 통한 학습이 종료된 후(한 epoch 종료 후), 모델로부터 validation set(model 관점에서는 unseen data)에 대한 평가를 진행합니다. 이로부터 얻은 평가는 학습에 진행 및 종료에 영향을 줄 수 있으며, 가장 좋은 성능을 가진 모델을 판단하는 척도에 사용되어 학습 중 간접적인 영향을 줍니다. model 관점에서는 보지 못한 data를 토대로 평가하기에 train data에 over-fitting을 감지가 가능해집니다.</p>\n<p>test set은 모델의 학습에 관여를 직/간접적으로 하지않고, 오로지 모델의 최종적인 성능 평가에만 사용함으로써 모델의 객관적인 성능 평가에 사용되어 집니다.</p>\n<p><img src=\"https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKw0t%2FbtqAuxpiz3f%2Fgm0Z861d816oV6vdMN2QZk%2Fimg.png\" alt=\"표1\"><br>\n표 1. Traning, validation, test dataset들의 용도. <a href=\"https://untitledtblog.tistory.com/158\" target=\"_blank\">출처</a></p>\n<p>텀프로젝트3의 data.json의 train set으로부터 validation set을 나누는 코드는 아래와 같습니다.</p>\n<pre><code>import json\n\n# 데이터 로드\nwith open('/content/data.json') as json_file:\n    data = json.load(json_file)\n\n## dataset split\n\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\n\ntrain = data['train']\n\ndataset = {}\nfor key in train[0].keys():\n    dataset[key] = np.concatenate([np.array([o[key]]) for o in train], axis=0)\n\nprint(f'dataset - points shape : {dataset[\"points\"].shape}, label shape {dataset[\"label\"].shape}')\n\nX_train, X_test, y_train, y_test = train_test_split(dataset['points'], \n                                                    dataset['label'].astype(np.int8), \n                                                    test_size=0.2, \n                                                    shuffle=True, \n                                                    random_state=1004)\n\nimport matplotlib.pyplot as plt\n\nhist, bins = np.histogram(y_test, bins=np.arange(11))\n# print(hist)\nplt.hist(y_test, bins)\n</code></pre>",
  "messages": [
    {
      "id": 1095887,
      "postDate": "2020-11-30T03:19:54.867Z",
      "content": "<p>해당 discussion은 텀프토젝트 진행에 필수 요소가 아닌 부수적인 부분입니다.</p>\n<hr>\n<p><img src=\"https://t1.daumcdn.net/cfile/tistory/9951E5445AAE1BE025\" alt=\"dataset\"><br>\n그림 1. dataset split</p>\n<p>Machine learning에서는 모델이 한 데이터에 epoch이 커지면서 over-fitting이 되는 것을 방지하기위해 dataset을 위의 그림과 같이 학습을 위한 train set, 학습이 끝난 모델을 검증하기 위한 validation set, 최종적으로 모델의 성능을 평가하기 위한 test set으로 나누어 사용합니다.</p>\n<p><img src=\"https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePPfN%2FbtqAviZBxQ1%2FU90kaNfkp0TUnEWcUDkyE1%2Fimg.png\" alt=\"과적합,과소적합 예시 사진\"><br>\n그림 2. 학습의 진행과 decision boundary의 형태 변화. 각 점은 training dataset에 포함된 data를 의미하며, 점의 색은 class를 의미함. <a href=\"https://untitledtblog.tistory.com/158\" target=\"_blank\">출처</a></p>\n<p>대부분 (train:validation):test = (6:2):2인 비율로 많이 나누어 사용되며, 예측해야할 타켓 정보를 가진 train set으로부터 분리하여 사용합니다.</p>\n<p>validation set과 test set 둘 다, 학습에 직접적으로 사용되지는 않지만, 모델을 검증하는 용도로 하는 것이라는 공통점이 존재합니다. 그럼 이 둘의 차이는 무엇일까요? over-fitting 방지를 위해 학습에 간접적으로 관여를 하는 부분에 차이가 존재합니다.  <br>\n validation set은 train set을 통한 학습이 종료된 후(한 epoch 종료 후), 모델로부터 validation set(model 관점에서는 unseen data)에 대한 평가를 진행합니다. 이로부터 얻은 평가는 학습에 진행 및 종료에 영향을 줄 수 있으며, 가장 좋은 성능을 가진 모델을 판단하는 척도에 사용되어 학습 중 간접적인 영향을 줍니다. model 관점에서는 보지 못한 data를 토대로 평가하기에 train data에 over-fitting을 감지가 가능해집니다.</p>\n<p>test set은 모델의 학습에 관여를 직/간접적으로 하지않고, 오로지 모델의 최종적인 성능 평가에만 사용함으로써 모델의 객관적인 성능 평가에 사용되어 집니다.</p>\n<p><img src=\"https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKw0t%2FbtqAuxpiz3f%2Fgm0Z861d816oV6vdMN2QZk%2Fimg.png\" alt=\"표1\"><br>\n표 1. Traning, validation, test dataset들의 용도. <a href=\"https://untitledtblog.tistory.com/158\" target=\"_blank\">출처</a></p>\n<p>텀프로젝트3의 data.json의 train set으로부터 validation set을 나누는 코드는 아래와 같습니다.</p>\n<pre><code>import json\n\n# 데이터 로드\nwith open('/content/data.json') as json_file:\n    data = json.load(json_file)\n\n## dataset split\n\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\n\ntrain = data['train']\n\ndataset = {}\nfor key in train[0].keys():\n    dataset[key] = np.concatenate([np.array([o[key]]) for o in train], axis=0)\n\nprint(f'dataset - points shape : {dataset[\"points\"].shape}, label shape {dataset[\"label\"].shape}')\n\nX_train, X_test, y_train, y_test = train_test_split(dataset['points'], \n                                                    dataset['label'].astype(np.int8), \n                                                    test_size=0.2, \n                                                    shuffle=True, \n                                                    random_state=1004)\n\nimport matplotlib.pyplot as plt\n\nhist, bins = np.histogram(y_test, bins=np.arange(11))\n# print(hist)\nplt.hist(y_test, bins)\n</code></pre>",
      "rawMarkdown": "해당 discussion은 텀프토젝트 진행에 필수 요소가 아닌 부수적인 부분입니다.\n_____________________________\n![dataset](https://t1.daumcdn.net/cfile/tistory/9951E5445AAE1BE025)\n그림 1. dataset split\n\nMachine learning에서는 모델이 한 데이터에 epoch이 커지면서 over-fitting이 되는 것을 방지하기위해 dataset을 위의 그림과 같이 학습을 위한 train set, 학습이 끝난 모델을 검증하기 위한 validation set, 최종적으로 모델의 성능을 평가하기 위한 test set으로 나누어 사용합니다.\n\n![과적합,과소적합 예시 사진](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePPfN%2FbtqAviZBxQ1%2FU90kaNfkp0TUnEWcUDkyE1%2Fimg.png)\n그림 2. 학습의 진행과 decision boundary의 형태 변화. 각 점은 training dataset에 포함된 data를 의미하며, 점의 색은 class를 의미함. [출처](https://untitledtblog.tistory.com/158)\n\n대부분 (train:validation):test = (6:2):2인 비율로 많이 나누어 사용되며, 예측해야할 타켓 정보를 가진 train set으로부터 분리하여 사용합니다.\n \n validation set과 test set 둘 다, 학습에 직접적으로 사용되지는 않지만, 모델을 검증하는 용도로 하는 것이라는 공통점이 존재합니다. 그럼 이 둘의 차이는 무엇일까요? over-fitting 방지를 위해 학습에 간접적으로 관여를 하는 부분에 차이가 존재합니다.  \n validation set은 train set을 통한 학습이 종료된 후(한 epoch 종료 후), 모델로부터 validation set(model 관점에서는 unseen data)에 대한 평가를 진행합니다. 이로부터 얻은 평가는 학습에 진행 및 종료에 영향을 줄 수 있으며, 가장 좋은 성능을 가진 모델을 판단하는 척도에 사용되어 학습 중 간접적인 영향을 줍니다. model 관점에서는 보지 못한 data를 토대로 평가하기에 train data에 over-fitting을 감지가 가능해집니다.\n\ntest set은 모델의 학습에 관여를 직/간접적으로 하지않고, 오로지 모델의 최종적인 성능 평가에만 사용함으로써 모델의 객관적인 성능 평가에 사용되어 집니다.\n\n![표1](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKw0t%2FbtqAuxpiz3f%2Fgm0Z861d816oV6vdMN2QZk%2Fimg.png)\n표 1. Traning, validation, test dataset들의 용도. [출처](https://untitledtblog.tistory.com/158)\n\n텀프로젝트3의 data.json의 train set으로부터 validation set을 나누는 코드는 아래와 같습니다.\n\n```python\nimport json\n\n# 데이터 로드\nwith open('/content/data.json') as json_file:\n    data = json.load(json_file)\n\n## dataset split\n\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\n\ntrain = data['train']\n\ndataset = {}\nfor key in train[0].keys():\n    dataset[key] = np.concatenate([np.array([o[key]]) for o in train], axis=0)\n\nprint(f'dataset - points shape : {dataset[\"points\"].shape}, label shape {dataset[\"label\"].shape}')\n\nX_train, X_test, y_train, y_test = train_test_split(dataset['points'], \n                                                    dataset['label'].astype(np.int8), \n                                                    test_size=0.2, \n                                                    shuffle=True, \n                                                    random_state=1004)\n\nimport matplotlib.pyplot as plt\n\nhist, bins = np.histogram(y_test, bins=np.arange(11))\n# print(hist)\nplt.hist(y_test, bins)\n```"
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "1095887": "해당 discussion은 텀프토젝트 진행에 필수 요소가 아닌 부수적인 부분입니다.\n_____________________________\n![dataset](https://t1.daumcdn.net/cfile/tistory/9951E5445AAE1BE025)\n그림 1. dataset split\n\nMachine learning에서는 모델이 한 데이터에 epoch이 커지면서 over-fitting이 되는 것을 방지하기위해 dataset을 위의 그림과 같이 학습을 위한 train set, 학습이 끝난 모델을 검증하기 위한 validation set, 최종적으로 모델의 성능을 평가하기 위한 test set으로 나누어 사용합니다.\n\n![과적합,과소적합 예시 사진](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePPfN%2FbtqAviZBxQ1%2FU90kaNfkp0TUnEWcUDkyE1%2Fimg.png)\n그림 2. 학습의 진행과 decision boundary의 형태 변화. 각 점은 training dataset에 포함된 data를 의미하며, 점의 색은 class를 의미함. [출처](https://untitledtblog.tistory.com/158)\n\n대부분 (train:validation):test = (6:2):2인 비율로 많이 나누어 사용되며, 예측해야할 타켓 정보를 가진 train set으로부터 분리하여 사용합니다.\n \n validation set과 test set 둘 다, 학습에 직접적으로 사용되지는 않지만, 모델을 검증하는 용도로 하는 것이라는 공통점이 존재합니다. 그럼 이 둘의 차이는 무엇일까요? over-fitting 방지를 위해 학습에 간접적으로 관여를 하는 부분에 차이가 존재합니다.  \n validation set은 train set을 통한 학습이 종료된 후(한 epoch 종료 후), 모델로부터 validation set(model 관점에서는 unseen data)에 대한 평가를 진행합니다. 이로부터 얻은 평가는 학습에 진행 및 종료에 영향을 줄 수 있으며, 가장 좋은 성능을 가진 모델을 판단하는 척도에 사용되어 학습 중 간접적인 영향을 줍니다. model 관점에서는 보지 못한 data를 토대로 평가하기에 train data에 over-fitting을 감지가 가능해집니다.\n\ntest set은 모델의 학습에 관여를 직/간접적으로 하지않고, 오로지 모델의 최종적인 성능 평가에만 사용함으로써 모델의 객관적인 성능 평가에 사용되어 집니다.\n\n![표1](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKw0t%2FbtqAuxpiz3f%2Fgm0Z861d816oV6vdMN2QZk%2Fimg.png)\n표 1. Traning, validation, test dataset들의 용도. [출처](https://untitledtblog.tistory.com/158)\n\n텀프로젝트3의 data.json의 train set으로부터 validation set을 나누는 코드는 아래와 같습니다.\n\n```python\nimport json\n\n# 데이터 로드\nwith open('/content/data.json') as json_file:\n    data = json.load(json_file)\n\n## dataset split\n\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\n\ntrain = data['train']\n\ndataset = {}\nfor key in train[0].keys():\n    dataset[key] = np.concatenate([np.array([o[key]]) for o in train], axis=0)\n\nprint(f'dataset - points shape : {dataset[\"points\"].shape}, label shape {dataset[\"label\"].shape}')\n\nX_train, X_test, y_train, y_test = train_test_split(dataset['points'], \n                                                    dataset['label'].astype(np.int8), \n                                                    test_size=0.2, \n                                                    shuffle=True, \n                                                    random_state=1004)\n\nimport matplotlib.pyplot as plt\n\nhist, bins = np.histogram(y_test, bins=np.arange(11))\n# print(hist)\nplt.hist(y_test, bins)\n```"
  }
}