#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. Спасибо, что ответили. Я посмотрел и нашел много статей, в которых упоминалась аналогичная проблема. Причина, по которой порядок объектов важен, заключается в том, что конвейер преобразует пространство объектов в матрицу, и, следовательно, метки устаревают. Твоя идея сработала для меня.