{
  "id": 96522,
  "title": "class 별 Train / Validation set 분리",
  "url": "/competitions/2019-3rd-ml-month-with-kakr/discussion/96522",
  "author_name": "",
  "post_date": "2019-06-21T01:44:15.839880300Z",
  "votes": 8,
  "comment_count": 6,
  "views": 0,
  "content": "<p>주어진 학습 데이터를 train set 과 validaiton set으로 나눌 때, 클래스 별로 비율을 맞춰서 나눠보았습니다.\n(해당 클래스의 이미지 개수의 80%를 Train으로, 20%를 Validaion으로)\n<br></p>\n\n<pre><code>1. 데이터셋의 클래스 별 이미지의 개수가 나름 고루 분포되어 있다고 판단\n\n2. (micro) F1 score의 경우 결국 전체 데이터에서 얼마나 많이 맞추느냐보다도 모든 클래스에 대해 고루 잘 맞춰야 한다고 판단\n</code></pre>\n\n<p><br></p>\n\n<p>위의 두가지 이유로 클래스 별 비율을 맞춰 데이터를 나눠보았는데, 혹시 제가 놓치고 있는 부분이나 다른 의견을 가지고 계신 분 있으시면 공유해주시면 감사하겠습니다 ^_____^ <br>\n(테스트 데이터의 클래스 별 분포가 고루지 않더라도 학습 데이터의 분포가 고루다면, (고루지 않더라도 F1 score을 높이기 위해서라면) 이처럼 train과 validation을 가져가는 게 좋을까요?)  </p>\n\n<p><br></p>\n\n<p>아래는 일단 제가 작성해본 코드인데, 더 간결하게 수행할 수 있는 걸로 알고 있습니다! 혹시 더 간결하고 예쁜 코드 있으신 분 공유해주시면 역시 너무 감사할 것  같아요 *_____*</p>\n\n<p><br></p>\n\n<p>다들 끝까지 화이팅입니다!!</p>\n\n<p><br></p>\n\n<p>```python</p>\n\n<h1>Class 별로 8:2 로 train, validation 분리</h1>\n\n<p>train_original = train_df.copy()\ntrain_sorted = train_original.sort_values(by='class')\nclass_nums = train_sorted.groupby('class').count()</p>\n\n<p>start = 0\ntrain_frames = []\nvalid_frames = []\nfor i in range(196): # class 196을 0으로 바꿔놓은 상태\n    class_num = class_nums.loc[i, 'img_file']\n    temp_train = train_sorted[start: start + int(class_num * 0.8)]\n    temp_valid = train_sorted[start + int(class_num * 0.8): start + class_num]</p>\n\n<pre><code>train_frames.append(temp_train)\nvalid_frames.append(temp_valid)\nstart += class_num\n</code></pre>\n\n<p>x_train = pd.concat(train_frames).reset_index(drop=True)\nx_valid = pd.concat(valid_frames).reset_index(drop=True)\n```</p>",
  "messages": [
    {
      "id": "557183",
      "postDate": "06/21/2019 01:44:15",
      "content": "<p>주어진 학습 데이터를 train set 과 validaiton set으로 나눌 때, 클래스 별로 비율을 맞춰서 나눠보았습니다.\n(해당 클래스의 이미지 개수의 80%를 Train으로, 20%를 Validaion으로)\n<br></p>\n\n<pre><code>1. 데이터셋의 클래스 별 이미지의 개수가 나름 고루 분포되어 있다고 판단\n\n2. (micro) F1 score의 경우 결국 전체 데이터에서 얼마나 많이 맞추느냐보다도 모든 클래스에 대해 고루 잘 맞춰야 한다고 판단\n</code></pre>\n\n<p><br></p>\n\n<p>위의 두가지 이유로 클래스 별 비율을 맞춰 데이터를 나눠보았는데, 혹시 제가 놓치고 있는 부분이나 다른 의견을 가지고 계신 분 있으시면 공유해주시면 감사하겠습니다 ^_____^ <br>\n(테스트 데이터의 클래스 별 분포가 고루지 않더라도 학습 데이터의 분포가 고루다면, (고루지 않더라도 F1 score을 높이기 위해서라면) 이처럼 train과 validation을 가져가는 게 좋을까요?)  </p>\n\n<p><br></p>\n\n<p>아래는 일단 제가 작성해본 코드인데, 더 간결하게 수행할 수 있는 걸로 알고 있습니다! 혹시 더 간결하고 예쁜 코드 있으신 분 공유해주시면 역시 너무 감사할 것  같아요 *_____*</p>\n\n<p><br></p>\n\n<p>다들 끝까지 화이팅입니다!!</p>\n\n<p><br></p>\n\n<p>```python</p>\n\n<h1>Class 별로 8:2 로 train, validation 분리</h1>\n\n<p>train_original = train_df.copy()\ntrain_sorted = train_original.sort_values(by='class')\nclass_nums = train_sorted.groupby('class').count()</p>\n\n<p>start = 0\ntrain_frames = []\nvalid_frames = []\nfor i in range(196): # class 196을 0으로 바꿔놓은 상태\n    class_num = class_nums.loc[i, 'img_file']\n    temp_train = train_sorted[start: start + int(class_num * 0.8)]\n    temp_valid = train_sorted[start + int(class_num * 0.8): start + class_num]</p>\n\n<pre><code>train_frames.append(temp_train)\nvalid_frames.append(temp_valid)\nstart += class_num\n</code></pre>\n\n<p>x_train = pd.concat(train_frames).reset_index(drop=True)\nx_valid = pd.concat(valid_frames).reset_index(drop=True)\n```</p>",
      "rawMarkdown": "주어진 학습 데이터를 train set 과 validaiton set으로 나눌 때, 클래스 별로 비율을 맞춰서 나눠보았습니다.\n(해당 클래스의 이미지 개수의 80%를 Train으로, 20%를 Validaion으로)\n<br>\n\n    1. 데이터셋의 클래스 별 이미지의 개수가 나름 고루 분포되어 있다고 판단\n\n    2. (micro) F1 score의 경우 결국 전체 데이터에서 얼마나 많이 맞추느냐보다도 모든 클래스에 대해 고루 잘 맞춰야 한다고 판단\n\n<br>\n\n위의 두가지 이유로 클래스 별 비율을 맞춰 데이터를 나눠보았는데, 혹시 제가 놓치고 있는 부분이나 다른 의견을 가지고 계신 분 있으시면 공유해주시면 감사하겠습니다 ^\\_\\_\\_\\_\\_^  \n\\(테스트 데이터의 클래스 별 분포가 고루지 않더라도 학습 데이터의 분포가 고루다면, \\(고루지 않더라도 F1 score을 높이기 위해서라면\\) 이처럼 train과 validation을 가져가는 게 좋을까요?\\)  \n\n<br>\n\n아래는 일단 제가 작성해본 코드인데, 더 간결하게 수행할 수 있는 걸로 알고 있습니다! 혹시 더 간결하고 예쁜 코드 있으신 분 공유해주시면 역시 너무 감사할 것  같아요 \\*\\_\\_\\_\\_\\_\\*\n\n<br>\n\n다들 끝까지 화이팅입니다!!\n\n<br>\n\n```python\n# Class 별로 8:2 로 train, validation 분리\ntrain_original = train_df.copy()\ntrain_sorted = train_original.sort_values(by='class')\nclass_nums = train_sorted.groupby('class').count()\n\nstart = 0\ntrain_frames = []\nvalid_frames = []\nfor i in range(196): # class 196을 0으로 바꿔놓은 상태\n    class_num = class_nums.loc[i, 'img_file']\n    temp_train = train_sorted[start: start + int(class_num * 0.8)]\n    temp_valid = train_sorted[start + int(class_num * 0.8): start + class_num]\n    \n    train_frames.append(temp_train)\n    valid_frames.append(temp_valid)\n    start += class_num\n\nx_train = pd.concat(train_frames).reset_index(drop=True)\nx_valid = pd.concat(valid_frames).reset_index(drop=True)\n```",
      "votes": null
    },
    {
      "id": "557251",
      "postDate": "06/21/2019 03:05:04",
      "content": "<p>말씀하신 내용 stratification입니다! 직접 생각해서 구현하신 것 멋지네요ㅎㅎ <a href=\"https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html\">sklearn.model_selection.StratifiedKFold</a> 여기 들어가 보시면 설명(\"The folds are made by preserving the percentage of samples for each class.\")과 구현이 잘 되어 있어 편하게 쓰실 수 있습니다.</p>",
      "rawMarkdown": "말씀하신 내용 stratification입니다! 직접 생각해서 구현하신 것 멋지네요ㅎㅎ [sklearn.model_selection.StratifiedKFold](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html) 여기 들어가 보시면 설명(\"The folds are made by preserving the percentage of samples for each class.\")과 구현이 잘 되어 있어 편하게 쓰실 수 있습니다.",
      "votes": null
    },
    {
      "id": "557362",
      "postDate": "06/21/2019 05:04:08",
      "content": "<p><a href=\"https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html\">https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html</a></p>\n\n<p>train_test_split에도 stratify 인자에 label 주시면 됩니다!</p>",
      "rawMarkdown": "https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html\n\ntrain\\_test\\_split에도 stratify 인자에 label 주시면 됩니다!",
      "votes": null
    },
    {
      "id": "558409",
      "postDate": "06/22/2019 09:14:57",
      "content": "<p>제가 데이터를 만들때 되도록 클래스별로 고르게 분포할 수 있도록 하였습니다! ^^</p>",
      "rawMarkdown": "제가 데이터를 만들때 되도록 클래스별로 고르게 분포할 수 있도록 하였습니다! ^^",
      "votes": null
    },
    {
      "id": "558468",
      "postDate": "06/22/2019 11:00:36",
      "content": "<p>오.....! 그런 게 있었군요. 감사합니다 ㅎㅎ</p>",
      "rawMarkdown": "오.....! 그런 게 있었군요. 감사합니다 ㅎㅎ",
      "votes": null
    },
    {
      "id": "558469",
      "postDate": "06/22/2019 11:00:57",
      "content": "<p>그렇군요! 참고하겠습니다.. 감사해요~!</p>",
      "rawMarkdown": "그렇군요! 참고하겠습니다.. 감사해요~!",
      "votes": null
    },
    {
      "id": "558470",
      "postDate": "06/22/2019 11:01:27",
      "content": "<p>아 그런 기능도 있군요!!!! 공유 감사합니다~ ㅎㅁㅎ</p>",
      "rawMarkdown": "아 그런 기능도 있군요!!!! 공유 감사합니다~ ㅎㅁㅎ",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 557251,
      "author_name": "soongja",
      "author_url": "",
      "post_date": "06/21/2019 03:05:04",
      "content": "<p>말씀하신 내용 stratification입니다! 직접 생각해서 구현하신 것 멋지네요ㅎㅎ <a href=\"https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html\">sklearn.model_selection.StratifiedKFold</a> 여기 들어가 보시면 설명(\"The folds are made by preserving the percentage of samples for each class.\")과 구현이 잘 되어 있어 편하게 쓰실 수 있습니다.</p>",
      "votes": null,
      "replies": [
        {
          "id": 558468,
          "author_name": "jinw96",
          "author_url": "",
          "post_date": "06/22/2019 11:00:36",
          "content": "<p>오.....! 그런 게 있었군요. 감사합니다 ㅎㅎ</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 557362,
      "author_name": "tmheo74",
      "author_url": "",
      "post_date": "06/21/2019 05:04:08",
      "content": "<p><a href=\"https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html\">https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html</a></p>\n\n<p>train_test_split에도 stratify 인자에 label 주시면 됩니다!</p>",
      "votes": null,
      "replies": [
        {
          "id": 558470,
          "author_name": "jinw96",
          "author_url": "",
          "post_date": "06/22/2019 11:01:27",
          "content": "<p>아 그런 기능도 있군요!!!! 공유 감사합니다~ ㅎㅁㅎ</p>",
          "votes": null,
          "replies": []
        }
      ]
    },
    {
      "id": 558409,
      "author_name": "fulrose",
      "author_url": "",
      "post_date": "06/22/2019 09:14:57",
      "content": "<p>제가 데이터를 만들때 되도록 클래스별로 고르게 분포할 수 있도록 하였습니다! ^^</p>",
      "votes": null,
      "replies": [
        {
          "id": 558469,
          "author_name": "jinw96",
          "author_url": "",
          "post_date": "06/22/2019 11:00:57",
          "content": "<p>그렇군요! 참고하겠습니다.. 감사해요~!</p>",
          "votes": null,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "557183": "주어진 학습 데이터를 train set 과 validaiton set으로 나눌 때, 클래스 별로 비율을 맞춰서 나눠보았습니다.\n(해당 클래스의 이미지 개수의 80%를 Train으로, 20%를 Validaion으로)\n<br>\n\n    1. 데이터셋의 클래스 별 이미지의 개수가 나름 고루 분포되어 있다고 판단\n\n    2. (micro) F1 score의 경우 결국 전체 데이터에서 얼마나 많이 맞추느냐보다도 모든 클래스에 대해 고루 잘 맞춰야 한다고 판단\n\n<br>\n\n위의 두가지 이유로 클래스 별 비율을 맞춰 데이터를 나눠보았는데, 혹시 제가 놓치고 있는 부분이나 다른 의견을 가지고 계신 분 있으시면 공유해주시면 감사하겠습니다 ^\\_\\_\\_\\_\\_^  \n\\(테스트 데이터의 클래스 별 분포가 고루지 않더라도 학습 데이터의 분포가 고루다면, \\(고루지 않더라도 F1 score을 높이기 위해서라면\\) 이처럼 train과 validation을 가져가는 게 좋을까요?\\)  \n\n<br>\n\n아래는 일단 제가 작성해본 코드인데, 더 간결하게 수행할 수 있는 걸로 알고 있습니다! 혹시 더 간결하고 예쁜 코드 있으신 분 공유해주시면 역시 너무 감사할 것  같아요 \\*\\_\\_\\_\\_\\_\\*\n\n<br>\n\n다들 끝까지 화이팅입니다!!\n\n<br>\n\n```python\n# Class 별로 8:2 로 train, validation 분리\ntrain_original = train_df.copy()\ntrain_sorted = train_original.sort_values(by='class')\nclass_nums = train_sorted.groupby('class').count()\n\nstart = 0\ntrain_frames = []\nvalid_frames = []\nfor i in range(196): # class 196을 0으로 바꿔놓은 상태\n    class_num = class_nums.loc[i, 'img_file']\n    temp_train = train_sorted[start: start + int(class_num * 0.8)]\n    temp_valid = train_sorted[start + int(class_num * 0.8): start + class_num]\n    \n    train_frames.append(temp_train)\n    valid_frames.append(temp_valid)\n    start += class_num\n\nx_train = pd.concat(train_frames).reset_index(drop=True)\nx_valid = pd.concat(valid_frames).reset_index(drop=True)\n```",
    "557251": "말씀하신 내용 stratification입니다! 직접 생각해서 구현하신 것 멋지네요ㅎㅎ [sklearn.model_selection.StratifiedKFold](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html) 여기 들어가 보시면 설명(\"The folds are made by preserving the percentage of samples for each class.\")과 구현이 잘 되어 있어 편하게 쓰실 수 있습니다.",
    "557362": "https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html\n\ntrain\\_test\\_split에도 stratify 인자에 label 주시면 됩니다!",
    "558409": "제가 데이터를 만들때 되도록 클래스별로 고르게 분포할 수 있도록 하였습니다! ^^",
    "558468": "오.....! 그런 게 있었군요. 감사합니다 ㅎㅎ",
    "558469": "그렇군요! 참고하겠습니다.. 감사해요~!",
    "558470": "아 그런 기능도 있군요!!!! 공유 감사합니다~ ㅎㅁㅎ"
  },
  "source": "meta"
}