{
  "id": 101483,
  "title": "DataFrameIterator.class_indices 관련 질문입니다",
  "url": "/competitions/2019-3rd-ml-month-with-kakr/discussion/101483",
  "author_name": "",
  "post_date": "2019-07-26T07:55:12.915472500Z",
  "votes": 4,
  "comment_count": 2,
  "views": 0,
  "content": "<p>ImageDataGenerator.flow_from_dataframe()로 얻은 DataFrameIterator에서 class_indice로 predict한 값을 실제 값으로 변경하는데, 여러개의 ImageDataGenerator를 사용해도 class_indice 매핑 테이블은 동일한 값을 출력하는 것을 확인 하였습니다.\n여러개의 ImageDataGenerator를 사용해도 class_indice 테이블이 동일한 이유가 궁금합니다.\n(예상으로는 해싱으로 값을 만들면 동일 class 목록을 사용하면 동일한 매핑이 나올 것 같긴 합니다.)</p>",
  "messages": [
    {
      "id": "584596",
      "postDate": "07/26/2019 07:55:12",
      "content": "<p>ImageDataGenerator.flow_from_dataframe()로 얻은 DataFrameIterator에서 class_indice로 predict한 값을 실제 값으로 변경하는데, 여러개의 ImageDataGenerator를 사용해도 class_indice 매핑 테이블은 동일한 값을 출력하는 것을 확인 하였습니다.\n여러개의 ImageDataGenerator를 사용해도 class_indice 테이블이 동일한 이유가 궁금합니다.\n(예상으로는 해싱으로 값을 만들면 동일 class 목록을 사용하면 동일한 매핑이 나올 것 같긴 합니다.)</p>",
      "rawMarkdown": "ImageDataGenerator.flow_from_dataframe()로 얻은 DataFrameIterator에서 class_indice로 predict한 값을 실제 값으로 변경하는데, 여러개의 ImageDataGenerator를 사용해도 class_indice 매핑 테이블은 동일한 값을 출력하는 것을 확인 하였습니다.\n여러개의 ImageDataGenerator를 사용해도 class_indice 테이블이 동일한 이유가 궁금합니다.\n(예상으로는 해싱으로 값을 만들면 동일 class 목록을 사용하면 동일한 매핑이 나올 것 같긴 합니다.)",
      "votes": null
    },
    {
      "id": "584668",
      "postDate": "07/26/2019 09:31:50",
      "content": "<p>글을 올린 후에 소스코드를 확인하면 될 것 같아서 확인해 보니 flow_from_dataframe()에서 다음 내용을 확인 하였습니다.</p>\n\n<p>classes: optional list of classes\n                (e.g. <code>['dogs', 'cats']</code>). Default: None.\n                 If not provided, the list of classes will be automatically\n                 inferred from the y_col,\n                 which will map to the label indices, will be alphanumeric).\n                 The dictionary containing the mapping from class names to class\n                 indices can be obtained via the attribute <code>class_indices</code>.</p>\n\n<p>classes 가 제공되지 않으면 y_col 값들로부터 유추해서 자동으로 생성한다고 합니다.\n이후에 class_indices 값을 출력해보면 '1', '10', '101' .... 이런 식으로 정렬된 상태에서 0부터 값이 배정되어 있는데, y_col에서 값을 수집 후 정렬해서 값을 매기므로 dataframe에 누락된 class가 없다면 동일한 mapping이 생성될 것으로 판단됩니다.\n단, 그럴 일은 거의 없겠지만 하나의 dataframe을 kfold등으로 나누는 경우 혹시 누락이 되거나 하면 문제가 생길 것 같으므로 classes에 label 리스트를 넘기는 것이 더 안전한 방법일 것 같습니다.</p>",
      "rawMarkdown": "글을 올린 후에 소스코드를 확인하면 될 것 같아서 확인해 보니 flow_from_dataframe()에서 다음 내용을 확인 하였습니다.\n\nclasses: optional list of classes\n                (e.g. `['dogs', 'cats']`). Default: None.\n                 If not provided, the list of classes will be automatically\n                 inferred from the y_col,\n                 which will map to the label indices, will be alphanumeric).\n                 The dictionary containing the mapping from class names to class\n                 indices can be obtained via the attribute `class_indices`.\n\nclasses 가 제공되지 않으면 y_col 값들로부터 유추해서 자동으로 생성한다고 합니다.\n이후에 class_indices 값을 출력해보면 '1', '10', '101' .... 이런 식으로 정렬된 상태에서 0부터 값이 배정되어 있는데, y_col에서 값을 수집 후 정렬해서 값을 매기므로 dataframe에 누락된 class가 없다면 동일한 mapping이 생성될 것으로 판단됩니다.\n단, 그럴 일은 거의 없겠지만 하나의 dataframe을 kfold등으로 나누는 경우 혹시 누락이 되거나 하면 문제가 생길 것 같으므로 classes에 label 리스트를 넘기는 것이 더 안전한 방법일 것 같습니다.",
      "votes": null
    },
    {
      "id": "588863",
      "postDate": "07/31/2019 06:54:38",
      "content": "<p>안녕하세요. 답변이 늦어서 죄송합니다.\n말씀하신 대로 만약 데이터 제너레이터에 파라미터로 전달되는 데이터프레임 내부의 클래스 갯수에 데이터셋 별로 차이가 있다면\n예를 들면, 훈련셋은 196개 클래스를 가지고 있는데 검증셋은 (랜덤 추출 시) 일정 클래스가 없는 경우, 문제가 발생할 수 있을 것 같습니다. 케라스 데이터 제너레이터에서 이런 문제 까지 잡아주는지는 확인해보지 못했습니다만, 동일한 class indice가 만들어지는 이유는 아마도\n1. 트레이닝 셋의 클래스 값의 분포가 클래스를 유실시키지 않을 만큼 적절한 밸런스를 이루고 있어서\n2. 검증셋을 만들기 위해 split되는 셋의 크기가 트레이닝 셋이 가지는 클래스 분포를 유실시킬 만큼 작지 않아서\n라고 생각됩니다. \nkfold를 사용하는 경우에도 너무 큰 k 값을 쓰게 되는 경우라면 검증셋의 크기가 작아질 것이므로 항상 어떤 클래스가 유실되지 않는다고 말할 수는 없을 것입니다. 따라서 경우에 따라 적절히 배분할 수 있는 알고리즘을 생각해야 할 것 같습니다.</p>",
      "rawMarkdown": "안녕하세요. 답변이 늦어서 죄송합니다.\n말씀하신 대로 만약 데이터 제너레이터에 파라미터로 전달되는 데이터프레임 내부의 클래스 갯수에 데이터셋 별로 차이가 있다면\n예를 들면, 훈련셋은 196개 클래스를 가지고 있는데 검증셋은 (랜덤 추출 시) 일정 클래스가 없는 경우, 문제가 발생할 수 있을 것 같습니다. 케라스 데이터 제너레이터에서 이런 문제 까지 잡아주는지는 확인해보지 못했습니다만, 동일한 class indice가 만들어지는 이유는 아마도\n1. 트레이닝 셋의 클래스 값의 분포가 클래스를 유실시키지 않을 만큼 적절한 밸런스를 이루고 있어서\n2. 검증셋을 만들기 위해 split되는 셋의 크기가 트레이닝 셋이 가지는 클래스 분포를 유실시킬 만큼 작지 않아서\n라고 생각됩니다. \nkfold를 사용하는 경우에도 너무 큰 k 값을 쓰게 되는 경우라면 검증셋의 크기가 작아질 것이므로 항상 어떤 클래스가 유실되지 않는다고 말할 수는 없을 것입니다. 따라서 경우에 따라 적절히 배분할 수 있는 알고리즘을 생각해야 할 것 같습니다.",
      "votes": null
    }
  ],
  "comments": [
    {
      "id": 584668,
      "author_name": "vh1981",
      "author_url": "",
      "post_date": "07/26/2019 09:31:50",
      "content": "<p>글을 올린 후에 소스코드를 확인하면 될 것 같아서 확인해 보니 flow_from_dataframe()에서 다음 내용을 확인 하였습니다.</p>\n\n<p>classes: optional list of classes\n                (e.g. <code>['dogs', 'cats']</code>). Default: None.\n                 If not provided, the list of classes will be automatically\n                 inferred from the y_col,\n                 which will map to the label indices, will be alphanumeric).\n                 The dictionary containing the mapping from class names to class\n                 indices can be obtained via the attribute <code>class_indices</code>.</p>\n\n<p>classes 가 제공되지 않으면 y_col 값들로부터 유추해서 자동으로 생성한다고 합니다.\n이후에 class_indices 값을 출력해보면 '1', '10', '101' .... 이런 식으로 정렬된 상태에서 0부터 값이 배정되어 있는데, y_col에서 값을 수집 후 정렬해서 값을 매기므로 dataframe에 누락된 class가 없다면 동일한 mapping이 생성될 것으로 판단됩니다.\n단, 그럴 일은 거의 없겠지만 하나의 dataframe을 kfold등으로 나누는 경우 혹시 누락이 되거나 하면 문제가 생길 것 같으므로 classes에 label 리스트를 넘기는 것이 더 안전한 방법일 것 같습니다.</p>",
      "votes": null,
      "replies": []
    },
    {
      "id": 588863,
      "author_name": "fulrose",
      "author_url": "",
      "post_date": "07/31/2019 06:54:38",
      "content": "<p>안녕하세요. 답변이 늦어서 죄송합니다.\n말씀하신 대로 만약 데이터 제너레이터에 파라미터로 전달되는 데이터프레임 내부의 클래스 갯수에 데이터셋 별로 차이가 있다면\n예를 들면, 훈련셋은 196개 클래스를 가지고 있는데 검증셋은 (랜덤 추출 시) 일정 클래스가 없는 경우, 문제가 발생할 수 있을 것 같습니다. 케라스 데이터 제너레이터에서 이런 문제 까지 잡아주는지는 확인해보지 못했습니다만, 동일한 class indice가 만들어지는 이유는 아마도\n1. 트레이닝 셋의 클래스 값의 분포가 클래스를 유실시키지 않을 만큼 적절한 밸런스를 이루고 있어서\n2. 검증셋을 만들기 위해 split되는 셋의 크기가 트레이닝 셋이 가지는 클래스 분포를 유실시킬 만큼 작지 않아서\n라고 생각됩니다. \nkfold를 사용하는 경우에도 너무 큰 k 값을 쓰게 되는 경우라면 검증셋의 크기가 작아질 것이므로 항상 어떤 클래스가 유실되지 않는다고 말할 수는 없을 것입니다. 따라서 경우에 따라 적절히 배분할 수 있는 알고리즘을 생각해야 할 것 같습니다.</p>",
      "votes": null,
      "replies": []
    }
  ],
  "raw_markdown_by_id": {
    "584596": "ImageDataGenerator.flow_from_dataframe()로 얻은 DataFrameIterator에서 class_indice로 predict한 값을 실제 값으로 변경하는데, 여러개의 ImageDataGenerator를 사용해도 class_indice 매핑 테이블은 동일한 값을 출력하는 것을 확인 하였습니다.\n여러개의 ImageDataGenerator를 사용해도 class_indice 테이블이 동일한 이유가 궁금합니다.\n(예상으로는 해싱으로 값을 만들면 동일 class 목록을 사용하면 동일한 매핑이 나올 것 같긴 합니다.)",
    "584668": "글을 올린 후에 소스코드를 확인하면 될 것 같아서 확인해 보니 flow_from_dataframe()에서 다음 내용을 확인 하였습니다.\n\nclasses: optional list of classes\n                (e.g. `['dogs', 'cats']`). Default: None.\n                 If not provided, the list of classes will be automatically\n                 inferred from the y_col,\n                 which will map to the label indices, will be alphanumeric).\n                 The dictionary containing the mapping from class names to class\n                 indices can be obtained via the attribute `class_indices`.\n\nclasses 가 제공되지 않으면 y_col 값들로부터 유추해서 자동으로 생성한다고 합니다.\n이후에 class_indices 값을 출력해보면 '1', '10', '101' .... 이런 식으로 정렬된 상태에서 0부터 값이 배정되어 있는데, y_col에서 값을 수집 후 정렬해서 값을 매기므로 dataframe에 누락된 class가 없다면 동일한 mapping이 생성될 것으로 판단됩니다.\n단, 그럴 일은 거의 없겠지만 하나의 dataframe을 kfold등으로 나누는 경우 혹시 누락이 되거나 하면 문제가 생길 것 같으므로 classes에 label 리스트를 넘기는 것이 더 안전한 방법일 것 같습니다.",
    "588863": "안녕하세요. 답변이 늦어서 죄송합니다.\n말씀하신 대로 만약 데이터 제너레이터에 파라미터로 전달되는 데이터프레임 내부의 클래스 갯수에 데이터셋 별로 차이가 있다면\n예를 들면, 훈련셋은 196개 클래스를 가지고 있는데 검증셋은 (랜덤 추출 시) 일정 클래스가 없는 경우, 문제가 발생할 수 있을 것 같습니다. 케라스 데이터 제너레이터에서 이런 문제 까지 잡아주는지는 확인해보지 못했습니다만, 동일한 class indice가 만들어지는 이유는 아마도\n1. 트레이닝 셋의 클래스 값의 분포가 클래스를 유실시키지 않을 만큼 적절한 밸런스를 이루고 있어서\n2. 검증셋을 만들기 위해 split되는 셋의 크기가 트레이닝 셋이 가지는 클래스 분포를 유실시킬 만큼 작지 않아서\n라고 생각됩니다. \nkfold를 사용하는 경우에도 너무 큰 k 값을 쓰게 되는 경우라면 검증셋의 크기가 작아질 것이므로 항상 어떤 클래스가 유실되지 않는다고 말할 수는 없을 것입니다. 따라서 경우에 따라 적절히 배분할 수 있는 알고리즘을 생각해야 할 것 같습니다."
  },
  "source": "meta"
}