У меня есть простая модель с конвейером с использованием ColumnTransformer
. Я могу обучить модель и сохранить модель как рассол
Когда я загружаю рассол и прогнозирую в режиме реального времениданные, я получил следующую ошибку относительно ColumnTransformer
Порядок столбцов должен быть одинаковым для подгонки и для преобразования при использовании ключевого слова остатка
Учебные данные и данные, используемые для прогнозирования, имеют точно одинаковое числостолбца, например, 50. Я не уверен, как «порядок» столбца мог измениться.
Почему порядок столбца важен для columntransformer? Как это исправить? Есть ли способ обеспечить "упорядочение" после запуска преобразователя столбца?
Спасибо.
pipeline = Pipeline([
('RepalceInf', ReplaceInf()),
('impute_30_100', ColumnTransformer(
[
('oneStdNorm', OneStdImputer(), self.cont_feature_strategy_dict['FEATS_30_100']),
],
remainder='passthrough'
)),
('regress_impute', IterativeImputer(random_state=0, estimator=self.cont_estimator)),
('replace_outlier', OutlierReplacer(quantile_range=(1, 99))),
('scaler', StandardScaler(with_mean=True))
])
class OneStdImputer(TransformerMixin, BaseEstimator):
def __init__(self):
"""
Impute the missing data with random value in the range of mean +/- one standard deviation
This is a simplified implementation without sparse/dense fit and check.
"""
self.mean = None
self.std = None
def fit(self, X, y=None):
self.mean = X.mean()
self.std = X.std()
return self
def transform(self, X):
# X_imp = X.fillna(np.random.randint()*2*self.std+self.mean-self.std)
for col in X:
self._fill_randnorm(X[col], col)
return X
def _fill_randnorm(self, df, col):
val = df.values
mask = np.isnan(df)
mu, sigma = self.mean[col], self.std[col]
val[mask] = np.random.normal(mu, sigma, size=mask.sum())
return df