Как бороться с вменением и горячим кодированием в пандах? - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь применить к моему набору данных как условное, так и горячее кодирование.Я знаю, что при применении вменения размер данных может измениться, поэтому я позаботился об этом вручную.Модель работала нормально, но потом я решил применить горячую кодировку.И теперь программа не компилируется.Я получаю ошибку несоответствия размеров.

test_X = pd.get_dummies(test)
train_X = pd.get_dummies(train)

col_with_missingVal = (col for col in train_X.columns if train_X[col].isnull().any())
for col in col_with_missingVal:
    train_X[col + 'is_missing'] = train_X[col].isnull()
    test_X[col + 'is_missing'] = test_X[col].isnull()

#impute the data
imputer = Imputer()
imp_train_X = pd.DataFrame(imputer.fit_transform(train_X))
imp_test_X = pd.DataFrame(imputer.fit_transform(test_X))
imp_train_X.columns = train_X.columns
imp_test_X.columns = test_X.columns

#Fit the model
my_model = RandomForestRegressor()
my_model.fit(imp_train_X, train_y)

# Use the model to make predictions
predicted_prices = my_model.predict(imp_test_X) 

В последней строке кода появляется следующая ошибка:

ValueError: Number of features of the model must match the input. Model n_features is 293 and input n_features is 274

В чем причина этой ошибки и как это можно сделатьбыть исправленным?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Я боролся с подобной проблемой, и я нашел подход, который мог бы помочь в этой ситуации.

Основная идея - изменить тип столбца, чтобы сделать его категоричным, когда выработа с полным набором данных.Делаем что-то вроде этого:

dataframe[column] = dataframe[column].astype('category')

Когда вы сделаете это, в столбце информационного кадра будут сохранены все доступные категории.Позже, когда вы выполните разделение данных по поездам / тестам, категории будут сохранены, даже если значения не будут представлены ни в одном наборе данных.

Функция Pandas get_dummies использует категории столбца для выполнения кодирования.Поскольку категории стабильны, вы всегда получите одинаковое количество столбцов после кодирования.

Я сам исследую это решение.Имейте в виду, что вы можете манипулировать категориями напрямую в случае необходимости.Вы можете использовать что-то вроде этого

dataframe [column] .cat.set_categories ([.....])

0 голосов
/ 21 мая 2018

Проблема в первых двух строках.pd.get_dummies() вернет разные столбцы для поезда и проверит, отличаются ли данные в них.

Например, если в поезде столбец имеет 3 категории, для них будет создано 3 столбца, но может случиться, что данные теста содержат только 2 категории в этом конкретном столбце, в результате чего вы получите 2 столбца.после pd.get_dummies().Что приведет к разному количеству столбцов.

Здесь можно сделать несколько вещей:

1) Самый простой Использовать pd.get_dummies() для всех данных.перед поездом тест разделяют, а затем разделяют данные.Но это не рекомендуется, потому что он передает информацию о тестовых данных в модель.

2) Если вы можете использовать разрабатываемую версию scikit, используйте CategoryoricalEncoder для выполнения горячего кодирования.

3) Используйте комбинацию LabelEncoder + OneHotEncoder в текущей версии Scikit для достижения того же.См., Например, мой другой ответ .

Примечание

Также звоните только transform() на тестовых данных, но не fit().Сделайте это: -

# If you call fit_transform(), the imputer will again learn the 
# new mean from the test data
# Which will lead to differences and data leakage.
imp_test_X = pd.DataFrame(imputer.transform(test_X))
...