В основном я следовал этому руководству, чтобы построить «объединение средств восстановления»: https://stats.stackexchange.com/questions/139042/ensemble-of-different-kinds-of-regressors-using-scikit-learn-or-any-other-pytho
Я хочу построить оценщик, который отдельно обучает регрессионную модель кернального гребня и линейный гребень модель регрессии на обучающем множестве, и для каждого входного вектора она предсказывает два результата из модели регрессии кернального гребня и модели линейной регрессии гребня и линейно объединяет эти два результата в качестве конечного результата
Итак, во-первых, я построил два трансформаторы:
from sklearn.base import TransformerMixin
from sklearn.pipeline import Pipeline, FeatureUnion
import sklearn.linear_model as lr
import sklearn.kernel_ridge as kr
class LRRt(lr.Ridge,TransformerMixin):
def transform(self, X, *_):
return self.predict(X)
class KRRt(kr.KernelRidge,TransformerMixin):
def transform(self, X, *_):
return self.predict(X)
А затем объедините их вместе и сформируйте новую модель:
def builder():
model_set = FeatureUnion(
[
('lrr', LRRt()),
('krr', KRRt())
],
)
model = Pipeline(steps=[
('model_set', model_set),
('linear_layer', lr.LinearRegression())
])
return model
model = builder()
model.fit(x_train,y_train)
Но когда я пытался соответствовать модели, я получил сообщение об ошибке, сказав, что модель LinearRegression ( который является последним слоем в конвейере) ожидаемый двумерный массив, вместо него получен одномерный массив. Поэтому я проверил вывод "model_set":
model_set = FeatureUnion(
[
('lrr', LRRt()),
('krr', KRRt())
],
)
model_set.fit(x_train,y_train)
model_set.transform(x_test).shape
Количество строк моих тестовых данных составляет 5509, что означает, что форма вывода model_set должна быть (5509,2), но реальная форма это вывод (11018,). По всей видимости, FeatureUnion объединяет результаты двух моделей в одномерный массив, из-за чего слой LinearRegression не может работать.
Но вопрос в том, как мы могли сделать шаг «изменения формы» в конвейере до шага линейной регрессии? Все вещи в конвейере должны быть Transformer, и нет никакого трансформатора, способного сделать что-то вроде np.reshape