점차 기계 학습~scikit-learn 교차 검증에 대한 데이터 분할 방법~

저번까지.


마지막 게시물cross_val_score 중 교차 검증 결과가 각각 큰 폭으로 다른 원인
데이터 집합의 배열 편차나 교차 검증을 가정할 때 데이터 추출 방법의 편차.
이번에는 주요 3가지 데이터 분할 방법에 대해 자신의 총결을 진행한다.

분할 방법


주요한 방법은 다음과 같은 세 가지가 있다
  • Kfold
  • Stratified Kfold
  • Group Kfold
  • 그럼 각자 특징을 적어봅시다

    Kfold


    그것은 간단한 분할 방법이지, 특히 데이터 내용은 아니다

    설치 방법은 다음과 같습니다.
    또한 env_data에 506건의 데이터가 있다고 생각하십시오.
    foldMethod.py
    from sklearn.model_selection import KFold
    
    kf = KFold(n_splits = 5)
    splitter = kf.split(env_data)#env_data分割用ジェネレータ
    for train,test in splitter:
        print(test)
    """
    [  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17
      18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35
      36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53
      54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71
      72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89
      90  91  92  93  94  95  96  97  98  99 100 101]...
    """
    
    데이터 자체가 아니라 추출할 수 있는 인덱스입니다.
    약간 탈선했지만 자신이python에 익숙하지 않아서 좀 곤혹스러웠어요.
    이것splitter이 색인을 직접 포함하는 데이터가 아닌 이유
    이것은 생성기라는 함수로, 테스트와 학습에 사용되는 색인을 되돌려줄 수 있다
    이것은 데이터가 아니기 때문에 print(splitter[0]) 해도 잘 할 수 없다.난 또 테킬라 배열인 줄 알았어.
    참고로 KFold(n_splits = 5,shuffle = True) 로 지정하면
    순서대로 하는 것이 아니라 무작위로 색인을 뽑는다
    foldMethod.py
    kf = KFold(n_splits = 5,shuffle = True)
    splitter = kf.split(env_data)
    
    for train,test in splitter:
        print(test)
    """
    [  0   6  38  48  53  57  63  65  66  69  70  76  83  84  94  98 104 108
     114 116 118 127 136 140 143 146 151 157 159 161 163 173 177 191 201 207
     210 215 218 224 228 231 234 246 250 251 252 254 255 257 258 259 261 267
     268 271 273 276 279 286 288 301 309 320 321 324 329 333 338 354 359 361
     367 369 371 372 374 376 378 386 391 392 396 414 419 420 421 427 433 435
     444 445 461 470 479 480 481 482 484 496 499 500]...
    """
    
    색인을 무작위로 추출하다.
    앞에서 말한 바와 같이, 무작위든 순서든 데이터 내용에 따라 규칙적으로 분할하는 것은 Kfold이다

    Stratified Kfold


    이것은 목표 변수의 편차를 피하기 위해 데이터를 분할하는 것이다
    구체적으로 말하면 키와 몸무게라는 설명 변수에서 남성인지 여성인지 예측하는 목적의 변수를 만드는 모델을 만든다.
    100건의 데이터 중 1~50건은 남성의 데이터, 51~100건은 여성의 데이터다.
    만약 네가 Kfold로 그것을 간단하게 다섯 개로 나누면
    데이터
    색인
    남녀 비율
    테스트 데이터
    1~20
    (남성 20: 여성 0)
    학습 데이터
    21~100
    남성 30: 여성 50)
    이런 편파적인 구분 방법.
    Stratified Kfold를 사용하는 경우 섹션 5를 분할할 때
    데이터
    색인
    남녀 비율
    테스트 데이터
    1~10 & 51~60
    (남성 10: 여성 10)
    학습 데이터
    11~50 & 61~100
    남성 40: 여성 40)
    이런 느낌은 목적 변수의 편차 없이 데이터를 분할할 수 있다
    그렇다면 실제 실시를 살펴보자
    foldMethod.py
    from sklearn.model_selection import StratifiedKFold
    
    skf = StratifiedKFold(n_splits = 5)
    splitter = skf.split(x,y)
    for train,test in splitter:
        print(test)
    #[ 0  1  2  3  4  5  6  7  8  9 50 51 52 53 54 55 56 57 58 59]...
    
    여기x는 설명 변수이고, y는 남녀의 1 또는 0을 나타낸다.
    또한 KFold 과 동일하게 지정된 경우 skf = StratifiedKFold(n_splits = 5,shuffle = True)색인은 무작위로 추출되며 목표 변수의 백분율을 유지합니다.
    하지만 이 Stratified Kfold는 문제를 분류하는 데만 사용됩니다.
    따라서 입력한 목적 변수는 [0or1] 또는 [0or1or2] 같은 분류화된 데이터여야 한다.
    [21.4, 48.1, 29.5,,]와 같은 데이터를 입력하면 다음과 같은 오류가 발생합니다.Supported target types are: ('binary', 'multiclass'). Got 'continuous' instead.

    Group Kfold


    이것은 샘플 데이터에 대해 임의로 그룹을 나누어 데이터를 분할하는 방법이다.
    예를 들어 변수가 얼굴 사진이고 목적 변수가 남성인지 여성인지 분류하는 문제가 있다고 가정한다.
    또 같은 사람의 사진이 표정이 다르기 때문에 여러 장의 샘플 데이터에 존재한다고 가정한다.

    Kfold나 Stratified Kfold로 데이터를 분할하면
    학습 데이터
    테스트 데이터


    이처럼 같은 사람의 얼굴 사진 데이터는 학습용과 테스트용 데이터로 나뉜다.
    이때 이 모형은 완전히 미지의 인류 성별을 판별하기 위해 만들어진 것이라고 가정하면
    왜냐하면 학습에 사용된 데이터와 같은 인물의 데이터로 정밀도를 검증해야 하기 때문이다
    실제보다 더 좋은 결과가 있을 수 있다.
    따라서 샘플 데이터를 그룹화하여 목적 변수와 설명 변수 외에 그룹 데이터를 추가 표시한다
    그룹 Kfold라는 분할 방법은 같은 그룹의 데이터에 편차가 발생하는 것을 방지할 수 있다.KfoldStratified Kfold 중 변수와 목적 변수만 설명하면 됩니다.
    이번에는 데이터 종류를 표시하는 그룹 데이터가 추가로 필요합니다.


    foldMethod.py
    """
    これがグループを表すデータラベル
    Group = [0,0,0,0,・・・9,9,9,9] 0~9が10個ずつ連続で入っています
    """
    
    from sklearn.model_selection import GroupKFold
    
    gkf = GroupKFold(n_splits = 5)
    splitter = gkf.split(X,Y,group)
    
    for train,test in splitter:
        print(test)
    
    #抽出されたインデックス
    #[40 41 42 43 44 45 46 47 48 49 90 91 92 93 94 95 96 97 98 99]...
    
    40~49는 그룹 레이블 4 그룹입니다.
    90-99는 그룹 탭 9의 그룹입니다.
    태그 4와 9 그룹의 데이터는 모두 테스트 데이터입니다
    같은 그룹의 라벨 데이터는 학습 데이터와 테스트 데이터로 나뉘지 않는다는 것을 알 수 있다.

    총결산


    이상, 주류라고 불리는 데이터 분할 방법 3가지를 배웠다.
    교차 검증은 모델의 성능 검증으로 모델의 성능을 더욱 정확하게 평가하기 위해
    견본 데이터에 적합한 분할 방법을 채택해야 한다.
    scikit-learn은 여러 가지 데이터 분할 방법을 실현한 것 같다
    사이트 제목 참고하시고 마음에 드는 분은 참고하시기 바랍니다

    다음


    이번에는 교차 검증을 할 때의 데이터 분할 방법에만 초점을 맞췄다.
    다음은 보스턴의 주택 가격을 예측하기 위해 노력하고 있는 모델로 돌아가 제작된다.

    제발


    기계를 배우는 초보자는 배운 지식을 확인하고 잊어버리기 위해 투고한다.
    잘못된 점이나 뭔가 알아차리면 지적해 주세요.
    그리고 자학자이기 때문에 "나도 지금 공부하고 있어!"이런 사람이 댓글을 받을 수 있다면 나는 매우 기쁠 것이다.

    좋은 웹페이지 즐겨찾기