Несоответствие функций: Прогнозирование с помощью конвейера scikit-learn

#python #scikit-learn #scikit-learn-pipeline

Вопрос:

Я реализовал следующий конвейер scikit-learn внутри файла с именем build.py и позже успешно его обработал.

 preprocessor = ColumnTransformer(transformers=[
        ('target', TargetEncoder(), COL_TO_TARGET),
        ('one_hot', OneHotEncoder(drop_invariant=False, handle_missing='value',
              handle_unknown='value', return_df=True, use_cat_names=True,
              verbose=0), COL_TO_DUM),
        ('construction', OrdinalEncoder(mapping=mapping),['ConstructionPeriod'])
      ], remainder='passthrough')

test_pipeline = Pipeline(steps=[
            ('preprocessor', preprocessor),
            ('std_scale', StandardScaler()),
            ('XGB_model', 
                xgb.XGBRegressor(
                    booster = 'gbtree', colsample_bylevel=0.75,colsample_bytree=0.75,
                    max_depth = 20,grow_policy = 'depthwise',learning_rate = 0.1
                 )
             )
        ])
test_pipeline.fit(X_train, y_train)

import pickle
pickle.dump(open('final_pipeline.pkl','wb'), test_pipeline)

 

Затем маринованный конвейер считывается в другой файл app.py , который принимает пользовательские данные для составления прогнозов с помощью неочищенного конвейера.

 pipeline = pickle.load(open('final_pipeline.pkl', 'rb'))

# data is the coming from the user via frontend
input_df = pd.DataFrame(data.dict(), index=[0])

# using the pipeline to predict 
prediction = pipeline.predict(input_df)
 

Проблема, с которой я сталкиваюсь, заключается в том, что непроверенный конвейер ожидает, что входящие тестовые данные будут иметь структуру столбцов, аналогичную той, которая используется для обучения конвейера (X_train).
Ошибка Функции

Чтобы решить эту проблему, мне нужно упорядочить столбцы входящих тестовых данных, чтобы они соответствовали столбцам X_train.

  • Грязное решение, экспортируйте имена столбцов X_train в файл, а затем прочитайте его внутри app.py , чтобы изменить порядок столбцов входящих тестовых данных.

Есть какие-нибудь предложения о том, как питонически решить эту проблему?

Ответ №1:

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

df = df.reindex(sorted(df.columns), axis=1)

Комментарии:

1. Спасибо, что ответили. Я посмотрел и нашел много статей, в которых упоминалась аналогичная проблема. Причина, по которой порядок объектов важен, заключается в том, что конвейер преобразует пространство объектов в матрицу, и, следовательно, метки устаревают. Твоя идея сработала для меня.