복붙노트

[PYTHON] 훈련 및 테스트 데이터에서 동일한 더미 변수 유지

PYTHON

훈련 및 테스트 데이터에서 동일한 더미 변수 유지

파이썬에서 두 개의 별도의 교육 및 테스트 세트를 사용하여 예측 모델을 구축하고 있습니다. 교육 데이터에는 우편 번호, [91521,23151,12355, ...]와 같은 숫자 유형의 범주 형 변수와 도시 [ 'Chicago', 'New York', 'Los Angeles', ...].

데이터를 학습하기 위해, 먼저 'pd.get_dummies'를 사용하여이 변수의 더미 변수를 얻은 다음 모델에 변형 된 학습 데이터를 맞 춥니 다.

테스트 데이터에서 동일한 변형을 수행하고 훈련 된 모델을 사용하여 결과를 예측합니다. 그러나 오류가 발생했습니다. 'ValueError : 모델의 기능 수가 입력과 일치해야합니다. 모델 n_features는 1487이고 입력 n_features는 1345 '입니다. 그 이유는 테스트 데이터에 '도시'와 '우편 번호'가 적기 때문에 더미 변수가 적기 때문입니다.

이 문제를 어떻게 해결할 수 있습니까? 예를 들어 'OneHotEncoder'는 모든 숫자 형식의 범주 형 변수 만 인코딩합니다. 'DictVectorizer ()'는 모든 문자열 유형의 범주 형 변수 만 인코딩합니다. 온라인에서 검색하고 몇 가지 유사한 질문을 볼 수 있지만 그 중 아무도 내 질문에 실제로 답하지 않습니다.

scikit-learn을 사용하여 범주 적 기능 처리

https://www.quora.com/If-the-training-dataset-has-more-variables-than-the-test-dataset-what-does-one-do

https://www.quora.com/What-is-the-best-way-to-do-a-binary-one-hot-one-of-K-coding-in-Python

해결법

  1. ==============================

    1.누락 된 열을 가져 와서 테스트 데이터 세트에 추가 할 수도 있습니다.

    누락 된 열을 가져 와서 테스트 데이터 세트에 추가 할 수도 있습니다.

    # Get missing columns in the training test
    missing_cols = set( train.columns ) - set( test.columns )
    # Add a missing column in test set with default value equal to 0
    for c in missing_cols:
        test[c] = 0
    # Ensure the order of column in the test set is in the same order than in train set
    test = test[train.columns]
    

    또한이 코드는 테스트 데이터 집합의 범주에서 생성되었지만 학습 데이터 집합에없는 열이 제거되도록합니다.

  2. ==============================

    2.기차 및 테스트 데이터 세트에서 동일한 지형지 ​​물의 이름을 가지고 있다고 가정합니다. 기차와 테스트에서 연결된 데이터 세트를 생성하고 연결된 데이터 세트에서 인형을 얻은 다음이를 분리하여 테스트하고 다시 테스트 할 수 있습니다.

    기차 및 테스트 데이터 세트에서 동일한 지형지 ​​물의 이름을 가지고 있다고 가정합니다. 기차와 테스트에서 연결된 데이터 세트를 생성하고 연결된 데이터 세트에서 인형을 얻은 다음이를 분리하여 테스트하고 다시 테스트 할 수 있습니다.

    다음과 같이 할 수 있습니다.

    import pandas as pd
    train = pd.DataFrame(data = [['a', 123, 'ab'], ['b', 234, 'bc']],
                         columns=['col1', 'col2', 'col3'])
    test = pd.DataFrame(data = [['c', 345, 'ab'], ['b', 456, 'ab']],
                         columns=['col1', 'col2', 'col3'])
    train_objs_num = len(train)
    dataset = pd.concat(objs=[train, test], axis=0)
    dataset_preprocessed = pd.get_dummies(dataset)
    train_preprocessed = dataset_preprocessed[:train_objs_num]
    test_preprocessed = dataset_preprocessed[train_objs_num:]
    

    결과적으로 열차 및 테스트 데이터 세트의 기능 수가 동일 해집니다.

  3. ==============================

    3.

    train2,test2 = train.align(test, join='outer', axis=1, fill_value=0)
    

    train2와 test2는 같은 열을 가지고 있습니다. Fill_value는 누락 된 열에 사용할 값을 나타냅니다.

  4. ==============================

    4.이것은 다소 오래된 질문이지만 scikit learn API 사용을 목표로한다면 다음 DummyEncoder 클래스를 사용할 수 있습니다. https://gist.github.com/psinger/ef4592492dc8edf101130f0bf32f5ff9

    이것은 다소 오래된 질문이지만 scikit learn API 사용을 목표로한다면 다음 DummyEncoder 클래스를 사용할 수 있습니다. https://gist.github.com/psinger/ef4592492dc8edf101130f0bf32f5ff9

    그것이하는 일은 카테고리 dtype을 사용하여 생성 할 더미를 지정하는 것입니다. 열차와 테스트 세트에서 서로 다른 레벨의 파이프 라인에 더미 생성

  5. from https://stackoverflow.com/questions/41335718/keep-same-dummy-variable-in-training-and-testing-data by cc-by-sa and MIT license