Как справиться с различиями в функциях моих тренировочных и тестовых данных

Итак, в настоящее время мои наборы для обучения и тестирования начинаются с 669 функций, многие из которых являются категориальными и требуют быстрого кодирования.

После однократного кодирования обоих наборов я обнаружил, что обучающий набор имеет дополнительные функции.

Я не совсем уверен, как с этим справиться, но у меня есть три варианта:

  1. Удалите эти функции из обучающего набора, чтобы оба совпадали
  2. Добавьте эти функции в набор тестов и получите синтетические данные.
  3. Прежде чем я обучу свою модель, воспользуйтесь какой-нибудь техникой уменьшения размерности (PCA) и используйте то же количество компонентов для обучения и тестирования.

Любая обратная связь будет очень признательна.


person madsthaks    schedule 13.10.2017    source источник


Ответы (2)


Я думаю, что вы выполняли горячее кодирование данных Train & Test отдельно. Возможно, объедините их, а затем примените кодировку или попробуйте pandas.get_dummies на них отдельно и используйте следующий код симметричную разницу для наборов, чтобы получить различия, а затем присвоить 0 для отсутствующих столбцов.

    missing_cols = (set(train.columns)).symmetric_difference(set(test.columns))
    for c in missing_cols:
         titanic_test[c] = 0
person Mehdi    schedule 13.10.2017
comment
Горячее кодирование должно выполняться отдельно в наборе для поезда и тестирования, так как вы не знаете о тестовом наборе / экземпляре. - person Harshit Mehta; 28.08.2018

Создавайте манекены отдельно для тренировочного и тестового набора. Исключите функции, которые находятся в тестировании, но не входят в обучающий набор, поскольку они не используются в обучении. Включите функции, которые есть в обучающем наборе, но не в тестовом наборе, и заполните соответствующие им данные, используя "среднее", "медианное", "режим" обучающего набора или ноль.

Примерно так можно сделать:

Xdummies=pd.get_dummies(X,drop_first=True)
features=Xdummies.columns
xtest=pd.get_dummies(Xhold,drop_first=True)
test_feat=xtest.columns
exclude=list(set(test_feat)-set(features))
include=list(set(features)-set(test_feat))
Xtest=pd.concat([xtest.drop(exclude,axis=1).reset_index(drop=True),pd.DataFrame(index=range(0,xtest.shape[0]),data=0,columns=include).reset_index(drop=True)],axis=1)
person Harshit Mehta    schedule 28.08.2018