Я застрял с этой ошибкой, я понимаю ее значение, но не знаю, как с ней бороться.
Вот что я делаю:
class PreProcessing(BaseEstimator, TransformerMixin):
def __init__(self):
pass
def transform(self, df):
#Here i select the features and transform them for exemple:
age_band=0
if age<=10
age_band=1
else #... etc to 90
age_band=9
....
other feature engineering
....
encoder = ce.BinaryEncoder(cols=selectedCols)
encoder.fit(df)
df = encoder.transform(df)
return df.as_matrix()
def fit(self, df, y=None, **fit_params):
return self
pipe = make_pipeline(PreProcessing(),
SelectKBest(f_classif,k=23),
RandomForestClassifier())
param_grid = {"randomforestclassifier__n_estimators" : [100,400],
"randomforestclassifier__max_depth" : [None],
"randomforestclassifier__max_leaf_nodes": [2,3,5],
"randomforestclassifier__min_samples_leaf":[3,5,8],
"randomforestclassifier__class_weight":['balanced'],
"randomforestclassifier__n_jobs":[-1]
}
grid_search = GridSearchCV(pipe,param_grid,cv=5,scoring='recall',verbose=1,n_jobs=15)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
grid_search.fit(X_train,y_train)
grid_search.predict(X_test)
filename = 'myModel.pk'
with open(filename, 'wb') as file:
pickle.dump(grid_search, file)
Так что здесь все работает как шарм. Но с данными реального мира: (не файлы тестов поезда)
modelfile = 'MyModel.pk'
with open(modelfile,'rb') as f:
loaded_model = pickle.load(f)
print("The model has been loaded...doing predictions now...")
predictions = loaded_model.predict(df)
Я получил ошибку: ValueError: X имеет другую форму, чем при подгонке.
Я понимаю, что не все модальности представлены в моем «реальном файле», потому что представьте, что в моем файле поезда у меня есть столбец «пара» со значениями «да, нет, я не знаю», тогда ce.BinaryEncoder создаст столько столбцов, сколько необходимо для хранения всех модальностей в двоичном формате. Но в моем реальном жизненном файле, который я должен делать прогнозы, у меня есть только для этих "парных" значений столбца "да, нет" Итак, в конце X не имеет той же формы, что и во время подгонки ... Итак, единственный то, что я предполагаю сделать, - это создать в PreProcessing все отсутствующие модальности со значением cols 0 ...
Думаю, что-то упускаю.
Примечание: обучающие и тестовые файлы взяты из определенного источника данных. Данные, которые мне нужно предсказать, взяты из другого источника, поэтому я сначала "преобразую" реальные данные в тот же формат X_train / Test, а затем выполняю model.predit (df). Итак, я уверен, что до BinaryEncoder у меня такое же количество столбцов (17) в Preprocessing.transform (), но после BinaryEncoder выполняется, если я регистрирую форму df во время работы model.predict (X_test) показывает, что df составляет 41 столбец, а в model.predict (realData) только 31 столбец.